diff options
author | Ralf Baechle <ralf@linux-mips.org> | 2005-09-12 17:27:37 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2005-09-12 17:27:37 -0400 |
commit | e21ce8c7c013fb223a002c70bb0a547de6c26c12 (patch) | |
tree | 767b9aae7bdd50cdf867f3cdc1a3e214692146e1 /include | |
parent | d2ce4bc340946d5b78484d638ac10df958c4c3bf (diff) |
[NETROM]: Implement G8PZT Circuit reset for NET/ROM
NET/ROM is lacking a connection reset like TCP's RST flag which at times
may result in a connecting having to slowly timing out instead of just being
reset. An earlier attempt to reset the connection by sending a
NR_CONNACK | NR_CHOKE_FLAG transport was inacceptable as it did result in
crashes of BPQ systems. An alternative approach of introducing a new
transport type 7 (NR_RESET) has be implemented several years ago in
Paula Jayne Dowie G8PZT's Xrouter.
Implement NR_RESET for Linux's NET/ROM but like any messing with the state
engine consider this experimental for now and thus control it by a sysctl
(net.netrom.reset) which for the time being defaults to off.
Signed-off-by: Ralf Baechle DL5RB <ralf@linux-mips.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/sysctl.h | 3 | ||||
-rw-r--r-- | include/net/netrom.h | 27 |
2 files changed, 28 insertions, 2 deletions
diff --git a/include/linux/sysctl.h b/include/linux/sysctl.h index 532a6c5c24e9..3a29a9f9b451 100644 --- a/include/linux/sysctl.h +++ b/include/linux/sysctl.h | |||
@@ -544,7 +544,8 @@ enum { | |||
544 | NET_NETROM_TRANSPORT_REQUESTED_WINDOW_SIZE=8, | 544 | NET_NETROM_TRANSPORT_REQUESTED_WINDOW_SIZE=8, |
545 | NET_NETROM_TRANSPORT_NO_ACTIVITY_TIMEOUT=9, | 545 | NET_NETROM_TRANSPORT_NO_ACTIVITY_TIMEOUT=9, |
546 | NET_NETROM_ROUTING_CONTROL=10, | 546 | NET_NETROM_ROUTING_CONTROL=10, |
547 | NET_NETROM_LINK_FAILS_COUNT=11 | 547 | NET_NETROM_LINK_FAILS_COUNT=11, |
548 | NET_NETROM_RESET=12 | ||
548 | }; | 549 | }; |
549 | 550 | ||
550 | /* /proc/sys/net/ax25 */ | 551 | /* /proc/sys/net/ax25 */ |
diff --git a/include/net/netrom.h b/include/net/netrom.h index 45f2c7616d8b..ad05d7a3c55d 100644 --- a/include/net/netrom.h +++ b/include/net/netrom.h | |||
@@ -22,6 +22,7 @@ | |||
22 | #define NR_DISCACK 0x04 | 22 | #define NR_DISCACK 0x04 |
23 | #define NR_INFO 0x05 | 23 | #define NR_INFO 0x05 |
24 | #define NR_INFOACK 0x06 | 24 | #define NR_INFOACK 0x06 |
25 | #define NR_RESET 0x07 | ||
25 | 26 | ||
26 | #define NR_CHOKE_FLAG 0x80 | 27 | #define NR_CHOKE_FLAG 0x80 |
27 | #define NR_NAK_FLAG 0x40 | 28 | #define NR_NAK_FLAG 0x40 |
@@ -51,6 +52,7 @@ enum { | |||
51 | #define NR_DEFAULT_TTL 16 /* Default Time To Live - 16 */ | 52 | #define NR_DEFAULT_TTL 16 /* Default Time To Live - 16 */ |
52 | #define NR_DEFAULT_ROUTING 1 /* Is routing enabled ? */ | 53 | #define NR_DEFAULT_ROUTING 1 /* Is routing enabled ? */ |
53 | #define NR_DEFAULT_FAILS 2 /* Link fails until route fails */ | 54 | #define NR_DEFAULT_FAILS 2 /* Link fails until route fails */ |
55 | #define NR_DEFAULT_RESET 0 /* Sent / accept reset cmds? */ | ||
54 | 56 | ||
55 | #define NR_MODULUS 256 | 57 | #define NR_MODULUS 256 |
56 | #define NR_MAX_WINDOW_SIZE 127 /* Maximum Window Allowable - 127 */ | 58 | #define NR_MAX_WINDOW_SIZE 127 /* Maximum Window Allowable - 127 */ |
@@ -176,6 +178,8 @@ extern int sysctl_netrom_transport_requested_window_size; | |||
176 | extern int sysctl_netrom_transport_no_activity_timeout; | 178 | extern int sysctl_netrom_transport_no_activity_timeout; |
177 | extern int sysctl_netrom_routing_control; | 179 | extern int sysctl_netrom_routing_control; |
178 | extern int sysctl_netrom_link_fails_count; | 180 | extern int sysctl_netrom_link_fails_count; |
181 | extern int sysctl_netrom_reset_circuit; | ||
182 | |||
179 | extern int nr_rx_frame(struct sk_buff *, struct net_device *); | 183 | extern int nr_rx_frame(struct sk_buff *, struct net_device *); |
180 | extern void nr_destroy_socket(struct sock *); | 184 | extern void nr_destroy_socket(struct sock *); |
181 | 185 | ||
@@ -218,7 +222,28 @@ extern void nr_requeue_frames(struct sock *); | |||
218 | extern int nr_validate_nr(struct sock *, unsigned short); | 222 | extern int nr_validate_nr(struct sock *, unsigned short); |
219 | extern int nr_in_rx_window(struct sock *, unsigned short); | 223 | extern int nr_in_rx_window(struct sock *, unsigned short); |
220 | extern void nr_write_internal(struct sock *, int); | 224 | extern void nr_write_internal(struct sock *, int); |
221 | extern void nr_transmit_refusal(struct sk_buff *, int); | 225 | |
226 | extern void __nr_transmit_reply(struct sk_buff *skb, int mine, | ||
227 | unsigned char cmdflags); | ||
228 | |||
229 | /* | ||
230 | * This routine is called when a Connect Acknowledge with the Choke Flag | ||
231 | * set is needed to refuse a connection. | ||
232 | */ | ||
233 | #define nr_transmit_refusal(skb, mine) \ | ||
234 | do { \ | ||
235 | __nr_transmit_reply((skb), (mine), NR_CONNACK | NR_CHOKE_FLAG); \ | ||
236 | } while (0) | ||
237 | |||
238 | /* | ||
239 | * This routine is called when we don't have a circuit matching an incoming | ||
240 | * NET/ROM packet. This is an G8PZT Xrouter extension. | ||
241 | */ | ||
242 | #define nr_transmit_reset(skb, mine) \ | ||
243 | do { \ | ||
244 | __nr_transmit_reply((skb), (mine), NR_RESET); \ | ||
245 | } while (0) | ||
246 | |||
222 | extern void nr_disconnect(struct sock *, int); | 247 | extern void nr_disconnect(struct sock *, int); |
223 | 248 | ||
224 | /* nr_timer.c */ | 249 | /* nr_timer.c */ |