linux/include/net/ax25.h

/* SPDX-License-Identifier: GPL-2.0 */
/*
 *	Declarations of AX.25 type objects.
 *
 *	Alan Cox (GW4PTS) 	10/11/93
 */
#ifndef _AX25_H
#define _AX25_H 

#include <linux/ax25.h>
#include <linux/spinlock.h>
#include <linux/timer.h>
#include <linux/list.h>
#include <linux/slab.h>
#include <linux/refcount.h>
#include <net/neighbour.h>
#include <net/sock.h>
#include <linux/seq_file.h>

#define AX25_T1CLAMPLO
#define AX25_T1CLAMPHI

#define AX25_BPQ_HEADER_LEN
#define AX25_KISS_HEADER_LEN

#define AX25_HEADER_LEN
#define AX25_ADDR_LEN
#define AX25_DIGI_HEADER_LEN
#define AX25_MAX_HEADER_LEN

/* AX.25 Protocol IDs */
#define AX25_P_ROSE
#define AX25_P_VJCOMP
						/* Van Jacobsen (RFC 1144)    */
#define AX25_P_VJUNCOMP
						/* Van Jacobsen (RFC 1144)    */
#define AX25_P_SEGMENT
#define AX25_P_TEXNET
#define AX25_P_LQ
#define AX25_P_ATALK
#define AX25_P_ATALK_ARP
#define AX25_P_IP
#define AX25_P_ARP
#define AX25_P_FLEXNET
#define AX25_P_NETROM
#define AX25_P_TEXT

/* AX.25 Segment control values */
#define AX25_SEG_REM
#define AX25_SEG_FIRST

#define AX25_CBIT
#define AX25_EBIT
#define AX25_HBIT

#define AX25_SSSID_SPARE
#define AX25_ESSID_SPARE
#define AX25_DAMA_FLAG

#define AX25_COND_ACK_PENDING
#define AX25_COND_REJECT
#define AX25_COND_PEER_RX_BUSY
#define AX25_COND_OWN_RX_BUSY
#define AX25_COND_DAMA_MODE

#ifndef _LINUX_NETDEVICE_H
#include <linux/netdevice.h>
#endif

/* Upper sub-layer (LAPB) definitions */

/* Control field templates */
#define AX25_I
#define AX25_S
#define AX25_RR
#define AX25_RNR
#define AX25_REJ
#define AX25_U
#define AX25_SABM
#define AX25_SABME
#define AX25_DISC
#define AX25_DM
#define AX25_UA
#define AX25_FRMR
#define AX25_UI
#define AX25_XID
#define AX25_TEST

#define AX25_PF
#define AX25_EPF

#define AX25_ILLEGAL

#define AX25_POLLOFF
#define AX25_POLLON

/* AX25 L2 C-bit */
#define AX25_COMMAND
#define AX25_RESPONSE

/* Define Link State constants. */

enum {};

#define AX25_MODULUS
#define AX25_EMODULUS

enum {};

enum {};

#define AX25_DEF_IPDEFMODE
#define AX25_DEF_AXDEFMODE
#define AX25_DEF_BACKOFF
#define AX25_DEF_CONMODE
#define AX25_DEF_WINDOW
#define AX25_DEF_EWINDOW
#define AX25_DEF_T1
#define AX25_DEF_T2
#define AX25_DEF_T3
#define AX25_DEF_N2
#define AX25_DEF_IDLE
#define AX25_DEF_PACLEN
#define AX25_DEF_PROTOCOL
#define AX25_DEF_DS_TIMEOUT

ax25_uid_assoc;

#define ax25_uid_for_each(__ax25, list)

#define ax25_uid_hold(ax25)

static inline void ax25_uid_put(ax25_uid_assoc *assoc)
{}

ax25_digi;

ax25_route;

void __ax25_put_route(ax25_route *ax25_rt);

extern rwlock_t ax25_route_lock;

static inline void ax25_route_lock_use(void)
{}

static inline void ax25_route_lock_unuse(void)
{}

ax25_dama_info;

struct ctl_table;

ax25_dev;

ax25_cb;

struct ax25_sock {};

#define ax25_sk(ptr)

static inline struct ax25_cb *sk_to_ax25(const struct sock *sk)
{}

#define ax25_for_each(__ax25, list)

#define ax25_cb_hold(__ax25)

