hc
2024-08-19 a51341d8c7882adfad4f167bc7c3ca616908b53d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
/* SPDX-License-Identifier: GPL-2.0 */
/*
 *    Declarations of Rose type objects.
 *
 *    Jonathan Naylor G4KLX    25/8/96
 */
 
#ifndef _ROSE_H
#define _ROSE_H 
 
#include <linux/rose.h>
#include <net/sock.h>
 
#define    ROSE_ADDR_LEN            5
 
#define    ROSE_MIN_LEN            3
 
#define    ROSE_CALL_REQ_ADDR_LEN_OFF    3
#define    ROSE_CALL_REQ_ADDR_LEN_VAL    0xAA    /* each address is 10 digits */
#define    ROSE_CALL_REQ_DEST_ADDR_OFF    4
#define    ROSE_CALL_REQ_SRC_ADDR_OFF    9
#define    ROSE_CALL_REQ_FACILITIES_OFF    14
 
#define    ROSE_GFI            0x10
#define    ROSE_Q_BIT            0x80
#define    ROSE_D_BIT            0x40
#define    ROSE_M_BIT            0x10
 
#define    ROSE_CALL_REQUEST        0x0B
#define    ROSE_CALL_ACCEPTED        0x0F
#define    ROSE_CLEAR_REQUEST        0x13
#define    ROSE_CLEAR_CONFIRMATION        0x17
#define    ROSE_DATA            0x00
#define    ROSE_INTERRUPT            0x23
#define    ROSE_INTERRUPT_CONFIRMATION    0x27
#define    ROSE_RR                0x01
#define    ROSE_RNR            0x05
#define    ROSE_REJ            0x09
#define    ROSE_RESET_REQUEST        0x1B
#define    ROSE_RESET_CONFIRMATION        0x1F
#define    ROSE_REGISTRATION_REQUEST    0xF3
#define    ROSE_REGISTRATION_CONFIRMATION    0xF7
#define    ROSE_RESTART_REQUEST        0xFB
#define    ROSE_RESTART_CONFIRMATION    0xFF
#define    ROSE_DIAGNOSTIC            0xF1
#define    ROSE_ILLEGAL            0xFD
 
/* Define Link State constants. */
 
enum {
   ROSE_STATE_0,            /* Ready */
   ROSE_STATE_1,            /* Awaiting Call Accepted */
   ROSE_STATE_2,            /* Awaiting Clear Confirmation */
   ROSE_STATE_3,            /* Data Transfer */
   ROSE_STATE_4,            /* Awaiting Reset Confirmation */
   ROSE_STATE_5            /* Deferred Call Acceptance */
};
 
#define ROSE_DEFAULT_T0            180000        /* Default T10 T20 value */
#define ROSE_DEFAULT_T1            200000        /* Default T11 T21 value */
#define ROSE_DEFAULT_T2            180000        /* Default T12 T22 value */
#define    ROSE_DEFAULT_T3            180000        /* Default T13 T23 value */
#define    ROSE_DEFAULT_HB            5000        /* Default Holdback value */
#define    ROSE_DEFAULT_IDLE        0        /* No Activity Timeout - none */
#define    ROSE_DEFAULT_ROUTING        1        /* Default routing flag */
#define    ROSE_DEFAULT_FAIL_TIMEOUT    120000        /* Time until link considered usable */
#define    ROSE_DEFAULT_MAXVC        50        /* Maximum number of VCs per neighbour */
#define    ROSE_DEFAULT_WINDOW_SIZE    7        /* Default window size */
 
#define ROSE_MODULUS             8
#define    ROSE_MAX_PACKET_SIZE        251        /* Maximum packet size */
 
#define    ROSE_COND_ACK_PENDING        0x01
#define    ROSE_COND_PEER_RX_BUSY        0x02
#define    ROSE_COND_OWN_RX_BUSY        0x04
 
#define    FAC_NATIONAL            0x00
#define    FAC_CCITT            0x0F
 
#define    FAC_NATIONAL_RAND        0x7F
#define    FAC_NATIONAL_FLAGS        0x3F
#define    FAC_NATIONAL_DEST_DIGI        0xE9
#define    FAC_NATIONAL_SRC_DIGI        0xEB
#define    FAC_NATIONAL_FAIL_CALL        0xED
#define    FAC_NATIONAL_FAIL_ADD        0xEE
#define    FAC_NATIONAL_DIGIS            0xEF
 
#define    FAC_CCITT_DEST_NSAP        0xC9
#define    FAC_CCITT_SRC_NSAP        0xCB
 
struct rose_neigh {
   struct rose_neigh    *next;
   ax25_address        callsign;
   ax25_digi        *digipeat;
   ax25_cb            *ax25;
   struct net_device        *dev;
   unsigned short        count;
   unsigned short        use;
   unsigned int        number;
   char            restarted;
   char            dce_mode;
   char            loopback;
   struct sk_buff_head    queue;
   struct timer_list    t0timer;
   struct timer_list    ftimer;
};
 
struct rose_node {
   struct rose_node    *next;
   rose_address        address;
   unsigned short        mask;
   unsigned char        count;
   char            loopback;
   struct rose_neigh    *neighbour[3];
};
 
struct rose_route {
   struct rose_route    *next;
   unsigned int        lci1, lci2;
   rose_address        src_addr, dest_addr;
   ax25_address        src_call, dest_call;
   struct rose_neigh     *neigh1, *neigh2;
   unsigned int        rand;
};
 
