1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
21da177e4SLinus Torvalds /*
31da177e4SLinus Torvalds * Declarations of AX.25 type objects.
41da177e4SLinus Torvalds *
51da177e4SLinus Torvalds * Alan Cox (GW4PTS) 10/11/93
61da177e4SLinus Torvalds */
71da177e4SLinus Torvalds #ifndef _AX25_H
81da177e4SLinus Torvalds #define _AX25_H
91da177e4SLinus Torvalds
101da177e4SLinus Torvalds #include <linux/ax25.h>
111da177e4SLinus Torvalds #include <linux/spinlock.h>
121da177e4SLinus Torvalds #include <linux/timer.h>
131da177e4SLinus Torvalds #include <linux/list.h>
145a0e3ad6STejun Heo #include <linux/slab.h>
1507f2282fSReshetova, Elena #include <linux/refcount.h>
163b6a94beSEric W. Biederman #include <net/neighbour.h>
173200392bSDavid Miller #include <net/sock.h>
18fddda2b7SChristoph Hellwig #include <linux/seq_file.h>
191da177e4SLinus Torvalds
201da177e4SLinus Torvalds #define AX25_T1CLAMPLO 1
211da177e4SLinus Torvalds #define AX25_T1CLAMPHI (30 * HZ)
221da177e4SLinus Torvalds
231da177e4SLinus Torvalds #define AX25_BPQ_HEADER_LEN 16
241da177e4SLinus Torvalds #define AX25_KISS_HEADER_LEN 1
251da177e4SLinus Torvalds
261da177e4SLinus Torvalds #define AX25_HEADER_LEN 17
271da177e4SLinus Torvalds #define AX25_ADDR_LEN 7
281da177e4SLinus Torvalds #define AX25_DIGI_HEADER_LEN (AX25_MAX_DIGIS * AX25_ADDR_LEN)
291da177e4SLinus Torvalds #define AX25_MAX_HEADER_LEN (AX25_HEADER_LEN + AX25_DIGI_HEADER_LEN)
301da177e4SLinus Torvalds
311da177e4SLinus Torvalds /* AX.25 Protocol IDs */
321da177e4SLinus Torvalds #define AX25_P_ROSE 0x01
333bf0ae7bSRalf Baechle #define AX25_P_VJCOMP 0x06 /* Compressed TCP/IP packet */
343bf0ae7bSRalf Baechle /* Van Jacobsen (RFC 1144) */
353bf0ae7bSRalf Baechle #define AX25_P_VJUNCOMP 0x07 /* Uncompressed TCP/IP packet */
363bf0ae7bSRalf Baechle /* Van Jacobsen (RFC 1144) */
373bf0ae7bSRalf Baechle #define AX25_P_SEGMENT 0x08 /* Segmentation fragment */
383bf0ae7bSRalf Baechle #define AX25_P_TEXNET 0xc3 /* TEXTNET datagram protocol */
393bf0ae7bSRalf Baechle #define AX25_P_LQ 0xc4 /* Link Quality Protocol */
403bf0ae7bSRalf Baechle #define AX25_P_ATALK 0xca /* Appletalk */
413bf0ae7bSRalf Baechle #define AX25_P_ATALK_ARP 0xcb /* Appletalk ARP */
423bf0ae7bSRalf Baechle #define AX25_P_IP 0xcc /* ARPA Internet Protocol */
43f4ab2f72SJoe Perches #define AX25_P_ARP 0xcd /* ARPA Address Resolution */
443bf0ae7bSRalf Baechle #define AX25_P_FLEXNET 0xce /* FlexNet */
453bf0ae7bSRalf Baechle #define AX25_P_NETROM 0xcf /* NET/ROM */
463bf0ae7bSRalf Baechle #define AX25_P_TEXT 0xF0 /* No layer 3 protocol impl. */
471da177e4SLinus Torvalds
481da177e4SLinus Torvalds /* AX.25 Segment control values */
491da177e4SLinus Torvalds #define AX25_SEG_REM 0x7F
501da177e4SLinus Torvalds #define AX25_SEG_FIRST 0x80
511da177e4SLinus Torvalds
521da177e4SLinus Torvalds #define AX25_CBIT 0x80 /* Command/Response bit */
531da177e4SLinus Torvalds #define AX25_EBIT 0x01 /* HDLC Address Extension bit */
541da177e4SLinus Torvalds #define AX25_HBIT 0x80 /* Has been repeated bit */
551da177e4SLinus Torvalds
561da177e4SLinus Torvalds #define AX25_SSSID_SPARE 0x60 /* Unused bits in SSID for standard AX.25 */
571da177e4SLinus Torvalds #define AX25_ESSID_SPARE 0x20 /* Unused bits in SSID for extended AX.25 */
581da177e4SLinus Torvalds #define AX25_DAMA_FLAG 0x20 /* Well, it is *NOT* unused! (dl1bke 951121 */
591da177e4SLinus Torvalds
601da177e4SLinus Torvalds #define AX25_COND_ACK_PENDING 0x01
611da177e4SLinus Torvalds #define AX25_COND_REJECT 0x02
621da177e4SLinus Torvalds #define AX25_COND_PEER_RX_BUSY 0x04
631da177e4SLinus Torvalds #define AX25_COND_OWN_RX_BUSY 0x08
641da177e4SLinus Torvalds #define AX25_COND_DAMA_MODE 0x10
651da177e4SLinus Torvalds
661da177e4SLinus Torvalds #ifndef _LINUX_NETDEVICE_H
671da177e4SLinus Torvalds #include <linux/netdevice.h>
681da177e4SLinus Torvalds #endif
691da177e4SLinus Torvalds
701da177e4SLinus Torvalds /* Upper sub-layer (LAPB) definitions */
711da177e4SLinus Torvalds
721da177e4SLinus Torvalds /* Control field templates */
731da177e4SLinus Torvalds #define AX25_I 0x00 /* Information frames */
741da177e4SLinus Torvalds #define AX25_S 0x01 /* Supervisory frames */
751da177e4SLinus Torvalds #define AX25_RR 0x01 /* Receiver ready */
761da177e4SLinus Torvalds #define AX25_RNR 0x05 /* Receiver not ready */
771da177e4SLinus Torvalds #define AX25_REJ 0x09 /* Reject */
781da177e4SLinus Torvalds #define AX25_U 0x03 /* Unnumbered frames */
791da177e4SLinus Torvalds #define AX25_SABM 0x2f /* Set Asynchronous Balanced Mode */
801da177e4SLinus Torvalds #define AX25_SABME 0x6f /* Set Asynchronous Balanced Mode Extended */
811da177e4SLinus Torvalds #define AX25_DISC 0x43 /* Disconnect */
821da177e4SLinus Torvalds #define AX25_DM 0x0f /* Disconnected mode */
831da177e4SLinus Torvalds #define AX25_UA 0x63 /* Unnumbered acknowledge */
841da177e4SLinus Torvalds #define AX25_FRMR 0x87 /* Frame reject */
851da177e4SLinus Torvalds #define AX25_UI 0x03 /* Unnumbered information */
861da177e4SLinus Torvalds #define AX25_XID 0xaf /* Exchange information */
871da177e4SLinus Torvalds #define AX25_TEST 0xe3 /* Test */
881da177e4SLinus Torvalds
891da177e4SLinus Torvalds #define AX25_PF 0x10 /* Poll/final bit for standard AX.25 */
901da177e4SLinus Torvalds #define AX25_EPF 0x01 /* Poll/final bit for extended AX.25 */
911da177e4SLinus Torvalds
921da177e4SLinus Torvalds #define AX25_ILLEGAL 0x100 /* Impossible to be a real frame type */
931da177e4SLinus Torvalds
941da177e4SLinus Torvalds #define AX25_POLLOFF 0
951da177e4SLinus Torvalds #define AX25_POLLON 1
961da177e4SLinus Torvalds
971da177e4SLinus Torvalds /* AX25 L2 C-bit */
981da177e4SLinus Torvalds #define AX25_COMMAND 1
991da177e4SLinus Torvalds #define AX25_RESPONSE 2
1001da177e4SLinus Torvalds
1011da177e4SLinus Torvalds /* Define Link State constants. */
1021da177e4SLinus Torvalds
1031da177e4SLinus Torvalds enum {
104b01ef8ffSRalf Baechle AX25_STATE_0, /* Listening */
105b01ef8ffSRalf Baechle AX25_STATE_1, /* SABM sent */
106b01ef8ffSRalf Baechle AX25_STATE_2, /* DISC sent */
107b01ef8ffSRalf Baechle AX25_STATE_3, /* Established */
108b01ef8ffSRalf Baechle AX25_STATE_4 /* Recovery */
1091da177e4SLinus Torvalds };
1101da177e4SLinus Torvalds
1111da177e4SLinus Torvalds #define AX25_MODULUS 8 /* Standard AX.25 modulus */
1121da177e4SLinus Torvalds #define AX25_EMODULUS 128 /* Extended AX.25 modulus */
1131da177e4SLinus Torvalds
1141da177e4SLinus Torvalds enum {
1151da177e4SLinus Torvalds AX25_PROTO_STD_SIMPLEX,
1161da177e4SLinus Torvalds AX25_PROTO_STD_DUPLEX,
117c7c694d1SRalf Baechle DL5RB #ifdef CONFIG_AX25_DAMA_SLAVE
1181da177e4SLinus Torvalds AX25_PROTO_DAMA_SLAVE,
119c7c694d1SRalf Baechle DL5RB #ifdef CONFIG_AX25_DAMA_MASTER
120c7c694d1SRalf Baechle DL5RB AX25_PROTO_DAMA_MASTER,
121c7c694d1SRalf Baechle DL5RB #define AX25_PROTO_MAX AX25_PROTO_DAMA_MASTER
122c7c694d1SRalf Baechle DL5RB #endif
123c7c694d1SRalf Baechle DL5RB #endif
124c7c694d1SRalf Baechle DL5RB __AX25_PROTO_MAX,
125c7c694d1SRalf Baechle DL5RB AX25_PROTO_MAX = __AX25_PROTO_MAX -1
1261da177e4SLinus Torvalds };
1271da177e4SLinus Torvalds
1281da177e4SLinus Torvalds enum {
1291da177e4SLinus Torvalds AX25_VALUES_IPDEFMODE, /* 0=DG 1=VC */
1301da177e4SLinus Torvalds AX25_VALUES_AXDEFMODE, /* 0=Normal 1=Extended Seq Nos */
1311da177e4SLinus Torvalds AX25_VALUES_BACKOFF, /* 0=None 1=Linear 2=Exponential */
1321da177e4SLinus Torvalds AX25_VALUES_CONMODE, /* Allow connected modes - 0=No 1=no "PID text" 2=all PIDs */
1331da177e4SLinus Torvalds AX25_VALUES_WINDOW, /* Default window size for standard AX.25 */
1341da177e4SLinus Torvalds AX25_VALUES_EWINDOW, /* Default window size for extended AX.25 */
1351da177e4SLinus Torvalds AX25_VALUES_T1, /* Default T1 timeout value */
1361da177e4SLinus Torvalds AX25_VALUES_T2, /* Default T2 timeout value */
1371da177e4SLinus Torvalds AX25_VALUES_T3, /* Default T3 timeout value */
1381da177e4SLinus Torvalds AX25_VALUES_IDLE, /* Connected mode idle timer */
1391da177e4SLinus Torvalds AX25_VALUES_N2, /* Default N2 value */
1401da177e4SLinus Torvalds AX25_VALUES_PACLEN, /* AX.25 MTU */
1411da177e4SLinus Torvalds AX25_VALUES_PROTOCOL, /* Std AX.25, DAMA Slave, DAMA Master */
1421da177e4SLinus Torvalds AX25_VALUES_DS_TIMEOUT, /* DAMA Slave timeout */
1431da177e4SLinus Torvalds AX25_MAX_VALUES /* THIS MUST REMAIN THE LAST ENTRY OF THIS LIST */
1441da177e4SLinus Torvalds };
1451da177e4SLinus Torvalds
1461da177e4SLinus Torvalds #define AX25_DEF_IPDEFMODE 0 /* Datagram */
1471da177e4SLinus Torvalds #define AX25_DEF_AXDEFMODE 0 /* Normal */
1481da177e4SLinus Torvalds #define AX25_DEF_BACKOFF 1 /* Linear backoff */
1491da177e4SLinus Torvalds #define AX25_DEF_CONMODE 2 /* Connected mode allowed */
1501da177e4SLinus Torvalds #define AX25_DEF_WINDOW 2 /* Window=2 */
1511da177e4SLinus Torvalds #define AX25_DEF_EWINDOW 32 /* Module-128 Window=32 */
152e1fdb5b3SRalf Baechle #define AX25_DEF_T1 10000 /* T1=10s */
153e1fdb5b3SRalf Baechle #define AX25_DEF_T2 3000 /* T2=3s */
154e1fdb5b3SRalf Baechle #define AX25_DEF_T3 300000 /* T3=300s */
1551da177e4SLinus Torvalds #define AX25_DEF_N2 10 /* N2=10 */
156e1fdb5b3SRalf Baechle #define AX25_DEF_IDLE 0 /* Idle=None */
1571da177e4SLinus Torvalds #define AX25_DEF_PACLEN 256 /* Paclen=256 */
1581da177e4SLinus Torvalds #define AX25_DEF_PROTOCOL AX25_PROTO_STD_SIMPLEX /* Standard AX.25 */
159e1fdb5b3SRalf Baechle #define AX25_DEF_DS_TIMEOUT 180000 /* DAMA timeout 3 minutes */
1601da177e4SLinus Torvalds
1611da177e4SLinus Torvalds typedef struct ax25_uid_assoc {
16201d7dd0eSRalf Baechle struct hlist_node uid_node;
16307f2282fSReshetova, Elena refcount_t refcount;
164d13fda85SEric W. Biederman kuid_t uid;
1651da177e4SLinus Torvalds ax25_address call;
1661da177e4SLinus Torvalds } ax25_uid_assoc;
1671da177e4SLinus Torvalds
168b67bfe0dSSasha Levin #define ax25_uid_for_each(__ax25, list) \
169b67bfe0dSSasha Levin hlist_for_each_entry(__ax25, list, uid_node)
17001d7dd0eSRalf Baechle
17101d7dd0eSRalf Baechle #define ax25_uid_hold(ax25) \
17207f2282fSReshetova, Elena refcount_inc(&((ax25)->refcount))
17301d7dd0eSRalf Baechle
ax25_uid_put(ax25_uid_assoc * assoc)17401d7dd0eSRalf Baechle static inline void ax25_uid_put(ax25_uid_assoc *assoc)
17501d7dd0eSRalf Baechle {
17607f2282fSReshetova, Elena if (refcount_dec_and_test(&assoc->refcount)) {
17701d7dd0eSRalf Baechle kfree(assoc);
17801d7dd0eSRalf Baechle }
17901d7dd0eSRalf Baechle }
18001d7dd0eSRalf Baechle
1811da177e4SLinus Torvalds typedef struct {
1821da177e4SLinus Torvalds ax25_address calls[AX25_MAX_DIGIS];
1831da177e4SLinus Torvalds unsigned char repeated[AX25_MAX_DIGIS];
1841da177e4SLinus Torvalds unsigned char ndigi;
1854595f251SRalf Baechle signed char lastrepeat;
1861da177e4SLinus Torvalds } ax25_digi;
1871da177e4SLinus Torvalds
1881da177e4SLinus Torvalds typedef struct ax25_route {
1891da177e4SLinus Torvalds struct ax25_route *next;
1901da177e4SLinus Torvalds ax25_address callsign;
1911da177e4SLinus Torvalds struct net_device *dev;
1921da177e4SLinus Torvalds ax25_digi *digipeat;
1931da177e4SLinus Torvalds char ip_mode;
1941da177e4SLinus Torvalds } ax25_route;
1951da177e4SLinus Torvalds
196c1d8f804SJoe Perches void __ax25_put_route(ax25_route *ax25_rt);
197006f68b8SRalf Baechle DL5RB
19863530abaSEric Dumazet extern rwlock_t ax25_route_lock;
19963530abaSEric Dumazet
ax25_route_lock_use(void)20063530abaSEric Dumazet static inline void ax25_route_lock_use(void)
20163530abaSEric Dumazet {
20263530abaSEric Dumazet read_lock(&ax25_route_lock);
20363530abaSEric Dumazet }
20463530abaSEric Dumazet
ax25_route_lock_unuse(void)20563530abaSEric Dumazet static inline void ax25_route_lock_unuse(void)
20663530abaSEric Dumazet {
20763530abaSEric Dumazet read_unlock(&ax25_route_lock);
20863530abaSEric Dumazet }
20963530abaSEric Dumazet
2101da177e4SLinus Torvalds typedef struct {
2111da177e4SLinus Torvalds char slave; /* slave_mode? */
2121da177e4SLinus Torvalds struct timer_list slave_timer; /* timeout timer */
2131da177e4SLinus Torvalds unsigned short slave_timeout; /* when? */
2141da177e4SLinus Torvalds } ax25_dama_info;
2151da177e4SLinus Torvalds
2161da177e4SLinus Torvalds struct ctl_table;
2171da177e4SLinus Torvalds
2181da177e4SLinus Torvalds typedef struct ax25_dev {
21939da6f09SDuoming Zhou struct list_head list;
22066ce07f7SEric Dumazet
2211da177e4SLinus Torvalds struct net_device *dev;
22266ce07f7SEric Dumazet netdevice_tracker dev_tracker;
22366ce07f7SEric Dumazet
2241da177e4SLinus Torvalds struct net_device *forward;
2250ca7a4c8SEric W. Biederman struct ctl_table_header *sysheader;
2261da177e4SLinus Torvalds int values[AX25_MAX_VALUES];
2271da177e4SLinus Torvalds #if defined(CONFIG_AX25_DAMA_SLAVE) || defined(CONFIG_AX25_DAMA_MASTER)
2281da177e4SLinus Torvalds ax25_dama_info dama;
2291da177e4SLinus Torvalds #endif
230d01ffb9eSDuoming Zhou refcount_t refcount;
2317d8a3a47SDuoming Zhou bool device_up;
232*7705d8a7SEric Dumazet struct rcu_head rcu;
2331da177e4SLinus Torvalds } ax25_dev;
2341da177e4SLinus Torvalds
2351da177e4SLinus Torvalds typedef struct ax25_cb {
2361da177e4SLinus Torvalds struct hlist_node ax25_node;
2371da177e4SLinus Torvalds ax25_address source_addr, dest_addr;
2381da177e4SLinus Torvalds ax25_digi *digipeat;
2391da177e4SLinus Torvalds ax25_dev *ax25_dev;
240d7c4c9e0SEric Dumazet netdevice_tracker dev_tracker;
2411da177e4SLinus Torvalds unsigned char iamdigi;
2421da177e4SLinus Torvalds unsigned char state, modulus, pidincl;
2431da177e4SLinus Torvalds unsigned short vs, vr, va;
2441da177e4SLinus Torvalds unsigned char condition, backoff;
2451da177e4SLinus Torvalds unsigned char n2, n2count;
2461da177e4SLinus Torvalds struct timer_list t1timer, t2timer, t3timer, idletimer;
2471da177e4SLinus Torvalds unsigned long t1, t2, t3, idle, rtt;
2481da177e4SLinus Torvalds unsigned short paclen, fragno, fraglen;
2491da177e4SLinus Torvalds struct sk_buff_head write_queue;
2501da177e4SLinus Torvalds struct sk_buff_head reseq_queue;
2511da177e4SLinus Torvalds struct sk_buff_head ack_queue;
2521da177e4SLinus Torvalds struct sk_buff_head frag_queue;
2531da177e4SLinus Torvalds unsigned char window;
2541da177e4SLinus Torvalds struct timer_list timer, dtimer;
2551da177e4SLinus Torvalds struct sock *sk; /* Backlink to socket */
256b6d52edeSReshetova, Elena refcount_t refcount;
2571da177e4SLinus Torvalds } ax25_cb;
2581da177e4SLinus Torvalds
2593200392bSDavid Miller struct ax25_sock {
2603200392bSDavid Miller struct sock sk;
2613200392bSDavid Miller struct ax25_cb *cb;
2623200392bSDavid Miller };
2633200392bSDavid Miller
264c7154ca8SEric Dumazet #define ax25_sk(ptr) container_of_const(ptr, struct ax25_sock, sk)
2653200392bSDavid Miller
sk_to_ax25(const struct sock * sk)2663200392bSDavid Miller static inline struct ax25_cb *sk_to_ax25(const struct sock *sk)
2673200392bSDavid Miller {
2683200392bSDavid Miller return ax25_sk(sk)->cb;
2693200392bSDavid Miller }
2701da177e4SLinus Torvalds
271b67bfe0dSSasha Levin #define ax25_for_each(__ax25, list) \
272b67bfe0dSSasha Levin hlist_for_each_entry(__ax25, list, ax25_node)
2731da177e4SLinus Torvalds
2741da177e4SLinus Torvalds #define ax25_cb_hold(__ax25) \
275b6d52edeSReshetova, Elena refcount_inc(&((__ax25)->refcount))
2761da177e4SLinus Torvalds
ax25_cb_put(ax25_cb * ax25)2771da177e4SLinus Torvalds static __inline__ void ax25_cb_put(ax25_cb *ax25)
2781da177e4SLinus Torvalds {
279b6d52edeSReshetova, Elena if (refcount_dec_and_test(&ax25->refcount)) {
2801da177e4SLinus Torvalds kfree(ax25->digipeat);
2811da177e4SLinus Torvalds kfree(ax25);
2821da177e4SLinus Torvalds }
2831da177e4SLinus Torvalds }
2841da177e4SLinus Torvalds
ax25_dev_hold(ax25_dev * ax25_dev)28587563a04SDuoming Zhou static inline void ax25_dev_hold(ax25_dev *ax25_dev)
28687563a04SDuoming Zhou {
28787563a04SDuoming Zhou refcount_inc(&ax25_dev->refcount);
28887563a04SDuoming Zhou }
289d01ffb9eSDuoming Zhou
ax25_dev_put(ax25_dev * ax25_dev)29087563a04SDuoming Zhou static inline void ax25_dev_put(ax25_dev *ax25_dev)
291d01ffb9eSDuoming Zhou {
292*7705d8a7SEric Dumazet if (refcount_dec_and_test(&ax25_dev->refcount))
293*7705d8a7SEric Dumazet kfree_rcu(ax25_dev, rcu);
294d01ffb9eSDuoming Zhou }
ax25_type_trans(struct sk_buff * skb,struct net_device * dev)295f852640eSAlexey Dobriyan static inline __be16 ax25_type_trans(struct sk_buff *skb, struct net_device *dev)
29656cb5156SArnaldo Carvalho de Melo {
29756cb5156SArnaldo Carvalho de Melo skb->dev = dev;
298459a98edSArnaldo Carvalho de Melo skb_reset_mac_header(skb);
29956cb5156SArnaldo Carvalho de Melo skb->pkt_type = PACKET_HOST;
30056cb5156SArnaldo Carvalho de Melo return htons(ETH_P_AX25);
30156cb5156SArnaldo Carvalho de Melo }
30256cb5156SArnaldo Carvalho de Melo
3031da177e4SLinus Torvalds /* af_ax25.c */
3041da177e4SLinus Torvalds extern struct hlist_head ax25_list;
3051da177e4SLinus Torvalds extern spinlock_t ax25_list_lock;
306c1d8f804SJoe Perches void ax25_cb_add(ax25_cb *);
3071da177e4SLinus Torvalds struct sock *ax25_find_listener(ax25_address *, int, struct net_device *, int);
3081da177e4SLinus Torvalds struct sock *ax25_get_socket(ax25_address *, ax25_address *, int);
309c045ad2cSJakub Kicinski ax25_cb *ax25_find_cb(const ax25_address *, ax25_address *, ax25_digi *,
310c1d8f804SJoe Perches struct net_device *);
311c1d8f804SJoe Perches void ax25_send_to_raw(ax25_address *, struct sk_buff *, int);
312c1d8f804SJoe Perches void ax25_destroy_socket(ax25_cb *);
313c1d8f804SJoe Perches ax25_cb * __must_check ax25_create_cb(void);
314c1d8f804SJoe Perches void ax25_fillin_cb(ax25_cb *, ax25_dev *);
315c1d8f804SJoe Perches struct sock *ax25_make_new(struct sock *, struct ax25_dev *);
3161da177e4SLinus Torvalds
3171da177e4SLinus Torvalds /* ax25_addr.c */
31815b1c0e8SRalf Baechle extern const ax25_address ax25_bcast;
31915b1c0e8SRalf Baechle extern const ax25_address ax25_defaddr;
32015b1c0e8SRalf Baechle extern const ax25_address null_ax25_address;
321c1d8f804SJoe Perches char *ax2asc(char *buf, const ax25_address *);
322c1d8f804SJoe Perches void asc2ax(ax25_address *addr, const char *callsign);
323c1d8f804SJoe Perches int ax25cmp(const ax25_address *, const ax25_address *);
324c1d8f804SJoe Perches int ax25digicmp(const ax25_digi *, const ax25_digi *);
325c1d8f804SJoe Perches const unsigned char *ax25_addr_parse(const unsigned char *, int,
326e8cc49bbSRalf Baechle ax25_address *, ax25_address *, ax25_digi *, int *, int *);
327c1d8f804SJoe Perches int ax25_addr_build(unsigned char *, const ax25_address *,
328e8cc49bbSRalf Baechle const ax25_address *, const ax25_digi *, int, int);
329c1d8f804SJoe Perches int ax25_addr_size(const ax25_digi *);
330c1d8f804SJoe Perches void ax25_digi_invert(const ax25_digi *, ax25_digi *);
3311da177e4SLinus Torvalds
3321da177e4SLinus Torvalds /* ax25_dev.c */
3331da177e4SLinus Torvalds extern spinlock_t ax25_dev_lock;
3341da177e4SLinus Torvalds
33519ff13f2SDavid Ahern #if IS_ENABLED(CONFIG_AX25)
ax25_dev_ax25dev(const struct net_device * dev)336*7705d8a7SEric Dumazet static inline ax25_dev *ax25_dev_ax25dev(const struct net_device *dev)
3371da177e4SLinus Torvalds {
338*7705d8a7SEric Dumazet return rcu_dereference_rtnl(dev->ax25_ptr);
3391da177e4SLinus Torvalds }
34019ff13f2SDavid Ahern #endif
3411da177e4SLinus Torvalds
342c1d8f804SJoe Perches ax25_dev *ax25_addr_ax25dev(ax25_address *);
343c1d8f804SJoe Perches void ax25_dev_device_up(struct net_device *);
344c1d8f804SJoe Perches void ax25_dev_device_down(struct net_device *);
345c1d8f804SJoe Perches int ax25_fwd_ioctl(unsigned int, struct ax25_fwd_struct *);
346c1d8f804SJoe Perches struct net_device *ax25_fwd_dev(struct net_device *);
347c1d8f804SJoe Perches void ax25_dev_free(void);
3481da177e4SLinus Torvalds
3491da177e4SLinus Torvalds /* ax25_ds_in.c */
350c1d8f804SJoe Perches int ax25_ds_frame_in(ax25_cb *, struct sk_buff *, int);
3511da177e4SLinus Torvalds
3521da177e4SLinus Torvalds /* ax25_ds_subr.c */
353c1d8f804SJoe Perches void ax25_ds_nr_error_recovery(ax25_cb *);
354c1d8f804SJoe Perches void ax25_ds_enquiry_response(ax25_cb *);
355c1d8f804SJoe Perches void ax25_ds_establish_data_link(ax25_cb *);
356c1d8f804SJoe Perches void ax25_dev_dama_off(ax25_dev *);
357c1d8f804SJoe Perches void ax25_dama_on(ax25_cb *);
358c1d8f804SJoe Perches void ax25_dama_off(ax25_cb *);
3591da177e4SLinus Torvalds
3601da177e4SLinus Torvalds /* ax25_ds_timer.c */
361c1d8f804SJoe Perches void ax25_ds_setup_timer(ax25_dev *);
362c1d8f804SJoe Perches void ax25_ds_set_timer(ax25_dev *);
363c1d8f804SJoe Perches void ax25_ds_del_timer(ax25_dev *);
364c1d8f804SJoe Perches void ax25_ds_timer(ax25_cb *);
365c1d8f804SJoe Perches void ax25_ds_t1_timeout(ax25_cb *);
366c1d8f804SJoe Perches void ax25_ds_heartbeat_expiry(ax25_cb *);
367c1d8f804SJoe Perches void ax25_ds_t3timer_expiry(ax25_cb *);
368c1d8f804SJoe Perches void ax25_ds_idletimer_expiry(ax25_cb *);
3691da177e4SLinus Torvalds
3701da177e4SLinus Torvalds /* ax25_iface.c */
3718d5cf596SRalf Baechle
3728d5cf596SRalf Baechle struct ax25_protocol {
3738d5cf596SRalf Baechle struct ax25_protocol *next;
3748d5cf596SRalf Baechle unsigned int pid;
3758d5cf596SRalf Baechle int (*func)(struct sk_buff *, ax25_cb *);
3768d5cf596SRalf Baechle };
3778d5cf596SRalf Baechle
378c1d8f804SJoe Perches void ax25_register_pid(struct ax25_protocol *ap);
379c1d8f804SJoe Perches void ax25_protocol_release(unsigned int);
380a4282717SRalf Baechle
381a4282717SRalf Baechle struct ax25_linkfail {
382a4282717SRalf Baechle struct hlist_node lf_node;
383a4282717SRalf Baechle void (*func)(ax25_cb *, int);
384a4282717SRalf Baechle };
385a4282717SRalf Baechle
386c1d8f804SJoe Perches void ax25_linkfail_register(struct ax25_linkfail *lf);
387c1d8f804SJoe Perches void ax25_linkfail_release(struct ax25_linkfail *lf);
388c045ad2cSJakub Kicinski int __must_check ax25_listen_register(const ax25_address *,
389c045ad2cSJakub Kicinski struct net_device *);
390c045ad2cSJakub Kicinski void ax25_listen_release(const ax25_address *, struct net_device *);
391c1d8f804SJoe Perches int(*ax25_protocol_function(unsigned int))(struct sk_buff *, ax25_cb *);
392c045ad2cSJakub Kicinski int ax25_listen_mine(const ax25_address *, struct net_device *);
393c1d8f804SJoe Perches void ax25_link_failed(ax25_cb *, int);
394c1d8f804SJoe Perches int ax25_protocol_is_registered(unsigned int);
3951da177e4SLinus Torvalds
3961da177e4SLinus Torvalds /* ax25_in.c */
397c1d8f804SJoe Perches int ax25_rx_iframe(ax25_cb *, struct sk_buff *);
398c1d8f804SJoe Perches int ax25_kiss_rcv(struct sk_buff *, struct net_device *, struct packet_type *,
399c1d8f804SJoe Perches struct net_device *);
4001da177e4SLinus Torvalds
4011da177e4SLinus Torvalds /* ax25_ip.c */
4021d5da757SEric W. Biederman netdev_tx_t ax25_ip_xmit(struct sk_buff *skb);
4033b04dddeSStephen Hemminger extern const struct header_ops ax25_header_ops;
4041da177e4SLinus Torvalds
4051da177e4SLinus Torvalds /* ax25_out.c */
406c045ad2cSJakub Kicinski ax25_cb *ax25_send_frame(struct sk_buff *, int, const ax25_address *,
407c045ad2cSJakub Kicinski ax25_address *, ax25_digi *, struct net_device *);
408c1d8f804SJoe Perches void ax25_output(ax25_cb *, int, struct sk_buff *);
409c1d8f804SJoe Perches void ax25_kick(ax25_cb *);
410c1d8f804SJoe Perches void ax25_transmit_buffer(ax25_cb *, struct sk_buff *, int);
411c1d8f804SJoe Perches void ax25_queue_xmit(struct sk_buff *skb, struct net_device *dev);
412c1d8f804SJoe Perches int ax25_check_iframes_acked(ax25_cb *, unsigned short);
4131da177e4SLinus Torvalds
4141da177e4SLinus Torvalds /* ax25_route.c */
415c1d8f804SJoe Perches void ax25_rt_device_down(struct net_device *);
416c1d8f804SJoe Perches int ax25_rt_ioctl(unsigned int, void __user *);
417fddda2b7SChristoph Hellwig extern const struct seq_operations ax25_rt_seqops;
418c1d8f804SJoe Perches ax25_route *ax25_get_route(ax25_address *addr, struct net_device *dev);
419c1d8f804SJoe Perches int ax25_rt_autobind(ax25_cb *, ax25_address *);
420c1d8f804SJoe Perches struct sk_buff *ax25_rt_build_path(struct sk_buff *, ax25_address *,
421c1d8f804SJoe Perches ax25_address *, ax25_digi *);
422c1d8f804SJoe Perches void ax25_rt_free(void);
4231da177e4SLinus Torvalds
4241da177e4SLinus Torvalds /* ax25_std_in.c */
425c1d8f804SJoe Perches int ax25_std_frame_in(ax25_cb *, struct sk_buff *, int);
4261da177e4SLinus Torvalds
4271da177e4SLinus Torvalds /* ax25_std_subr.c */
428c1d8f804SJoe Perches void ax25_std_nr_error_recovery(ax25_cb *);
429c1d8f804SJoe Perches void ax25_std_establish_data_link(ax25_cb *);
430c1d8f804SJoe Perches void ax25_std_transmit_enquiry(ax25_cb *);
431c1d8f804SJoe Perches void ax25_std_enquiry_response(ax25_cb *);
432c1d8f804SJoe Perches void ax25_std_timeout_response(ax25_cb *);
4331da177e4SLinus Torvalds
4341da177e4SLinus Torvalds /* ax25_std_timer.c */
435c1d8f804SJoe Perches void ax25_std_heartbeat_expiry(ax25_cb *);
436c1d8f804SJoe Perches void ax25_std_t1timer_expiry(ax25_cb *);
437c1d8f804SJoe Perches void ax25_std_t2timer_expiry(ax25_cb *);
438c1d8f804SJoe Perches void ax25_std_t3timer_expiry(ax25_cb *);
439c1d8f804SJoe Perches void ax25_std_idletimer_expiry(ax25_cb *);
4401da177e4SLinus Torvalds
4411da177e4SLinus Torvalds /* ax25_subr.c */
442c1d8f804SJoe Perches void ax25_clear_queues(ax25_cb *);
443c1d8f804SJoe Perches void ax25_frames_acked(ax25_cb *, unsigned short);
444c1d8f804SJoe Perches void ax25_requeue_frames(ax25_cb *);
445c1d8f804SJoe Perches int ax25_validate_nr(ax25_cb *, unsigned short);
446c1d8f804SJoe Perches int ax25_decode(ax25_cb *, struct sk_buff *, int *, int *, int *);
447c1d8f804SJoe Perches void ax25_send_control(ax25_cb *, int, int, int);
448c1d8f804SJoe Perches void ax25_return_dm(struct net_device *, ax25_address *, ax25_address *,
449c1d8f804SJoe Perches ax25_digi *);
450c1d8f804SJoe Perches void ax25_calculate_t1(ax25_cb *);
451c1d8f804SJoe Perches void ax25_calculate_rtt(ax25_cb *);
452c1d8f804SJoe Perches void ax25_disconnect(ax25_cb *, int);
4531da177e4SLinus Torvalds
4541da177e4SLinus Torvalds /* ax25_timer.c */
455c1d8f804SJoe Perches void ax25_setup_timers(ax25_cb *);
456c1d8f804SJoe Perches void ax25_start_heartbeat(ax25_cb *);
457c1d8f804SJoe Perches void ax25_start_t1timer(ax25_cb *);
458c1d8f804SJoe Perches void ax25_start_t2timer(ax25_cb *);
459c1d8f804SJoe Perches void ax25_start_t3timer(ax25_cb *);
460c1d8f804SJoe Perches void ax25_start_idletimer(ax25_cb *);
461c1d8f804SJoe Perches void ax25_stop_heartbeat(ax25_cb *);
462c1d8f804SJoe Perches void ax25_stop_t1timer(ax25_cb *);
463c1d8f804SJoe Perches void ax25_stop_t2timer(ax25_cb *);
464c1d8f804SJoe Perches void ax25_stop_t3timer(ax25_cb *);
465c1d8f804SJoe Perches void ax25_stop_idletimer(ax25_cb *);
466c1d8f804SJoe Perches int ax25_t1timer_running(ax25_cb *);
467c1d8f804SJoe Perches unsigned long ax25_display_timer(struct timer_list *);
4681da177e4SLinus Torvalds
4691da177e4SLinus Torvalds /* ax25_uid.c */
4701da177e4SLinus Torvalds extern int ax25_uid_policy;
471c1d8f804SJoe Perches ax25_uid_assoc *ax25_findbyuid(kuid_t);
472c1d8f804SJoe Perches int __must_check ax25_uid_ioctl(int, struct sockaddr_ax25 *);
473fddda2b7SChristoph Hellwig extern const struct seq_operations ax25_uid_seqops;
474c1d8f804SJoe Perches void ax25_uid_free(void);
4751da177e4SLinus Torvalds
4761da177e4SLinus Torvalds /* sysctl_net_ax25.c */
4771da177e4SLinus Torvalds #ifdef CONFIG_SYSCTL
478c1d8f804SJoe Perches int ax25_register_dev_sysctl(ax25_dev *ax25_dev);
479c1d8f804SJoe Perches void ax25_unregister_dev_sysctl(ax25_dev *ax25_dev);
4801da177e4SLinus Torvalds #else
ax25_register_dev_sysctl(ax25_dev * ax25_dev)481b9898507SEric W. Biederman static inline int ax25_register_dev_sysctl(ax25_dev *ax25_dev) { return 0; }
ax25_unregister_dev_sysctl(ax25_dev * ax25_dev)482b9898507SEric W. Biederman static inline void ax25_unregister_dev_sysctl(ax25_dev *ax25_dev) {}
4831da177e4SLinus Torvalds #endif /* CONFIG_SYSCTL */
4841da177e4SLinus Torvalds
4851da177e4SLinus Torvalds #endif
486