static __inline__ void ax25_cb_put(ax25_cb *ax25)
{}

static inline void ax25_dev_hold(ax25_dev *ax25_dev)
{}

static inline void ax25_dev_put(ax25_dev *ax25_dev)
{}
static inline __be16 ax25_type_trans(struct sk_buff *skb, struct net_device *dev)
{}

/* af_ax25.c */
extern struct hlist_head ax25_list;
extern spinlock_t ax25_list_lock;
void ax25_cb_add(ax25_cb *);
struct sock *ax25_find_listener(ax25_address *, int, struct net_device *, int);
struct sock *ax25_get_socket(ax25_address *, ax25_address *, int);
ax25_cb *ax25_find_cb(const ax25_address *, ax25_address *, ax25_digi *,
		      struct net_device *);
void ax25_send_to_raw(ax25_address *, struct sk_buff *, int);
void ax25_destroy_socket(ax25_cb *);
ax25_cb * __must_check ax25_create_cb(void);
void ax25_fillin_cb(ax25_cb *, ax25_dev *);
struct sock *ax25_make_new(struct sock *, struct ax25_dev *);

/* ax25_addr.c */
extern const ax25_address ax25_bcast;
extern const ax25_address ax25_defaddr;
extern const ax25_address null_ax25_address;
char *ax2asc(char *buf, const ax25_address *);
void asc2ax(ax25_address *addr, const char *callsign);
int ax25cmp(const ax25_address *, const ax25_address *);
int ax25digicmp(const ax25_digi *, const ax25_digi *);
const unsigned char *ax25_addr_parse(const unsigned char *, int,
	ax25_address *, ax25_address *, ax25_digi *, int *, int *);
int ax25_addr_build(unsigned char *, const ax25_address *,
		    const ax25_address *, const ax25_digi *, int, int);
int ax25_addr_size(const ax25_digi *);
void ax25_digi_invert(const ax25_digi *, ax25_digi *);

/* ax25_dev.c */
extern spinlock_t ax25_dev_lock;

#if IS_ENABLED(CONFIG_AX25)
static inline ax25_dev *ax25_dev_ax25dev(struct net_device *dev)
{}
#endif

ax25_dev *ax25_addr_ax25dev(ax25_address *);
void ax25_dev_device_up(struct net_device *);
void ax25_dev_device_down(struct net_device *);
int ax25_fwd_ioctl(unsigned int, struct ax25_fwd_struct *);
struct net_device *ax25_fwd_dev(struct net_device *);
void ax25_dev_free(void);

/* ax25_ds_in.c */
int ax25_ds_frame_in(ax25_cb *, struct sk_buff *, int);

/* ax25_ds_subr.c */
void ax25_ds_nr_error_recovery(ax25_cb *);
void ax25_ds_enquiry_response(ax25_cb *);
void ax25_ds_establish_data_link(ax25_cb *);
void ax25_dev_dama_off(ax25_dev *);
void ax25_dama_on(ax25_cb *);
void ax25_dama_off(ax25_cb *);

/* ax25_ds_timer.c */
void ax25_ds_setup_timer(ax25_dev *);
void ax25_ds_set_timer(ax25_dev *);
void ax25_ds_del_timer(ax25_dev *);
void ax25_ds_timer(ax25_cb *);
void ax25_ds_t1_timeout(ax25_cb *);
void ax25_ds_heartbeat_expiry(ax25_cb *);
void ax25_ds_t3timer_expiry(ax25_cb *);
void ax25_ds_idletimer_expiry(ax25_cb *);

/* ax25_iface.c */

struct ax25_protocol {};

void ax25_register_pid(struct ax25_protocol *ap);
void ax25_protocol_release(unsigned int);

struct ax25_linkfail {};

void ax25_linkfail_register(struct ax25_linkfail *lf);
void ax25_linkfail_release(struct ax25_linkfail *lf);
int __must_check ax25_listen_register(const ax25_address *,
				      struct net_device *);
void ax25_listen_release(const ax25_address *, struct net_device *);
int(*ax25_protocol_function(unsigned int))(struct sk_buff *, ax25_cb *);
int ax25_listen_mine(const ax25_address *, struct net_device *);
void ax25_link_failed(ax25_cb *, int);
int ax25_protocol_is_registered(unsigned int);