struct rose_sock {
   struct sock        sock;
   rose_address        source_addr,   dest_addr;
   ax25_address        source_call,   dest_call;
   unsigned char        source_ndigis, dest_ndigis;
   ax25_address        source_digis[ROSE_MAX_DIGIS];
   ax25_address        dest_digis[ROSE_MAX_DIGIS];
   struct rose_neigh    *neighbour;
   struct net_device        *device;
   unsigned int        lci, rand;
   unsigned char        state, condition, qbitincl, defer;
   unsigned char        cause, diagnostic;
   unsigned short        vs, vr, va, vl;
   unsigned long        t1, t2, t3, hb, idle;
#ifdef M_BIT
   unsigned short        fraglen;
   struct sk_buff_head    frag_queue;
#endif
   struct sk_buff_head    ack_queue;
   struct rose_facilities_struct facilities;
   struct timer_list    timer;
   struct timer_list    idletimer;
};
 
#define rose_sk(sk) ((struct rose_sock *)(sk))
 
/* af_rose.c */
extern ax25_address rose_callsign;
extern int  sysctl_rose_restart_request_timeout;
extern int  sysctl_rose_call_request_timeout;
extern int  sysctl_rose_reset_request_timeout;
extern int  sysctl_rose_clear_request_timeout;
extern int  sysctl_rose_no_activity_timeout;
extern int  sysctl_rose_ack_hold_back_timeout;
extern int  sysctl_rose_routing_control;
extern int  sysctl_rose_link_fail_timeout;
extern int  sysctl_rose_maximum_vcs;
extern int  sysctl_rose_window_size;
 
int rosecmp(rose_address *, rose_address *);
int rosecmpm(rose_address *, rose_address *, unsigned short);
char *rose2asc(char *buf, const rose_address *);
struct sock *rose_find_socket(unsigned int, struct rose_neigh *);
void rose_kill_by_neigh(struct rose_neigh *);
unsigned int rose_new_lci(struct rose_neigh *);
int rose_rx_call_request(struct sk_buff *, struct net_device *,
            struct rose_neigh *, unsigned int);
void rose_destroy_socket(struct sock *);
 
/* rose_dev.c */
void rose_setup(struct net_device *);
 
/* rose_in.c */
int rose_process_rx_frame(struct sock *, struct sk_buff *);
 
/* rose_link.c */
void rose_start_ftimer(struct rose_neigh *);
void rose_stop_ftimer(struct rose_neigh *);
void rose_stop_t0timer(struct rose_neigh *);
int rose_ftimer_running(struct rose_neigh *);
void rose_link_rx_restart(struct sk_buff *, struct rose_neigh *,
             unsigned short);
void rose_transmit_clear_request(struct rose_neigh *, unsigned int,
                unsigned char, unsigned char);
void rose_transmit_link(struct sk_buff *, struct rose_neigh *);
 
/* rose_loopback.c */
void rose_loopback_init(void);
void rose_loopback_clear(void);
int rose_loopback_queue(struct sk_buff *, struct rose_neigh *);
 
/* rose_out.c */
void rose_kick(struct sock *);
void rose_enquiry_response(struct sock *);
 
/* rose_route.c */
extern struct rose_neigh *rose_loopback_neigh;
extern const struct seq_operations rose_neigh_seqops;
extern const struct seq_operations rose_node_seqops;
extern struct seq_operations rose_route_seqops;
 
void rose_add_loopback_neigh(void);
int __must_check rose_add_loopback_node(rose_address *);
void rose_del_loopback_node(rose_address *);
void rose_rt_device_down(struct net_device *);
void rose_link_device_down(struct net_device *);
struct net_device *rose_dev_first(void);
struct net_device *rose_dev_get(rose_address *);
struct rose_route *rose_route_free_lci(unsigned int, struct rose_neigh *);
struct rose_neigh *rose_get_neigh(rose_address *, unsigned char *,
                 unsigned char *, int);
int rose_rt_ioctl(unsigned int, void __user *);
void rose_link_failed(ax25_cb *, int);
int rose_route_frame(struct sk_buff *, ax25_cb *);
void rose_rt_free(void);
 
/* rose_subr.c */
void rose_clear_queues(struct sock *);
void rose_frames_acked(struct sock *, unsigned short);
void rose_requeue_frames(struct sock *);
int rose_validate_nr(struct sock *, unsigned short);
void rose_write_internal(struct sock *, int);
int rose_decode(struct sk_buff *, int *, int *, int *, int *, int *);
int rose_parse_facilities(unsigned char *, unsigned int,
             struct rose_facilities_struct *);
void rose_disconnect(struct sock *, int, int, int);
 
/* rose_timer.c */
void rose_start_heartbeat(struct sock *);
void rose_start_t1timer(struct sock *);
void rose_start_t2timer(struct sock *);
void rose_start_t3timer(struct sock *);
void rose_start_hbtimer(struct sock *);
void rose_start_idletimer(struct sock *);
void rose_stop_heartbeat(struct sock *);
void rose_stop_timer(struct sock *);
void rose_stop_idletimer(struct sock *);
 
/* sysctl_net_rose.c */
void rose_register_sysctl(void);
void rose_unregister_sysctl(void);
 
#endif