162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Declarations of AX.25 type objects. 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Alan Cox (GW4PTS) 10/11/93 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci#ifndef _AX25_H 862306a36Sopenharmony_ci#define _AX25_H 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include <linux/ax25.h> 1162306a36Sopenharmony_ci#include <linux/spinlock.h> 1262306a36Sopenharmony_ci#include <linux/timer.h> 1362306a36Sopenharmony_ci#include <linux/list.h> 1462306a36Sopenharmony_ci#include <linux/slab.h> 1562306a36Sopenharmony_ci#include <linux/refcount.h> 1662306a36Sopenharmony_ci#include <net/neighbour.h> 1762306a36Sopenharmony_ci#include <net/sock.h> 1862306a36Sopenharmony_ci#include <linux/seq_file.h> 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci#define AX25_T1CLAMPLO 1 2162306a36Sopenharmony_ci#define AX25_T1CLAMPHI (30 * HZ) 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci#define AX25_BPQ_HEADER_LEN 16 2462306a36Sopenharmony_ci#define AX25_KISS_HEADER_LEN 1 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci#define AX25_HEADER_LEN 17 2762306a36Sopenharmony_ci#define AX25_ADDR_LEN 7 2862306a36Sopenharmony_ci#define AX25_DIGI_HEADER_LEN (AX25_MAX_DIGIS * AX25_ADDR_LEN) 2962306a36Sopenharmony_ci#define AX25_MAX_HEADER_LEN (AX25_HEADER_LEN + AX25_DIGI_HEADER_LEN) 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci/* AX.25 Protocol IDs */ 3262306a36Sopenharmony_ci#define AX25_P_ROSE 0x01 3362306a36Sopenharmony_ci#define AX25_P_VJCOMP 0x06 /* Compressed TCP/IP packet */ 3462306a36Sopenharmony_ci /* Van Jacobsen (RFC 1144) */ 3562306a36Sopenharmony_ci#define AX25_P_VJUNCOMP 0x07 /* Uncompressed TCP/IP packet */ 3662306a36Sopenharmony_ci /* Van Jacobsen (RFC 1144) */ 3762306a36Sopenharmony_ci#define AX25_P_SEGMENT 0x08 /* Segmentation fragment */ 3862306a36Sopenharmony_ci#define AX25_P_TEXNET 0xc3 /* TEXTNET datagram protocol */ 3962306a36Sopenharmony_ci#define AX25_P_LQ 0xc4 /* Link Quality Protocol */ 4062306a36Sopenharmony_ci#define AX25_P_ATALK 0xca /* Appletalk */ 4162306a36Sopenharmony_ci#define AX25_P_ATALK_ARP 0xcb /* Appletalk ARP */ 4262306a36Sopenharmony_ci#define AX25_P_IP 0xcc /* ARPA Internet Protocol */ 4362306a36Sopenharmony_ci#define AX25_P_ARP 0xcd /* ARPA Address Resolution */ 4462306a36Sopenharmony_ci#define AX25_P_FLEXNET 0xce /* FlexNet */ 4562306a36Sopenharmony_ci#define AX25_P_NETROM 0xcf /* NET/ROM */ 4662306a36Sopenharmony_ci#define AX25_P_TEXT 0xF0 /* No layer 3 protocol impl. */ 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci/* AX.25 Segment control values */ 4962306a36Sopenharmony_ci#define AX25_SEG_REM 0x7F 5062306a36Sopenharmony_ci#define AX25_SEG_FIRST 0x80 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci#define AX25_CBIT 0x80 /* Command/Response bit */ 5362306a36Sopenharmony_ci#define AX25_EBIT 0x01 /* HDLC Address Extension bit */ 5462306a36Sopenharmony_ci#define AX25_HBIT 0x80 /* Has been repeated bit */ 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ci#define AX25_SSSID_SPARE 0x60 /* Unused bits in SSID for standard AX.25 */ 5762306a36Sopenharmony_ci#define AX25_ESSID_SPARE 0x20 /* Unused bits in SSID for extended AX.25 */ 5862306a36Sopenharmony_ci#define AX25_DAMA_FLAG 0x20 /* Well, it is *NOT* unused! (dl1bke 951121 */ 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci#define AX25_COND_ACK_PENDING 0x01 6162306a36Sopenharmony_ci#define AX25_COND_REJECT 0x02 6262306a36Sopenharmony_ci#define AX25_COND_PEER_RX_BUSY 0x04 6362306a36Sopenharmony_ci#define AX25_COND_OWN_RX_BUSY 0x08 6462306a36Sopenharmony_ci#define AX25_COND_DAMA_MODE 0x10 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci#ifndef _LINUX_NETDEVICE_H 6762306a36Sopenharmony_ci#include <linux/netdevice.h> 6862306a36Sopenharmony_ci#endif 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ci/* Upper sub-layer (LAPB) definitions */ 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci/* Control field templates */ 7362306a36Sopenharmony_ci#define AX25_I 0x00 /* Information frames */ 7462306a36Sopenharmony_ci#define AX25_S 0x01 /* Supervisory frames */ 7562306a36Sopenharmony_ci#define AX25_RR 0x01 /* Receiver ready */ 7662306a36Sopenharmony_ci#define AX25_RNR 0x05 /* Receiver not ready */ 7762306a36Sopenharmony_ci#define AX25_REJ 0x09 /* Reject */ 7862306a36Sopenharmony_ci#define AX25_U 0x03 /* Unnumbered frames */ 7962306a36Sopenharmony_ci#define AX25_SABM 0x2f /* Set Asynchronous Balanced Mode */ 8062306a36Sopenharmony_ci#define AX25_SABME 0x6f /* Set Asynchronous Balanced Mode Extended */ 8162306a36Sopenharmony_ci#define AX25_DISC 0x43 /* Disconnect */ 8262306a36Sopenharmony_ci#define AX25_DM 0x0f /* Disconnected mode */ 8362306a36Sopenharmony_ci#define AX25_UA 0x63 /* Unnumbered acknowledge */ 8462306a36Sopenharmony_ci#define AX25_FRMR 0x87 /* Frame reject */ 8562306a36Sopenharmony_ci#define AX25_UI 0x03 /* Unnumbered information */ 8662306a36Sopenharmony_ci#define AX25_XID 0xaf /* Exchange information */ 8762306a36Sopenharmony_ci#define AX25_TEST 0xe3 /* Test */ 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_ci#define AX25_PF 0x10 /* Poll/final bit for standard AX.25 */ 9062306a36Sopenharmony_ci#define AX25_EPF 0x01 /* Poll/final bit for extended AX.25 */ 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ci#define AX25_ILLEGAL 0x100 /* Impossible to be a real frame type */ 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_ci#define AX25_POLLOFF 0 9562306a36Sopenharmony_ci#define AX25_POLLON 1 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ci/* AX25 L2 C-bit */ 9862306a36Sopenharmony_ci#define AX25_COMMAND 1 9962306a36Sopenharmony_ci#define AX25_RESPONSE 2 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_ci/* Define Link State constants. */ 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_cienum { 10462306a36Sopenharmony_ci AX25_STATE_0, /* Listening */ 10562306a36Sopenharmony_ci AX25_STATE_1, /* SABM sent */ 10662306a36Sopenharmony_ci AX25_STATE_2, /* DISC sent */ 10762306a36Sopenharmony_ci AX25_STATE_3, /* Established */ 10862306a36Sopenharmony_ci AX25_STATE_4 /* Recovery */ 10962306a36Sopenharmony_ci}; 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_ci#define AX25_MODULUS 8 /* Standard AX.25 modulus */ 11262306a36Sopenharmony_ci#define AX25_EMODULUS 128 /* Extended AX.25 modulus */ 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_cienum { 11562306a36Sopenharmony_ci AX25_PROTO_STD_SIMPLEX, 11662306a36Sopenharmony_ci AX25_PROTO_STD_DUPLEX, 11762306a36Sopenharmony_ci#ifdef CONFIG_AX25_DAMA_SLAVE 11862306a36Sopenharmony_ci AX25_PROTO_DAMA_SLAVE, 11962306a36Sopenharmony_ci#ifdef CONFIG_AX25_DAMA_MASTER 12062306a36Sopenharmony_ci AX25_PROTO_DAMA_MASTER, 12162306a36Sopenharmony_ci#define AX25_PROTO_MAX AX25_PROTO_DAMA_MASTER 12262306a36Sopenharmony_ci#endif 12362306a36Sopenharmony_ci#endif 12462306a36Sopenharmony_ci __AX25_PROTO_MAX, 12562306a36Sopenharmony_ci AX25_PROTO_MAX = __AX25_PROTO_MAX -1 12662306a36Sopenharmony_ci}; 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_cienum { 12962306a36Sopenharmony_ci AX25_VALUES_IPDEFMODE, /* 0=DG 1=VC */ 13062306a36Sopenharmony_ci AX25_VALUES_AXDEFMODE, /* 0=Normal 1=Extended Seq Nos */ 13162306a36Sopenharmony_ci AX25_VALUES_BACKOFF, /* 0=None 1=Linear 2=Exponential */ 13262306a36Sopenharmony_ci AX25_VALUES_CONMODE, /* Allow connected modes - 0=No 1=no "PID text" 2=all PIDs */ 13362306a36Sopenharmony_ci AX25_VALUES_WINDOW, /* Default window size for standard AX.25 */ 13462306a36Sopenharmony_ci AX25_VALUES_EWINDOW, /* Default window size for extended AX.25 */ 13562306a36Sopenharmony_ci AX25_VALUES_T1, /* Default T1 timeout value */ 13662306a36Sopenharmony_ci AX25_VALUES_T2, /* Default T2 timeout value */ 13762306a36Sopenharmony_ci AX25_VALUES_T3, /* Default T3 timeout value */ 13862306a36Sopenharmony_ci AX25_VALUES_IDLE, /* Connected mode idle timer */ 13962306a36Sopenharmony_ci AX25_VALUES_N2, /* Default N2 value */ 14062306a36Sopenharmony_ci AX25_VALUES_PACLEN, /* AX.25 MTU */ 14162306a36Sopenharmony_ci AX25_VALUES_PROTOCOL, /* Std AX.25, DAMA Slave, DAMA Master */ 14262306a36Sopenharmony_ci AX25_VALUES_DS_TIMEOUT, /* DAMA Slave timeout */ 14362306a36Sopenharmony_ci AX25_MAX_VALUES /* THIS MUST REMAIN THE LAST ENTRY OF THIS LIST */ 14462306a36Sopenharmony_ci}; 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_ci#define AX25_DEF_IPDEFMODE 0 /* Datagram */ 14762306a36Sopenharmony_ci#define AX25_DEF_AXDEFMODE 0 /* Normal */ 14862306a36Sopenharmony_ci#define AX25_DEF_BACKOFF 1 /* Linear backoff */ 14962306a36Sopenharmony_ci#define AX25_DEF_CONMODE 2 /* Connected mode allowed */ 15062306a36Sopenharmony_ci#define AX25_DEF_WINDOW 2 /* Window=2 */ 15162306a36Sopenharmony_ci#define AX25_DEF_EWINDOW 32 /* Module-128 Window=32 */ 15262306a36Sopenharmony_ci#define AX25_DEF_T1 10000 /* T1=10s */ 15362306a36Sopenharmony_ci#define AX25_DEF_T2 3000 /* T2=3s */ 15462306a36Sopenharmony_ci#define AX25_DEF_T3 300000 /* T3=300s */ 15562306a36Sopenharmony_ci#define AX25_DEF_N2 10 /* N2=10 */ 15662306a36Sopenharmony_ci#define AX25_DEF_IDLE 0 /* Idle=None */ 15762306a36Sopenharmony_ci#define AX25_DEF_PACLEN 256 /* Paclen=256 */ 15862306a36Sopenharmony_ci#define AX25_DEF_PROTOCOL AX25_PROTO_STD_SIMPLEX /* Standard AX.25 */ 15962306a36Sopenharmony_ci#define AX25_DEF_DS_TIMEOUT 180000 /* DAMA timeout 3 minutes */ 16062306a36Sopenharmony_ci 16162306a36Sopenharmony_citypedef struct ax25_uid_assoc { 16262306a36Sopenharmony_ci struct hlist_node uid_node; 16362306a36Sopenharmony_ci refcount_t refcount; 16462306a36Sopenharmony_ci kuid_t uid; 16562306a36Sopenharmony_ci ax25_address call; 16662306a36Sopenharmony_ci} ax25_uid_assoc; 16762306a36Sopenharmony_ci 16862306a36Sopenharmony_ci#define ax25_uid_for_each(__ax25, list) \ 16962306a36Sopenharmony_ci hlist_for_each_entry(__ax25, list, uid_node) 17062306a36Sopenharmony_ci 17162306a36Sopenharmony_ci#define ax25_uid_hold(ax25) \ 17262306a36Sopenharmony_ci refcount_inc(&((ax25)->refcount)) 17362306a36Sopenharmony_ci 17462306a36Sopenharmony_cistatic inline void ax25_uid_put(ax25_uid_assoc *assoc) 17562306a36Sopenharmony_ci{ 17662306a36Sopenharmony_ci if (refcount_dec_and_test(&assoc->refcount)) { 17762306a36Sopenharmony_ci kfree(assoc); 17862306a36Sopenharmony_ci } 17962306a36Sopenharmony_ci} 18062306a36Sopenharmony_ci 18162306a36Sopenharmony_citypedef struct { 18262306a36Sopenharmony_ci ax25_address calls[AX25_MAX_DIGIS]; 18362306a36Sopenharmony_ci unsigned char repeated[AX25_MAX_DIGIS]; 18462306a36Sopenharmony_ci unsigned char ndigi; 18562306a36Sopenharmony_ci signed char lastrepeat; 18662306a36Sopenharmony_ci} ax25_digi; 18762306a36Sopenharmony_ci 18862306a36Sopenharmony_citypedef struct ax25_route { 18962306a36Sopenharmony_ci struct ax25_route *next; 19062306a36Sopenharmony_ci ax25_address callsign; 19162306a36Sopenharmony_ci struct net_device *dev; 19262306a36Sopenharmony_ci ax25_digi *digipeat; 19362306a36Sopenharmony_ci char ip_mode; 19462306a36Sopenharmony_ci} ax25_route; 19562306a36Sopenharmony_ci 19662306a36Sopenharmony_civoid __ax25_put_route(ax25_route *ax25_rt); 19762306a36Sopenharmony_ci 19862306a36Sopenharmony_ciextern rwlock_t ax25_route_lock; 19962306a36Sopenharmony_ci 20062306a36Sopenharmony_cistatic inline void ax25_route_lock_use(void) 20162306a36Sopenharmony_ci{ 20262306a36Sopenharmony_ci read_lock(&ax25_route_lock); 20362306a36Sopenharmony_ci} 20462306a36Sopenharmony_ci 20562306a36Sopenharmony_cistatic inline void ax25_route_lock_unuse(void) 20662306a36Sopenharmony_ci{ 20762306a36Sopenharmony_ci read_unlock(&ax25_route_lock); 20862306a36Sopenharmony_ci} 20962306a36Sopenharmony_ci 21062306a36Sopenharmony_citypedef struct { 21162306a36Sopenharmony_ci char slave; /* slave_mode? */ 21262306a36Sopenharmony_ci struct timer_list slave_timer; /* timeout timer */ 21362306a36Sopenharmony_ci unsigned short slave_timeout; /* when? */ 21462306a36Sopenharmony_ci} ax25_dama_info; 21562306a36Sopenharmony_ci 21662306a36Sopenharmony_cistruct ctl_table; 21762306a36Sopenharmony_ci 21862306a36Sopenharmony_citypedef struct ax25_dev { 21962306a36Sopenharmony_ci struct ax25_dev *next; 22062306a36Sopenharmony_ci 22162306a36Sopenharmony_ci struct net_device *dev; 22262306a36Sopenharmony_ci netdevice_tracker dev_tracker; 22362306a36Sopenharmony_ci 22462306a36Sopenharmony_ci struct net_device *forward; 22562306a36Sopenharmony_ci struct ctl_table_header *sysheader; 22662306a36Sopenharmony_ci int values[AX25_MAX_VALUES]; 22762306a36Sopenharmony_ci#if defined(CONFIG_AX25_DAMA_SLAVE) || defined(CONFIG_AX25_DAMA_MASTER) 22862306a36Sopenharmony_ci ax25_dama_info dama; 22962306a36Sopenharmony_ci#endif 23062306a36Sopenharmony_ci refcount_t refcount; 23162306a36Sopenharmony_ci bool device_up; 23262306a36Sopenharmony_ci} ax25_dev; 23362306a36Sopenharmony_ci 23462306a36Sopenharmony_citypedef struct ax25_cb { 23562306a36Sopenharmony_ci struct hlist_node ax25_node; 23662306a36Sopenharmony_ci ax25_address source_addr, dest_addr; 23762306a36Sopenharmony_ci ax25_digi *digipeat; 23862306a36Sopenharmony_ci ax25_dev *ax25_dev; 23962306a36Sopenharmony_ci netdevice_tracker dev_tracker; 24062306a36Sopenharmony_ci unsigned char iamdigi; 24162306a36Sopenharmony_ci unsigned char state, modulus, pidincl; 24262306a36Sopenharmony_ci unsigned short vs, vr, va; 24362306a36Sopenharmony_ci unsigned char condition, backoff; 24462306a36Sopenharmony_ci unsigned char n2, n2count; 24562306a36Sopenharmony_ci struct timer_list t1timer, t2timer, t3timer, idletimer; 24662306a36Sopenharmony_ci unsigned long t1, t2, t3, idle, rtt; 24762306a36Sopenharmony_ci unsigned short paclen, fragno, fraglen; 24862306a36Sopenharmony_ci struct sk_buff_head write_queue; 24962306a36Sopenharmony_ci struct sk_buff_head reseq_queue; 25062306a36Sopenharmony_ci struct sk_buff_head ack_queue; 25162306a36Sopenharmony_ci struct sk_buff_head frag_queue; 25262306a36Sopenharmony_ci unsigned char window; 25362306a36Sopenharmony_ci struct timer_list timer, dtimer; 25462306a36Sopenharmony_ci struct sock *sk; /* Backlink to socket */ 25562306a36Sopenharmony_ci refcount_t refcount; 25662306a36Sopenharmony_ci} ax25_cb; 25762306a36Sopenharmony_ci 25862306a36Sopenharmony_cistruct ax25_sock { 25962306a36Sopenharmony_ci struct sock sk; 26062306a36Sopenharmony_ci struct ax25_cb *cb; 26162306a36Sopenharmony_ci}; 26262306a36Sopenharmony_ci 26362306a36Sopenharmony_ci#define ax25_sk(ptr) container_of_const(ptr, struct ax25_sock, sk) 26462306a36Sopenharmony_ci 26562306a36Sopenharmony_cistatic inline struct ax25_cb *sk_to_ax25(const struct sock *sk) 26662306a36Sopenharmony_ci{ 26762306a36Sopenharmony_ci return ax25_sk(sk)->cb; 26862306a36Sopenharmony_ci} 26962306a36Sopenharmony_ci 27062306a36Sopenharmony_ci#define ax25_for_each(__ax25, list) \ 27162306a36Sopenharmony_ci hlist_for_each_entry(__ax25, list, ax25_node) 27262306a36Sopenharmony_ci 27362306a36Sopenharmony_ci#define ax25_cb_hold(__ax25) \ 27462306a36Sopenharmony_ci refcount_inc(&((__ax25)->refcount)) 27562306a36Sopenharmony_ci 27662306a36Sopenharmony_cistatic __inline__ void ax25_cb_put(ax25_cb *ax25) 27762306a36Sopenharmony_ci{ 27862306a36Sopenharmony_ci if (refcount_dec_and_test(&ax25->refcount)) { 27962306a36Sopenharmony_ci kfree(ax25->digipeat); 28062306a36Sopenharmony_ci kfree(ax25); 28162306a36Sopenharmony_ci } 28262306a36Sopenharmony_ci} 28362306a36Sopenharmony_ci 28462306a36Sopenharmony_cistatic inline void ax25_dev_hold(ax25_dev *ax25_dev) 28562306a36Sopenharmony_ci{ 28662306a36Sopenharmony_ci refcount_inc(&ax25_dev->refcount); 28762306a36Sopenharmony_ci} 28862306a36Sopenharmony_ci 28962306a36Sopenharmony_cistatic inline void ax25_dev_put(ax25_dev *ax25_dev) 29062306a36Sopenharmony_ci{ 29162306a36Sopenharmony_ci if (refcount_dec_and_test(&ax25_dev->refcount)) { 29262306a36Sopenharmony_ci kfree(ax25_dev); 29362306a36Sopenharmony_ci } 29462306a36Sopenharmony_ci} 29562306a36Sopenharmony_cistatic inline __be16 ax25_type_trans(struct sk_buff *skb, struct net_device *dev) 29662306a36Sopenharmony_ci{ 29762306a36Sopenharmony_ci skb->dev = dev; 29862306a36Sopenharmony_ci skb_reset_mac_header(skb); 29962306a36Sopenharmony_ci skb->pkt_type = PACKET_HOST; 30062306a36Sopenharmony_ci return htons(ETH_P_AX25); 30162306a36Sopenharmony_ci} 30262306a36Sopenharmony_ci 30362306a36Sopenharmony_ci/* af_ax25.c */ 30462306a36Sopenharmony_ciextern struct hlist_head ax25_list; 30562306a36Sopenharmony_ciextern spinlock_t ax25_list_lock; 30662306a36Sopenharmony_civoid ax25_cb_add(ax25_cb *); 30762306a36Sopenharmony_cistruct sock *ax25_find_listener(ax25_address *, int, struct net_device *, int); 30862306a36Sopenharmony_cistruct sock *ax25_get_socket(ax25_address *, ax25_address *, int); 30962306a36Sopenharmony_ciax25_cb *ax25_find_cb(const ax25_address *, ax25_address *, ax25_digi *, 31062306a36Sopenharmony_ci struct net_device *); 31162306a36Sopenharmony_civoid ax25_send_to_raw(ax25_address *, struct sk_buff *, int); 31262306a36Sopenharmony_civoid ax25_destroy_socket(ax25_cb *); 31362306a36Sopenharmony_ciax25_cb * __must_check ax25_create_cb(void); 31462306a36Sopenharmony_civoid ax25_fillin_cb(ax25_cb *, ax25_dev *); 31562306a36Sopenharmony_cistruct sock *ax25_make_new(struct sock *, struct ax25_dev *); 31662306a36Sopenharmony_ci 31762306a36Sopenharmony_ci/* ax25_addr.c */ 31862306a36Sopenharmony_ciextern const ax25_address ax25_bcast; 31962306a36Sopenharmony_ciextern const ax25_address ax25_defaddr; 32062306a36Sopenharmony_ciextern const ax25_address null_ax25_address; 32162306a36Sopenharmony_cichar *ax2asc(char *buf, const ax25_address *); 32262306a36Sopenharmony_civoid asc2ax(ax25_address *addr, const char *callsign); 32362306a36Sopenharmony_ciint ax25cmp(const ax25_address *, const ax25_address *); 32462306a36Sopenharmony_ciint ax25digicmp(const ax25_digi *, const ax25_digi *); 32562306a36Sopenharmony_ciconst unsigned char *ax25_addr_parse(const unsigned char *, int, 32662306a36Sopenharmony_ci ax25_address *, ax25_address *, ax25_digi *, int *, int *); 32762306a36Sopenharmony_ciint ax25_addr_build(unsigned char *, const ax25_address *, 32862306a36Sopenharmony_ci const ax25_address *, const ax25_digi *, int, int); 32962306a36Sopenharmony_ciint ax25_addr_size(const ax25_digi *); 33062306a36Sopenharmony_civoid ax25_digi_invert(const ax25_digi *, ax25_digi *); 33162306a36Sopenharmony_ci 33262306a36Sopenharmony_ci/* ax25_dev.c */ 33362306a36Sopenharmony_ciextern ax25_dev *ax25_dev_list; 33462306a36Sopenharmony_ciextern spinlock_t ax25_dev_lock; 33562306a36Sopenharmony_ci 33662306a36Sopenharmony_ci#if IS_ENABLED(CONFIG_AX25) 33762306a36Sopenharmony_cistatic inline ax25_dev *ax25_dev_ax25dev(struct net_device *dev) 33862306a36Sopenharmony_ci{ 33962306a36Sopenharmony_ci return dev->ax25_ptr; 34062306a36Sopenharmony_ci} 34162306a36Sopenharmony_ci#endif 34262306a36Sopenharmony_ci 34362306a36Sopenharmony_ciax25_dev *ax25_addr_ax25dev(ax25_address *); 34462306a36Sopenharmony_civoid ax25_dev_device_up(struct net_device *); 34562306a36Sopenharmony_civoid ax25_dev_device_down(struct net_device *); 34662306a36Sopenharmony_ciint ax25_fwd_ioctl(unsigned int, struct ax25_fwd_struct *); 34762306a36Sopenharmony_cistruct net_device *ax25_fwd_dev(struct net_device *); 34862306a36Sopenharmony_civoid ax25_dev_free(void); 34962306a36Sopenharmony_ci 35062306a36Sopenharmony_ci/* ax25_ds_in.c */ 35162306a36Sopenharmony_ciint ax25_ds_frame_in(ax25_cb *, struct sk_buff *, int); 35262306a36Sopenharmony_ci 35362306a36Sopenharmony_ci/* ax25_ds_subr.c */ 35462306a36Sopenharmony_civoid ax25_ds_nr_error_recovery(ax25_cb *); 35562306a36Sopenharmony_civoid ax25_ds_enquiry_response(ax25_cb *); 35662306a36Sopenharmony_civoid ax25_ds_establish_data_link(ax25_cb *); 35762306a36Sopenharmony_civoid ax25_dev_dama_off(ax25_dev *); 35862306a36Sopenharmony_civoid ax25_dama_on(ax25_cb *); 35962306a36Sopenharmony_civoid ax25_dama_off(ax25_cb *); 36062306a36Sopenharmony_ci 36162306a36Sopenharmony_ci/* ax25_ds_timer.c */ 36262306a36Sopenharmony_civoid ax25_ds_setup_timer(ax25_dev *); 36362306a36Sopenharmony_civoid ax25_ds_set_timer(ax25_dev *); 36462306a36Sopenharmony_civoid ax25_ds_del_timer(ax25_dev *); 36562306a36Sopenharmony_civoid ax25_ds_timer(ax25_cb *); 36662306a36Sopenharmony_civoid ax25_ds_t1_timeout(ax25_cb *); 36762306a36Sopenharmony_civoid ax25_ds_heartbeat_expiry(ax25_cb *); 36862306a36Sopenharmony_civoid ax25_ds_t3timer_expiry(ax25_cb *); 36962306a36Sopenharmony_civoid ax25_ds_idletimer_expiry(ax25_cb *); 37062306a36Sopenharmony_ci 37162306a36Sopenharmony_ci/* ax25_iface.c */ 37262306a36Sopenharmony_ci 37362306a36Sopenharmony_cistruct ax25_protocol { 37462306a36Sopenharmony_ci struct ax25_protocol *next; 37562306a36Sopenharmony_ci unsigned int pid; 37662306a36Sopenharmony_ci int (*func)(struct sk_buff *, ax25_cb *); 37762306a36Sopenharmony_ci}; 37862306a36Sopenharmony_ci 37962306a36Sopenharmony_civoid ax25_register_pid(struct ax25_protocol *ap); 38062306a36Sopenharmony_civoid ax25_protocol_release(unsigned int); 38162306a36Sopenharmony_ci 38262306a36Sopenharmony_cistruct ax25_linkfail { 38362306a36Sopenharmony_ci struct hlist_node lf_node; 38462306a36Sopenharmony_ci void (*func)(ax25_cb *, int); 38562306a36Sopenharmony_ci}; 38662306a36Sopenharmony_ci 38762306a36Sopenharmony_civoid ax25_linkfail_register(struct ax25_linkfail *lf); 38862306a36Sopenharmony_civoid ax25_linkfail_release(struct ax25_linkfail *lf); 38962306a36Sopenharmony_ciint __must_check ax25_listen_register(const ax25_address *, 39062306a36Sopenharmony_ci struct net_device *); 39162306a36Sopenharmony_civoid ax25_listen_release(const ax25_address *, struct net_device *); 39262306a36Sopenharmony_ciint(*ax25_protocol_function(unsigned int))(struct sk_buff *, ax25_cb *); 39362306a36Sopenharmony_ciint ax25_listen_mine(const ax25_address *, struct net_device *); 39462306a36Sopenharmony_civoid ax25_link_failed(ax25_cb *, int); 39562306a36Sopenharmony_ciint ax25_protocol_is_registered(unsigned int); 39662306a36Sopenharmony_ci 39762306a36Sopenharmony_ci/* ax25_in.c */ 39862306a36Sopenharmony_ciint ax25_rx_iframe(ax25_cb *, struct sk_buff *); 39962306a36Sopenharmony_ciint ax25_kiss_rcv(struct sk_buff *, struct net_device *, struct packet_type *, 40062306a36Sopenharmony_ci struct net_device *); 40162306a36Sopenharmony_ci 40262306a36Sopenharmony_ci/* ax25_ip.c */ 40362306a36Sopenharmony_cinetdev_tx_t ax25_ip_xmit(struct sk_buff *skb); 40462306a36Sopenharmony_ciextern const struct header_ops ax25_header_ops; 40562306a36Sopenharmony_ci 40662306a36Sopenharmony_ci/* ax25_out.c */ 40762306a36Sopenharmony_ciax25_cb *ax25_send_frame(struct sk_buff *, int, const ax25_address *, 40862306a36Sopenharmony_ci ax25_address *, ax25_digi *, struct net_device *); 40962306a36Sopenharmony_civoid ax25_output(ax25_cb *, int, struct sk_buff *); 41062306a36Sopenharmony_civoid ax25_kick(ax25_cb *); 41162306a36Sopenharmony_civoid ax25_transmit_buffer(ax25_cb *, struct sk_buff *, int); 41262306a36Sopenharmony_civoid ax25_queue_xmit(struct sk_buff *skb, struct net_device *dev); 41362306a36Sopenharmony_ciint ax25_check_iframes_acked(ax25_cb *, unsigned short); 41462306a36Sopenharmony_ci 41562306a36Sopenharmony_ci/* ax25_route.c */ 41662306a36Sopenharmony_civoid ax25_rt_device_down(struct net_device *); 41762306a36Sopenharmony_ciint ax25_rt_ioctl(unsigned int, void __user *); 41862306a36Sopenharmony_ciextern const struct seq_operations ax25_rt_seqops; 41962306a36Sopenharmony_ciax25_route *ax25_get_route(ax25_address *addr, struct net_device *dev); 42062306a36Sopenharmony_ciint ax25_rt_autobind(ax25_cb *, ax25_address *); 42162306a36Sopenharmony_cistruct sk_buff *ax25_rt_build_path(struct sk_buff *, ax25_address *, 42262306a36Sopenharmony_ci ax25_address *, ax25_digi *); 42362306a36Sopenharmony_civoid ax25_rt_free(void); 42462306a36Sopenharmony_ci 42562306a36Sopenharmony_ci/* ax25_std_in.c */ 42662306a36Sopenharmony_ciint ax25_std_frame_in(ax25_cb *, struct sk_buff *, int); 42762306a36Sopenharmony_ci 42862306a36Sopenharmony_ci/* ax25_std_subr.c */ 42962306a36Sopenharmony_civoid ax25_std_nr_error_recovery(ax25_cb *); 43062306a36Sopenharmony_civoid ax25_std_establish_data_link(ax25_cb *); 43162306a36Sopenharmony_civoid ax25_std_transmit_enquiry(ax25_cb *); 43262306a36Sopenharmony_civoid ax25_std_enquiry_response(ax25_cb *); 43362306a36Sopenharmony_civoid ax25_std_timeout_response(ax25_cb *); 43462306a36Sopenharmony_ci 43562306a36Sopenharmony_ci/* ax25_std_timer.c */ 43662306a36Sopenharmony_civoid ax25_std_heartbeat_expiry(ax25_cb *); 43762306a36Sopenharmony_civoid ax25_std_t1timer_expiry(ax25_cb *); 43862306a36Sopenharmony_civoid ax25_std_t2timer_expiry(ax25_cb *); 43962306a36Sopenharmony_civoid ax25_std_t3timer_expiry(ax25_cb *); 44062306a36Sopenharmony_civoid ax25_std_idletimer_expiry(ax25_cb *); 44162306a36Sopenharmony_ci 44262306a36Sopenharmony_ci/* ax25_subr.c */ 44362306a36Sopenharmony_civoid ax25_clear_queues(ax25_cb *); 44462306a36Sopenharmony_civoid ax25_frames_acked(ax25_cb *, unsigned short); 44562306a36Sopenharmony_civoid ax25_requeue_frames(ax25_cb *); 44662306a36Sopenharmony_ciint ax25_validate_nr(ax25_cb *, unsigned short); 44762306a36Sopenharmony_ciint ax25_decode(ax25_cb *, struct sk_buff *, int *, int *, int *); 44862306a36Sopenharmony_civoid ax25_send_control(ax25_cb *, int, int, int); 44962306a36Sopenharmony_civoid ax25_return_dm(struct net_device *, ax25_address *, ax25_address *, 45062306a36Sopenharmony_ci ax25_digi *); 45162306a36Sopenharmony_civoid ax25_calculate_t1(ax25_cb *); 45262306a36Sopenharmony_civoid ax25_calculate_rtt(ax25_cb *); 45362306a36Sopenharmony_civoid ax25_disconnect(ax25_cb *, int); 45462306a36Sopenharmony_ci 45562306a36Sopenharmony_ci/* ax25_timer.c */ 45662306a36Sopenharmony_civoid ax25_setup_timers(ax25_cb *); 45762306a36Sopenharmony_civoid ax25_start_heartbeat(ax25_cb *); 45862306a36Sopenharmony_civoid ax25_start_t1timer(ax25_cb *); 45962306a36Sopenharmony_civoid ax25_start_t2timer(ax25_cb *); 46062306a36Sopenharmony_civoid ax25_start_t3timer(ax25_cb *); 46162306a36Sopenharmony_civoid ax25_start_idletimer(ax25_cb *); 46262306a36Sopenharmony_civoid ax25_stop_heartbeat(ax25_cb *); 46362306a36Sopenharmony_civoid ax25_stop_t1timer(ax25_cb *); 46462306a36Sopenharmony_civoid ax25_stop_t2timer(ax25_cb *); 46562306a36Sopenharmony_civoid ax25_stop_t3timer(ax25_cb *); 46662306a36Sopenharmony_civoid ax25_stop_idletimer(ax25_cb *); 46762306a36Sopenharmony_ciint ax25_t1timer_running(ax25_cb *); 46862306a36Sopenharmony_ciunsigned long ax25_display_timer(struct timer_list *); 46962306a36Sopenharmony_ci 47062306a36Sopenharmony_ci/* ax25_uid.c */ 47162306a36Sopenharmony_ciextern int ax25_uid_policy; 47262306a36Sopenharmony_ciax25_uid_assoc *ax25_findbyuid(kuid_t); 47362306a36Sopenharmony_ciint __must_check ax25_uid_ioctl(int, struct sockaddr_ax25 *); 47462306a36Sopenharmony_ciextern const struct seq_operations ax25_uid_seqops; 47562306a36Sopenharmony_civoid ax25_uid_free(void); 47662306a36Sopenharmony_ci 47762306a36Sopenharmony_ci/* sysctl_net_ax25.c */ 47862306a36Sopenharmony_ci#ifdef CONFIG_SYSCTL 47962306a36Sopenharmony_ciint ax25_register_dev_sysctl(ax25_dev *ax25_dev); 48062306a36Sopenharmony_civoid ax25_unregister_dev_sysctl(ax25_dev *ax25_dev); 48162306a36Sopenharmony_ci#else 48262306a36Sopenharmony_cistatic inline int ax25_register_dev_sysctl(ax25_dev *ax25_dev) { return 0; } 48362306a36Sopenharmony_cistatic inline void ax25_unregister_dev_sysctl(ax25_dev *ax25_dev) {} 48462306a36Sopenharmony_ci#endif /* CONFIG_SYSCTL */ 48562306a36Sopenharmony_ci 48662306a36Sopenharmony_ci#endif 487