/* ax25_in.c */
int ax25_rx_iframe(ax25_cb *, struct sk_buff *);
int ax25_kiss_rcv(struct sk_buff *, struct net_device *, struct packet_type *,
		  struct net_device *);

/* ax25_ip.c */
netdev_tx_t ax25_ip_xmit(struct sk_buff *skb);
extern const struct header_ops ax25_header_ops;

/* ax25_out.c */
ax25_cb *ax25_send_frame(struct sk_buff *, int, const ax25_address *,
			 ax25_address *, ax25_digi *, struct net_device *);
void ax25_output(ax25_cb *, int, struct sk_buff *);
void ax25_kick(ax25_cb *);
void ax25_transmit_buffer(ax25_cb *, struct sk_buff *, int);
void ax25_queue_xmit(struct sk_buff *skb, struct net_device *dev);
int ax25_check_iframes_acked(ax25_cb *, unsigned short);

/* ax25_route.c */
void ax25_rt_device_down(struct net_device *);
int ax25_rt_ioctl(unsigned int, void __user *);
extern const struct seq_operations ax25_rt_seqops;
ax25_route *ax25_get_route(ax25_address *addr, struct net_device *dev);
int ax25_rt_autobind(ax25_cb *, ax25_address *);
struct sk_buff *ax25_rt_build_path(struct sk_buff *, ax25_address *,
				   ax25_address *, ax25_digi *);
void ax25_rt_free(void);

/* ax25_std_in.c */
int ax25_std_frame_in(ax25_cb *, struct sk_buff *, int);

/* ax25_std_subr.c */
void ax25_std_nr_error_recovery(ax25_cb *);
void ax25_std_establish_data_link(ax25_cb *);
void ax25_std_transmit_enquiry(ax25_cb *);
void ax25_std_enquiry_response(ax25_cb *);
void ax25_std_timeout_response(ax25_cb *);

/* ax25_std_timer.c */
void ax25_std_heartbeat_expiry(ax25_cb *);
void ax25_std_t1timer_expiry(ax25_cb *);
void ax25_std_t2timer_expiry(ax25_cb *);
void ax25_std_t3timer_expiry(ax25_cb *);
void ax25_std_idletimer_expiry(ax25_cb *);

/* ax25_subr.c */
void ax25_clear_queues(ax25_cb *);
void ax25_frames_acked(ax25_cb *, unsigned short);
void ax25_requeue_frames(ax25_cb *);
int ax25_validate_nr(ax25_cb *, unsigned short);
int ax25_decode(ax25_cb *, struct sk_buff *, int *, int *, int *);
void ax25_send_control(ax25_cb *, int, int, int);
void ax25_return_dm(struct net_device *, ax25_address *, ax25_address *,
		    ax25_digi *);
void ax25_calculate_t1(ax25_cb *);
void ax25_calculate_rtt(ax25_cb *);
void ax25_disconnect(ax25_cb *, int);

/* ax25_timer.c */
void ax25_setup_timers(ax25_cb *);
void ax25_start_heartbeat(ax25_cb *);
void ax25_start_t1timer(ax25_cb *);
void ax25_start_t2timer(ax25_cb *);
void ax25_start_t3timer(ax25_cb *);
void ax25_start_idletimer(ax25_cb *);
void ax25_stop_heartbeat(ax25_cb *);
void ax25_stop_t1timer(ax25_cb *);
void ax25_stop_t2timer(ax25_cb *);
void ax25_stop_t3timer(ax25_cb *);
void ax25_stop_idletimer(ax25_cb *);
int ax25_t1timer_running(ax25_cb *);
unsigned long ax25_display_timer(struct timer_list *);

/* ax25_uid.c */
extern int  ax25_uid_policy;
ax25_uid_assoc *ax25_findbyuid(kuid_t);
int __must_check ax25_uid_ioctl(int, struct sockaddr_ax25 *);
extern const struct seq_operations ax25_uid_seqops;
void ax25_uid_free(void);

/* sysctl_net_ax25.c */
#ifdef CONFIG_SYSCTL
int ax25_register_dev_sysctl(ax25_dev *ax25_dev);
void ax25_unregister_dev_sysctl(ax25_dev *ax25_dev);
#else
static inline int ax25_register_dev_sysctl(ax25_dev *ax25_dev) { return 0; }
static inline void ax25_unregister_dev_sysctl(ax25_dev *ax25_dev) {}
#endif /* CONFIG_SYSCTL */

#endif