Commit f7c8ad70 authored by Ralf Bächle's avatar Ralf Bächle

Implement locking of internal data for NET/ROM and ROSE.

Do socket locking for AX.25
Delete trailing whitespace.
Exchange prehistoric changelogs in headers with GPL + copyright header.
Reformat some of the NET/ROM and ROSE code to 80 columns.
parent e90d44a8
...@@ -207,7 +207,7 @@ extern spinlock_t ax25_list_lock; ...@@ -207,7 +207,7 @@ extern spinlock_t ax25_list_lock;
extern void ax25_free_cb(ax25_cb *); extern void ax25_free_cb(ax25_cb *);
extern void ax25_insert_socket(ax25_cb *); extern void ax25_insert_socket(ax25_cb *);
struct sock *ax25_find_listener(ax25_address *, int, struct net_device *, int); struct sock *ax25_find_listener(ax25_address *, int, struct net_device *, int);
struct sock *ax25_find_socket(ax25_address *, ax25_address *, int); struct sock *ax25_get_socket(ax25_address *, ax25_address *, int);
extern ax25_cb *ax25_find_cb(ax25_address *, ax25_address *, ax25_digi *, struct net_device *); extern ax25_cb *ax25_find_cb(ax25_address *, ax25_address *, ax25_digi *, struct net_device *);
extern struct sock *ax25_addr_match(ax25_address *); extern struct sock *ax25_addr_match(ax25_address *);
extern void ax25_send_to_raw(struct sock *, struct sk_buff *, int); extern void ax25_send_to_raw(struct sock *, struct sk_buff *, int);
......
...@@ -9,6 +9,26 @@ af_ax25.c:ax25_connect: ...@@ -9,6 +9,26 @@ af_ax25.c:ax25_connect:
return sock_error(sk); /* Always set at this point */ return sock_error(sk); /* Always set at this point */
} }
Do the ax25_list_lock, ax25_uid_lock, ax25_route_lock, protocol_list_lock, Do the ax25_list_lock, ax25_dev_lock, linkfail_lockreally, ax25_frag_lock and
ax25_dev_lock, linkfail_lockreally, ax25_frag_lock and listen_lock have to listen_lock have to be interrupt safe?
be interrupt safe?
A device might be deleted after lookup in the SIOCADDRT ioctl but before it's
being used.
Routes to a device begin taken down might be deleted by ax25_rt_device_down
but added by somebody else before the device has been deleted.
Introduce a clear locking strategy. What I've put there is simply an evil
hack to get the code to survive.
Massive amounts of lock_kernel / unlock_kernel are just a temporary solution to
get around the removal of SOCKOPS_WRAP. A serious locking strategy has to be
implemented.
The ax25_rt_find_route synopsys is pervert but I somehow had to deal with
the race caused by the static variable in it's previous implementation.
Implement proper socket locking in netrom and rose.
Check socket locking when ax25_rcv is sending to raw sockets. In particular
ax25_send_to_raw() seems fishy. Heck - ax25_rcv is fishy.
This diff is collapsed.
/* /*
* AX.25 release 037 * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* *
* This code REQUIRES 2.1.15 or higher/ NET3.038 * Copyright (C) Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk)
*
* This module:
* This module is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*
* Most of this code is based on the SDL diagrams published in the 7th
* ARRL Computer Networking Conference papers. The diagrams have mistakes
* in them, but are mostly correct. Before you modify the code could you
* read the SDL diagrams as the code is not obvious and probably very
* easy to break;
*
* History
* AX.25 036 Jonathan(G4KLX) Split from ax25_subr.c.
*/ */
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/socket.h> #include <linux/socket.h>
...@@ -165,14 +152,14 @@ unsigned char *ax25_addr_parse(unsigned char *buf, int len, ax25_address *src, a ...@@ -165,14 +152,14 @@ unsigned char *ax25_addr_parse(unsigned char *buf, int len, ax25_address *src, a
if (flags != NULL) { if (flags != NULL) {
*flags = 0; *flags = 0;
if (buf[6] & AX25_CBIT) if (buf[6] & AX25_CBIT)
*flags = AX25_COMMAND; *flags = AX25_COMMAND;
if (buf[13] & AX25_CBIT) if (buf[13] & AX25_CBIT)
*flags = AX25_RESPONSE; *flags = AX25_RESPONSE;
} }
if (dama != NULL) if (dama != NULL)
*dama = ~buf[13] & AX25_DAMA_FLAG; *dama = ~buf[13] & AX25_DAMA_FLAG;
/* Copy to, from */ /* Copy to, from */
...@@ -243,7 +230,7 @@ int ax25_addr_build(unsigned char *buf, ax25_address *src, ax25_address *dest, a ...@@ -243,7 +230,7 @@ int ax25_addr_build(unsigned char *buf, ax25_address *src, ax25_address *dest, a
if (d == NULL || d->ndigi == 0) { if (d == NULL || d->ndigi == 0) {
buf[6] |= AX25_EBIT; buf[6] |= AX25_EBIT;
return 2 * AX25_ADDR_LEN; return 2 * AX25_ADDR_LEN;
} }
buf += AX25_ADDR_LEN; buf += AX25_ADDR_LEN;
len += AX25_ADDR_LEN; len += AX25_ADDR_LEN;
...@@ -277,7 +264,7 @@ int ax25_addr_size(ax25_digi *dp) ...@@ -277,7 +264,7 @@ int ax25_addr_size(ax25_digi *dp)
return AX25_ADDR_LEN * (2 + dp->ndigi); return AX25_ADDR_LEN * (2 + dp->ndigi);
} }
/* /*
* Reverse Digipeat List. May not pass both parameters as same struct * Reverse Digipeat List. May not pass both parameters as same struct
*/ */
void ax25_digi_invert(ax25_digi *in, ax25_digi *out) void ax25_digi_invert(ax25_digi *in, ax25_digi *out)
......
/* /*
* AX.25 release 037 * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* *
* This code REQUIRES 2.1.15 or higher/ NET3.038 * Copyright (C) Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk)
*
* This module:
* This module is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*
* Other kernels modules in this kit are generally BSD derived. See the copyright headers.
*
*
* History
* AX.25 036 Jonathan(G4KLX) Split from ax25_route.c.
*/ */
#include <linux/config.h> #include <linux/config.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/types.h> #include <linux/types.h>
......
/* /*
* AX.25 release 037 * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* *
* This code REQUIRES 2.1.15 or higher/ NET3.038 * Copyright (C) Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk)
* * Copyright (C) Joerg Reuter DL1BKE (jreuter@yaina.de)
* This module:
* This module is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*
* Most of this code is based on the SDL diagrams published in the 7th
* ARRL Computer Networking Conference papers. The diagrams have mistakes
* in them, but are mostly correct. Before you modify the code could you
* read the SDL diagrams as the code is not obvious and probably very
* easy to break;
*
* History
* AX.25 036 Jonathan(G4KLX) Cloned from ax25_in.c
* Joerg(DL1BKE) Fixed it.
* AX.25 037 Jonathan(G4KLX) New timer architecture.
* Joerg(DL1BKE) ax25->n2count never got reset
*/ */
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/socket.h> #include <linux/socket.h>
...@@ -58,7 +43,7 @@ static int ax25_ds_state1_machine(ax25_cb *ax25, struct sk_buff *skb, int framet ...@@ -58,7 +43,7 @@ static int ax25_ds_state1_machine(ax25_cb *ax25, struct sk_buff *skb, int framet
ax25->window = ax25->ax25_dev->values[AX25_VALUES_WINDOW]; ax25->window = ax25->ax25_dev->values[AX25_VALUES_WINDOW];
ax25_send_control(ax25, AX25_UA, pf, AX25_RESPONSE); ax25_send_control(ax25, AX25_UA, pf, AX25_RESPONSE);
break; break;
case AX25_SABME: case AX25_SABME:
ax25->modulus = AX25_EMODULUS; ax25->modulus = AX25_EMODULUS;
ax25->window = ax25->ax25_dev->values[AX25_VALUES_EWINDOW]; ax25->window = ax25->ax25_dev->values[AX25_VALUES_EWINDOW];
...@@ -88,7 +73,7 @@ static int ax25_ds_state1_machine(ax25_cb *ax25, struct sk_buff *skb, int framet ...@@ -88,7 +73,7 @@ static int ax25_ds_state1_machine(ax25_cb *ax25, struct sk_buff *skb, int framet
ax25_dama_on(ax25); ax25_dama_on(ax25);
/* according to DK4EGs spec we are required to /* according to DK4EGs spec we are required to
* send a RR RESPONSE FINAL NR=0. * send a RR RESPONSE FINAL NR=0.
*/ */
ax25_std_enquiry_response(ax25); ax25_std_enquiry_response(ax25);
......
/* /*
* AX.25 release 037 * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* *
* This code REQUIRES 2.1.15 or higher/ NET3.038 * Copyright (C) Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk)
* * Copyright (C) Joerg Reuter DL1BKE (jreuter@yaina.de)
* This module:
* This module is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*
* Most of this code is based on the SDL diagrams published in the 7th
* ARRL Computer Networking Conference papers. The diagrams have mistakes
* in them, but are mostly correct. Before you modify the code could you
* read the SDL diagrams as the code is not obvious and probably very
* easy to break;
*
* History
* AX.25 036 Jonathan(G4KLX) Cloned from ax25_out.c and ax25_subr.c.
* Joerg(DL1BKE) Changed ax25_ds_enquiry_response(),
* fixed ax25_dama_on() and ax25_dama_off().
* AX.25 037 Jonathan(G4KLX) New timer architecture.
*/ */
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/socket.h> #include <linux/socket.h>
...@@ -75,7 +60,7 @@ void ax25_ds_enquiry_response(ax25_cb *ax25) ...@@ -75,7 +60,7 @@ void ax25_ds_enquiry_response(ax25_cb *ax25)
* DL1BKE-7->DB0PRA-6 DB0ACH <I C S3 R5> * DL1BKE-7->DB0PRA-6 DB0ACH <I C S3 R5>
* *
* Flexnet refuses to send us *any* I frame if we send * Flexnet refuses to send us *any* I frame if we send
* a REJ in case AX25_COND_REJECT is set. It is superfluous in * a REJ in case AX25_COND_REJECT is set. It is superfluous in
* this mode anyway (a RR or RNR invokes the retransmission). * this mode anyway (a RR or RNR invokes the retransmission).
* Is this a Flexnet bug? * Is this a Flexnet bug?
*/ */
...@@ -136,8 +121,8 @@ void ax25_ds_establish_data_link(ax25_cb *ax25) ...@@ -136,8 +121,8 @@ void ax25_ds_establish_data_link(ax25_cb *ax25)
/* /*
* :::FIXME::: * :::FIXME:::
* This is a kludge. Not all drivers recognize kiss commands. * This is a kludge. Not all drivers recognize kiss commands.
* We need a driver level request to switch duplex mode, that does * We need a driver level request to switch duplex mode, that does
* either SCC changing, PI config or KISS as required. Currently * either SCC changing, PI config or KISS as required. Currently
* this request isn't reliable. * this request isn't reliable.
*/ */
...@@ -168,7 +153,7 @@ static void ax25_kiss_cmd(ax25_dev *ax25_dev, unsigned char cmd, unsigned char p ...@@ -168,7 +153,7 @@ static void ax25_kiss_cmd(ax25_dev *ax25_dev, unsigned char cmd, unsigned char p
* A nasty problem arises if we count the number of DAMA connections * A nasty problem arises if we count the number of DAMA connections
* wrong, especially when connections on the device already existed * wrong, especially when connections on the device already existed
* and our network node (or the sysop) decides to turn on DAMA Master * and our network node (or the sysop) decides to turn on DAMA Master
* mode. We thus flag the 'real' slave connections with * mode. We thus flag the 'real' slave connections with
* ax25->dama_slave=1 and look on every disconnect if still slave * ax25->dama_slave=1 and look on every disconnect if still slave
* connections exist. * connections exist.
*/ */
......
/* /*
* AX.25 release 037 * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* *
* This code REQUIRES 2.1.15 or higher/ NET3.038 * Copyright (C) Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk)
* * Copyright (C) Joerg Reuter DL1BKE (jreuter@yaina.de)
* This module:
* This module is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*
* History
* AX.25 036 Jonathan(G4KLX) Cloned from ax25_timer.c.
* Joerg(DL1BKE) Added DAMA Slave Timeout timer
* AX.25 037 Jonathan(G4KLX) New timer architecture.
*/ */
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/socket.h> #include <linux/socket.h>
...@@ -42,7 +34,7 @@ static void ax25_ds_timeout(unsigned long); ...@@ -42,7 +34,7 @@ static void ax25_ds_timeout(unsigned long);
/* /*
* Add DAMA slave timeout timer to timer list. * Add DAMA slave timeout timer to timer list.
* Unlike the connection based timers the timeout function gets * Unlike the connection based timers the timeout function gets
* triggered every second. Please note that NET_AX25_DAMA_SLAVE_TIMEOUT * triggered every second. Please note that NET_AX25_DAMA_SLAVE_TIMEOUT
* (aka /proc/sys/net/ax25/{dev}/dama_slave_timeout) is still in * (aka /proc/sys/net/ax25/{dev}/dama_slave_timeout) is still in
* 1/10th of a second. * 1/10th of a second.
...@@ -83,15 +75,15 @@ static void ax25_ds_timeout(unsigned long arg) ...@@ -83,15 +75,15 @@ static void ax25_ds_timeout(unsigned long arg)
ax25_dev *ax25_dev = (struct ax25_dev *) arg; ax25_dev *ax25_dev = (struct ax25_dev *) arg;
unsigned long flags; unsigned long flags;
ax25_cb *ax25; ax25_cb *ax25;
if (ax25_dev == NULL || !ax25_dev->dama.slave) if (ax25_dev == NULL || !ax25_dev->dama.slave)
return; /* Yikes! */ return; /* Yikes! */
if (!ax25_dev->dama.slave_timeout || --ax25_dev->dama.slave_timeout) { if (!ax25_dev->dama.slave_timeout || --ax25_dev->dama.slave_timeout) {
ax25_ds_set_timer(ax25_dev); ax25_ds_set_timer(ax25_dev);
return; return;
} }
spin_lock_irqsave(&ax25_list_lock, flags); spin_lock_irqsave(&ax25_list_lock, flags);
for (ax25=ax25_list; ax25 != NULL; ax25 = ax25->next) { for (ax25=ax25_list; ax25 != NULL; ax25 = ax25->next) {
if (ax25->ax25_dev != ax25_dev || !(ax25->condition & AX25_COND_DAMA_MODE)) if (ax25->ax25_dev != ax25_dev || !(ax25->condition & AX25_COND_DAMA_MODE))
...@@ -101,7 +93,7 @@ static void ax25_ds_timeout(unsigned long arg) ...@@ -101,7 +93,7 @@ static void ax25_ds_timeout(unsigned long arg)
ax25_disconnect(ax25, ETIMEDOUT); ax25_disconnect(ax25, ETIMEDOUT);
} }
spin_unlock_irqrestore(&ax25_list_lock, flags); spin_unlock_irqrestore(&ax25_list_lock, flags);
ax25_dev_dama_off(ax25_dev); ax25_dev_dama_off(ax25_dev);
} }
...@@ -123,7 +115,7 @@ void ax25_ds_heartbeat_expiry(ax25_cb *ax25) ...@@ -123,7 +115,7 @@ void ax25_ds_heartbeat_expiry(ax25_cb *ax25)
* Check the state of the receive buffer. * Check the state of the receive buffer.
*/ */
if (ax25->sk != NULL) { if (ax25->sk != NULL) {
if (atomic_read(&ax25->sk->rmem_alloc) < (ax25->sk->rcvbuf / 2) && if (atomic_read(&ax25->sk->rmem_alloc) < (ax25->sk->rcvbuf / 2) &&
(ax25->condition & AX25_COND_OWN_RX_BUSY)) { (ax25->condition & AX25_COND_OWN_RX_BUSY)) {
ax25->condition &= ~AX25_COND_OWN_RX_BUSY; ax25->condition &= ~AX25_COND_OWN_RX_BUSY;
ax25->condition &= ~AX25_COND_ACK_PENDING; ax25->condition &= ~AX25_COND_ACK_PENDING;
...@@ -135,7 +127,7 @@ void ax25_ds_heartbeat_expiry(ax25_cb *ax25) ...@@ -135,7 +127,7 @@ void ax25_ds_heartbeat_expiry(ax25_cb *ax25)
ax25_start_heartbeat(ax25); ax25_start_heartbeat(ax25);
} }
/* dl1bke 960114: T3 works much like the IDLE timeout, but /* dl1bke 960114: T3 works much like the IDLE timeout, but
* gets reloaded with every frame for this * gets reloaded with every frame for this
* connection. * connection.
...@@ -173,7 +165,7 @@ void ax25_ds_idletimer_expiry(ax25_cb *ax25) ...@@ -173,7 +165,7 @@ void ax25_ds_idletimer_expiry(ax25_cb *ax25)
} }
/* dl1bke 960114: The DAMA protocol requires to send data and SABM/DISC /* dl1bke 960114: The DAMA protocol requires to send data and SABM/DISC
* within the poll of any connected channel. Remember * within the poll of any connected channel. Remember
* that we are not allowed to send anything unless we * that we are not allowed to send anything unless we
* get polled by the Master. * get polled by the Master.
* *
...@@ -181,9 +173,9 @@ void ax25_ds_idletimer_expiry(ax25_cb *ax25) ...@@ -181,9 +173,9 @@ void ax25_ds_idletimer_expiry(ax25_cb *ax25)
* ax25_enquiry_response(). * ax25_enquiry_response().
*/ */
void ax25_ds_t1_timeout(ax25_cb *ax25) void ax25_ds_t1_timeout(ax25_cb *ax25)
{ {
switch (ax25->state) { switch (ax25->state) {
case AX25_STATE_1: case AX25_STATE_1:
if (ax25->n2count == ax25->n2) { if (ax25->n2count == ax25->n2) {
if (ax25->modulus == AX25_MODULUS) { if (ax25->modulus == AX25_MODULUS) {
ax25_disconnect(ax25, ETIMEDOUT); ax25_disconnect(ax25, ETIMEDOUT);
......
/* /*
* AX.25 release 037 * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* *
* This code REQUIRES 2.1.15 or higher/ NET3.038 * Copyright (C) Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk)
*
* This module:
* This module is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*
* History
* AX.25 036 Jonathan(G4KLX) Split from ax25_timer.c.
*/ */
#include <linux/config.h> #include <linux/config.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/types.h> #include <linux/types.h>
......
/* /*
* AX.25 release 037 * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* *
* This code REQUIRES 2.1.15 or higher/ NET3.038 * Copyright (C) Alan Cox GW4PTS (alan@lxorguk.ukuu.org.uk)
* * Copyright (C) Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk)
* This module: * Copyright (C) Joerg Reuter DL1BKE (jreuter@yaina.de)
* This module is free software; you can redistribute it and/or * Copyright (C) Hans-Joachim Hetscher DD8NE (dd8ne@bnv-bamberg.de)
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*
* Most of this code is based on the SDL diagrams published in the 7th
* ARRL Computer Networking Conference papers. The diagrams have mistakes
* in them, but are mostly correct. Before you modify the code could you
* read the SDL diagrams as the code is not obvious and probably very
* easy to break;
*
* History
* AX.25 028a Jonathan(G4KLX) New state machine based on SDL diagrams.
* AX.25 028b Jonathan(G4KLX) Extracted AX25 control block from
* the sock structure.
* AX.25 029 Alan(GW4PTS) Switched to KA9Q constant names.
* Jonathan(G4KLX) Added IP mode registration.
* AX.25 030 Jonathan(G4KLX) Added AX.25 fragment reception.
* Upgraded state machine for SABME.
* Added arbitrary protocol id support.
* AX.25 031 Joerg(DL1BKE) Added DAMA support
* HaJo(DD8NE) Added Idle Disc Timer T5
* Joerg(DL1BKE) Renamed it to "IDLE" with a slightly
* different behaviour. Fixed defrag
* routine (I hope)
* AX.25 032 Darryl(G7LED) AX.25 segmentation fixed.
* AX.25 033 Jonathan(G4KLX) Remove auto-router.
* Modularisation changes.
* AX.25 035 Hans(PE1AYX) Fixed interface to IP layer.
* AX.25 036 Jonathan(G4KLX) Move DAMA code into own file.
* Joerg(DL1BKE) Fixed DAMA Slave.
* AX.25 037 Jonathan(G4KLX) New timer architecture.
* Thomas(DL9SAU) Fixed missing initialization of skb->protocol.
*/ */
#include <linux/config.h> #include <linux/config.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/types.h> #include <linux/types.h>
...@@ -146,7 +116,7 @@ int ax25_rx_iframe(ax25_cb *ax25, struct sk_buff *skb) ...@@ -146,7 +116,7 @@ int ax25_rx_iframe(ax25_cb *ax25, struct sk_buff *skb)
#ifdef CONFIG_INET #ifdef CONFIG_INET
if (pid == AX25_P_IP) { if (pid == AX25_P_IP) {
/* working around a TCP bug to keep additional listeners /* working around a TCP bug to keep additional listeners
* happy. TCP re-uses the buffer and destroys the original * happy. TCP re-uses the buffer and destroys the original
* content. * content.
*/ */
...@@ -220,17 +190,12 @@ static int ax25_process_rx_frame(ax25_cb *ax25, struct sk_buff *skb, int type, i ...@@ -220,17 +190,12 @@ static int ax25_process_rx_frame(ax25_cb *ax25, struct sk_buff *skb, int type, i
static int ax25_rcv(struct sk_buff *skb, struct net_device *dev, static int ax25_rcv(struct sk_buff *skb, struct net_device *dev,
ax25_address *dev_addr, struct packet_type *ptype) ax25_address *dev_addr, struct packet_type *ptype)
{ {
struct sock *make; ax25_address src, dest, *next_digi = NULL;
struct sock *sk; int type = 0, mine = 0, dama;
int type = 0; struct sock *make, *sk, *raw;
ax25_digi dp, reverse_dp; ax25_digi dp, reverse_dp;
ax25_cb *ax25; ax25_cb *ax25;
ax25_address src, dest;
ax25_address *next_digi = NULL;
ax25_dev *ax25_dev; ax25_dev *ax25_dev;
struct sock *raw;
int mine = 0;
int dama;
/* /*
* Process the AX.25/LAPB frame. * Process the AX.25/LAPB frame.
...@@ -275,8 +240,10 @@ static int ax25_rcv(struct sk_buff *skb, struct net_device *dev, ...@@ -275,8 +240,10 @@ static int ax25_rcv(struct sk_buff *skb, struct net_device *dev,
if ((*skb->data & ~0x10) == AX25_UI && dp.lastrepeat + 1 == dp.ndigi) { if ((*skb->data & ~0x10) == AX25_UI && dp.lastrepeat + 1 == dp.ndigi) {
skb->h.raw = skb->data + 2; /* skip control and pid */ skb->h.raw = skb->data + 2; /* skip control and pid */
if ((raw = ax25_addr_match(&dest)) != NULL) if ((raw = ax25_addr_match(&dest)) != NULL) {
ax25_send_to_raw(raw, skb, skb->data[1]); ax25_send_to_raw(raw, skb, skb->data[1]);
release_sock(raw);
}
if (!mine && ax25cmp(&dest, (ax25_address *)dev->broadcast) != 0) { if (!mine && ax25cmp(&dest, (ax25_address *)dev->broadcast) != 0) {
kfree_skb(skb); kfree_skb(skb);
...@@ -308,7 +275,8 @@ static int ax25_rcv(struct sk_buff *skb, struct net_device *dev, ...@@ -308,7 +275,8 @@ static int ax25_rcv(struct sk_buff *skb, struct net_device *dev,
#endif #endif
case AX25_P_TEXT: case AX25_P_TEXT:
/* Now find a suitable dgram socket */ /* Now find a suitable dgram socket */
if ((sk = ax25_find_socket(&dest, &src, SOCK_DGRAM)) != NULL) { sk = ax25_get_socket(&dest, &src, SOCK_DGRAM);
if (sk != NULL) {
if (atomic_read(&sk->rmem_alloc) >= sk->rcvbuf) { if (atomic_read(&sk->rmem_alloc) >= sk->rcvbuf) {
kfree_skb(skb); kfree_skb(skb);
} else { } else {
...@@ -319,6 +287,7 @@ static int ax25_rcv(struct sk_buff *skb, struct net_device *dev, ...@@ -319,6 +287,7 @@ static int ax25_rcv(struct sk_buff *skb, struct net_device *dev,
if (sock_queue_rcv_skb(sk, skb) != 0) if (sock_queue_rcv_skb(sk, skb) != 0)
kfree_skb(skb); kfree_skb(skb);
} }
release_sock(sk);
} else { } else {
kfree_skb(skb); kfree_skb(skb);
} }
...@@ -350,9 +319,10 @@ static int ax25_rcv(struct sk_buff *skb, struct net_device *dev, ...@@ -350,9 +319,10 @@ static int ax25_rcv(struct sk_buff *skb, struct net_device *dev,
if ((ax25 = ax25_find_cb(&dest, &src, &reverse_dp, dev)) != NULL) { if ((ax25 = ax25_find_cb(&dest, &src, &reverse_dp, dev)) != NULL) {
/* /*
* Process the frame. If it is queued up internally it returns one otherwise we * Process the frame. If it is queued up internally it
* free it immediately. This routine itself wakes the user context layers so we * returns one otherwise we free it immediately. This
* do no further work * routine itself wakes the user context layers so we do
* no further work
*/ */
if (ax25_process_rx_frame(ax25, skb, type, dama) == 0) if (ax25_process_rx_frame(ax25, skb, type, dama) == 0)
kfree_skb(skb); kfree_skb(skb);
...@@ -364,7 +334,8 @@ static int ax25_rcv(struct sk_buff *skb, struct net_device *dev, ...@@ -364,7 +334,8 @@ static int ax25_rcv(struct sk_buff *skb, struct net_device *dev,
/* a) received not a SABM(E) */ /* a) received not a SABM(E) */
if ((*skb->data & ~AX25_PF) != AX25_SABM && (*skb->data & ~AX25_PF) != AX25_SABME) { if ((*skb->data & ~AX25_PF) != AX25_SABM &&
(*skb->data & ~AX25_PF) != AX25_SABME) {
/* /*
* Never reply to a DM. Also ignore any connects for * Never reply to a DM. Also ignore any connects for
* addresses that are not our interfaces and not a socket. * addresses that are not our interfaces and not a socket.
...@@ -384,9 +355,12 @@ static int ax25_rcv(struct sk_buff *skb, struct net_device *dev, ...@@ -384,9 +355,12 @@ static int ax25_rcv(struct sk_buff *skb, struct net_device *dev,
sk = ax25_find_listener(next_digi, 1, dev, SOCK_SEQPACKET); sk = ax25_find_listener(next_digi, 1, dev, SOCK_SEQPACKET);
if (sk != NULL) { if (sk != NULL) {
if (sk->ack_backlog == sk->max_ack_backlog || (make = ax25_make_new(sk, ax25_dev)) == NULL) { if (sk->ack_backlog == sk->max_ack_backlog ||
if (mine) ax25_return_dm(dev, &src, &dest, &dp); (make = ax25_make_new(sk, ax25_dev)) == NULL) {
if (mine)
ax25_return_dm(dev, &src, &dest, &dp);
kfree_skb(skb); kfree_skb(skb);
return 0; return 0;
} }
......
/* /*
* AX.25 release 037 * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* *
* This code REQUIRES 2.1.15 or higher/ NET3.038 * Copyright (C) Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk)
*
* This module:
* This module is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*
* History
* AX.25 036 Jonathan(G4KLX) Split from af_ax25.c.
*/ */
#include <linux/config.h> #include <linux/config.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/types.h> #include <linux/types.h>
...@@ -168,7 +161,7 @@ int ax25_rebuild_header(struct sk_buff *skb) ...@@ -168,7 +161,7 @@ int ax25_rebuild_header(struct sk_buff *skb)
skb_pull(ourskb, AX25_HEADER_LEN - 1); /* Keep PID */ skb_pull(ourskb, AX25_HEADER_LEN - 1); /* Keep PID */
ourskb->nh.raw = ourskb->data; ourskb->nh.raw = ourskb->data;
ax25_send_frame(ourskb, ax25_dev->values[AX25_VALUES_PACLEN], &src_c, ax25_send_frame(ourskb, ax25_dev->values[AX25_VALUES_PACLEN], &src_c,
&dst_c, route->digipeat, dev); &dst_c, route->digipeat, dev);
goto put; goto put;
......
/* /*
* AX.25 release 037 * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* *
* This code REQUIRES 2.1.15 or higher/ NET3.038 * Copyright (C) Alan Cox GW4PTS (alan@lxorguk.ukuu.org.uk)
* * Copyright (C) Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk)
* This module: * Copyright (C) Joerg Reuter DL1BKE (jreuter@yaina.de)
* This module is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*
* Most of this code is based on the SDL diagrams published in the 7th
* ARRL Computer Networking Conference papers. The diagrams have mistakes
* in them, but are mostly correct. Before you modify the code could you
* read the SDL diagrams as the code is not obvious and probably very
* easy to break;
*
* History
* AX.25 028a Jonathan(G4KLX) New state machine based on SDL diagrams.
* AX.25 029 Alan(GW4PTS) Switched to KA9Q constant names.
* Jonathan(G4KLX) Only poll when window is full.
* AX.25 030 Jonathan(G4KLX) Added fragmentation to ax25_output.
* Added support for extended AX.25.
* AX.25 031 Joerg(DL1BKE) Added DAMA support
* Joerg(DL1BKE) Modified fragmenter to fragment vanilla
* AX.25 I-Frames. Added PACLEN parameter.
* Joerg(DL1BKE) Fixed a problem with buffer allocation
* for fragments.
* AX.25 037 Jonathan(G4KLX) New timer architecture.
* Joerg(DL1BKE) Fixed DAMA Slave mode: will work
* on non-DAMA interfaces like AX25L2V2
* again (this behaviour is _required_).
* Joerg(DL1BKE) ax25_check_iframes_acked() returns a
* value now (for DAMA n2count handling)
*/ */
#include <linux/config.h> #include <linux/config.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/types.h> #include <linux/types.h>
...@@ -167,9 +141,9 @@ void ax25_output(ax25_cb *ax25, int paclen, struct sk_buff *skb) ...@@ -167,9 +141,9 @@ void ax25_output(ax25_cb *ax25, int paclen, struct sk_buff *skb)
if (skb->sk != NULL) if (skb->sk != NULL)
skb_set_owner_w(skbn, skb->sk); skb_set_owner_w(skbn, skb->sk);
spin_unlock_irqrestore(&ax25_frag_lock, flags); spin_unlock_irqrestore(&ax25_frag_lock, flags);
len = (paclen > skb->len) ? skb->len : paclen; len = (paclen > skb->len) ? skb->len : paclen;
if (ka9qfrag == 1) { if (ka9qfrag == 1) {
...@@ -209,7 +183,7 @@ void ax25_output(ax25_cb *ax25, int paclen, struct sk_buff *skb) ...@@ -209,7 +183,7 @@ void ax25_output(ax25_cb *ax25, int paclen, struct sk_buff *skb)
break; break;
#ifdef CONFIG_AX25_DAMA_SLAVE #ifdef CONFIG_AX25_DAMA_SLAVE
/* /*
* A DAMA slave is _required_ to work as normal AX.25L2V2 * A DAMA slave is _required_ to work as normal AX.25L2V2
* if no DAMA master is available. * if no DAMA master is available.
*/ */
...@@ -220,7 +194,7 @@ void ax25_output(ax25_cb *ax25, int paclen, struct sk_buff *skb) ...@@ -220,7 +194,7 @@ void ax25_output(ax25_cb *ax25, int paclen, struct sk_buff *skb)
} }
} }
/* /*
* This procedure is passed a buffer descriptor for an iframe. It builds * This procedure is passed a buffer descriptor for an iframe. It builds
* the rest of the control part of the frame and then writes it out. * the rest of the control part of the frame and then writes it out.
*/ */
......
/* /*
* AX.25 release 037 * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* *
* This code REQUIRES 2.1.15 or higher/ NET3.038 * Copyright (C) Alan Cox GW4PTS (alan@lxorguk.ukuu.org.uk)
* * Copyright (C) Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk)
* This module: * Copyright (C) Steven Whitehouse GW7RRM (stevew@acm.org)
* This module is free software; you can redistribute it and/or * Copyright (C) Joerg Reuter DL1BKE (jreuter@yaina.de)
* modify it under the terms of the GNU General Public License * Copyright (C) Hans-Joachim Hetscher DD8NE (dd8ne@bnv-bamberg.de)
* as published by the Free Software Foundation; either version * Copyright (C) Frederic Rible F1OAT (frible@teaser.fr)
* 2 of the License, or (at your option) any later version.
*
* Other kernels modules in this kit are generally BSD derived. See the copyright headers.
*
*
* History
* AX.25 020 Jonathan(G4KLX) First go.
* AX.25 022 Jonathan(G4KLX) Added the actual meat to this - we now have a nice heard list.
* AX.25 025 Alan(GW4PTS) First cut at autobinding by route scan.
* AX.25 028b Jonathan(G4KLX) Extracted AX25 control block from the
* sock structure. Device removal now
* removes the heard structure.
* AX.25 029 Steven(GW7RRM) Added /proc information for uid/callsign mapping.
* Jonathan(G4KLX) Handling of IP mode in the routing list and /proc entry.
* AX.25 030 Jonathan(G4KLX) Added digi-peaters to routing table, and
* ioctls to manipulate them. Added port
* configuration.
* AX.25 031 Jonathan(G4KLX) Added concept of default route.
* Joerg(DL1BKE) ax25_rt_build_path() find digipeater list and device by
* destination call. Needed for IP routing via digipeater
* Jonathan(G4KLX) Added routing for IP datagram packets.
* Joerg(DL1BKE) Changed routing for IP datagram and VC to use a default
* route if available. Does not overwrite default routes
* on route-table overflow anymore.
* Joerg(DL1BKE) Fixed AX.25 routing of IP datagram and VC, new ioctl()
* "SIOCAX25OPTRT" to set IP mode and a 'permanent' flag
* on routes.
* AX.25 033 Jonathan(G4KLX) Remove auto-router.
* Joerg(DL1BKE) Moved BPQ Ethernet driver to separate device.
* AX.25 035 Frederic(F1OAT) Support for pseudo-digipeating.
* Jonathan(G4KLX) Support for packet forwarding.
* Arnaldo C. Melo s/suser/capable/
*/ */
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/types.h> #include <linux/types.h>
...@@ -315,7 +286,7 @@ int ax25_rt_get_info(char *buffer, char **start, off_t offset, int length) ...@@ -315,7 +286,7 @@ int ax25_rt_get_info(char *buffer, char **start, off_t offset, int length)
off_t begin = 0; off_t begin = 0;
char *callsign; char *callsign;
int i; int i;
read_lock(&ax25_route_lock); read_lock(&ax25_route_lock);
len += sprintf(buffer, "callsign dev mode digipeaters\n"); len += sprintf(buffer, "callsign dev mode digipeaters\n");
...@@ -366,7 +337,7 @@ int ax25_rt_get_info(char *buffer, char **start, off_t offset, int length) ...@@ -366,7 +337,7 @@ int ax25_rt_get_info(char *buffer, char **start, off_t offset, int length)
len = length; len = length;
return len; return len;
} }
/* /*
* Find AX.25 route * Find AX.25 route
...@@ -426,7 +397,7 @@ static inline void ax25_adjust_path(ax25_address *addr, ax25_digi *digipeat) ...@@ -426,7 +397,7 @@ static inline void ax25_adjust_path(ax25_address *addr, ax25_digi *digipeat)
digipeat->ndigi = k; digipeat->ndigi = k;
} }
/* /*
* Find which interface to use. * Find which interface to use.
......
/* /*
* AX.25 release 037 * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* *
* This code REQUIRES 2.1.15 or higher/ NET3.038 * Copyright (C) Alan Cox GW4PTS (alan@lxorguk.ukuu.org.uk)
* Copyright (C) Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk)
* Copyright (C) Joerg Reuter DL1BKE (jreuter@yaina.de)
* Copyright (C) Hans-Joachim Hetscher DD8NE (dd8ne@bnv-bamberg.de)
* *
* This module: * Most of this code is based on the SDL diagrams published in the 7th ARRL
* This module is free software; you can redistribute it and/or * Computer Networking Conference papers. The diagrams have mistakes in them,
* modify it under the terms of the GNU General Public License * but are mostly correct. Before you modify the code could you read the SDL
* as published by the Free Software Foundation; either version * diagrams as the code is not obvious and probably very easy to break.
* 2 of the License, or (at your option) any later version.
*
* Most of this code is based on the SDL diagrams published in the 7th
* ARRL Computer Networking Conference papers. The diagrams have mistakes
* in them, but are mostly correct. Before you modify the code could you
* read the SDL diagrams as the code is not obvious and probably very
* easy to break;
*
* History
* AX.25 028a Jonathan(G4KLX) New state machine based on SDL diagrams.
* AX.25 028b Jonathan(G4KLX) Extracted AX25 control block from
* the sock structure.
* AX.25 029 Alan(GW4PTS) Switched to KA9Q constant names.
* Jonathan(G4KLX) Added IP mode registration.
* AX.25 030 Jonathan(G4KLX) Added AX.25 fragment reception.
* Upgraded state machine for SABME.
* Added arbitrary protocol id support.
* AX.25 031 Joerg(DL1BKE) Added DAMA support
* HaJo(DD8NE) Added Idle Disc Timer T5
* Joerg(DL1BKE) Renamed it to "IDLE" with a slightly
* different behaviour. Fixed defrag
* routine (I hope)
* AX.25 032 Darryl(G7LED) AX.25 segmentation fixed.
* AX.25 033 Jonathan(G4KLX) Remove auto-router.
* Modularisation changes.
* AX.25 035 Hans(PE1AYX) Fixed interface to IP layer.
* AX.25 036 Jonathan(G4KLX) Cloned from ax25_in.c.
* AX.25 037 Jonathan(G4KLX) New timer architecture.
*/ */
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/socket.h> #include <linux/socket.h>
......
/* /*
* AX.25 release 037 * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* *
* This code REQUIRES 2.1.15 or higher/ NET3.038 * Copyright (C) Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk)
*
* This module:
* This module is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*
* Most of this code is based on the SDL diagrams published in the 7th
* ARRL Computer Networking Conference papers. The diagrams have mistakes
* in them, but are mostly correct. Before you modify the code could you
* read the SDL diagrams as the code is not obvious and probably very
* easy to break;
*
* History
* AX.25 036 Jonathan(G4KLX) Split from ax25_out.c.
* AX.25 037 Jonathan(G4KLX) New timer architecture.
*/ */
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/socket.h> #include <linux/socket.h>
...@@ -80,7 +66,7 @@ void ax25_std_transmit_enquiry(ax25_cb *ax25) ...@@ -80,7 +66,7 @@ void ax25_std_transmit_enquiry(ax25_cb *ax25)
ax25_calculate_t1(ax25); ax25_calculate_t1(ax25);
ax25_start_t1timer(ax25); ax25_start_t1timer(ax25);
} }
void ax25_std_enquiry_response(ax25_cb *ax25) void ax25_std_enquiry_response(ax25_cb *ax25)
{ {
if (ax25->condition & AX25_COND_OWN_RX_BUSY) if (ax25->condition & AX25_COND_OWN_RX_BUSY)
......
/* /*
* AX.25 release 037 * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* *
* This code REQUIRES 2.1.15 or higher/ NET3.038 * Copyright (C) Alan Cox GW4PTS (alan@lxorguk.ukuu.org.uk)
* * Copyright (C) Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk)
* This module: * Copyright (C) Joerg Reuter DL1BKE (jreuter@yaina.de)
* This module is free software; you can redistribute it and/or * Copyright (C) Frederic Rible F1OAT (frible@teaser.fr)
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*
* History
* AX.25 028a Jonathan(G4KLX) New state machine based on SDL diagrams.
* AX.25 028b Jonathan(G4KLX) Extracted AX25 control block from the
* sock structure.
* AX.25 029 Alan(GW4PTS) Switched to KA9Q constant names.
* AX.25 031 Joerg(DL1BKE) Added DAMA support
* AX.25 032 Joerg(DL1BKE) Fixed DAMA timeout bug
* AX.25 033 Jonathan(G4KLX) Modularisation functions.
* AX.25 035 Frederic(F1OAT) Support for pseudo-digipeating.
* AX.25 036 Jonathan(G4KLX) Split from ax25_timer.c.
* AX.25 037 Jonathan(G4KLX) New timer architecture.
*/ */
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/socket.h> #include <linux/socket.h>
...@@ -116,7 +103,7 @@ void ax25_std_idletimer_expiry(ax25_cb *ax25) ...@@ -116,7 +103,7 @@ void ax25_std_idletimer_expiry(ax25_cb *ax25)
void ax25_std_t1timer_expiry(ax25_cb *ax25) void ax25_std_t1timer_expiry(ax25_cb *ax25)
{ {
switch (ax25->state) { switch (ax25->state) {
case AX25_STATE_1: case AX25_STATE_1:
if (ax25->n2count == ax25->n2) { if (ax25->n2count == ax25->n2) {
if (ax25->modulus == AX25_MODULUS) { if (ax25->modulus == AX25_MODULUS) {
ax25_disconnect(ax25, ETIMEDOUT); ax25_disconnect(ax25, ETIMEDOUT);
...@@ -147,7 +134,7 @@ void ax25_std_t1timer_expiry(ax25_cb *ax25) ...@@ -147,7 +134,7 @@ void ax25_std_t1timer_expiry(ax25_cb *ax25)
} }
break; break;
case AX25_STATE_3: case AX25_STATE_3:
ax25->n2count = 1; ax25->n2count = 1;
ax25_std_transmit_enquiry(ax25); ax25_std_transmit_enquiry(ax25);
ax25->state = AX25_STATE_4; ax25->state = AX25_STATE_4;
......
/* /*
* AX.25 release 037 * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* *
* This code REQUIRES 2.1.15 or higher/ NET3.038 * Copyright (C) Alan Cox GW4PTS (alan@lxorguk.ukuu.org.uk)
* * Copyright (C) Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk)
* This module: * Copyright (C) Joerg Reuter DL1BKE (jreuter@yaina.de)
* This module is free software; you can redistribute it and/or * Copyright (C) Frederic Rible F1OAT (frible@teaser.fr)
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*
* Most of this code is based on the SDL diagrams published in the 7th
* ARRL Computer Networking Conference papers. The diagrams have mistakes
* in them, but are mostly correct. Before you modify the code could you
* read the SDL diagrams as the code is not obvious and probably very
* easy to break;
*
* History
* AX.25 029 Alan(GW4PTS) Switched to KA9Q constant names. Removed
* old BSD code.
* AX.25 030 Jonathan(G4KLX) Added support for extended AX.25.
* Added fragmentation support.
* Darryl(G7LED) Added function ax25_requeue_frames() to split
* it up from ax25_frames_acked().
* AX.25 031 Joerg(DL1BKE) DAMA needs KISS Fullduplex ON/OFF.
* Thus we have ax25_kiss_cmd() now... ;-)
* Dave Brown(N2RJT)
* Killed a silly bug in the DAMA code.
* Joerg(DL1BKE) Found the real bug in ax25.h, sri.
* AX.25 032 Joerg(DL1BKE) Added ax25_queue_length to count the number of
* enqueued buffers of a socket..
* AX.25 035 Frederic(F1OAT) Support for pseudo-digipeating.
* AX.25 037 Jonathan(G4KLX) New timer architecture.
*/ */
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/socket.h> #include <linux/socket.h>
...@@ -172,9 +148,9 @@ int ax25_decode(ax25_cb *ax25, struct sk_buff *skb, int *ns, int *nr, int *pf) ...@@ -172,9 +148,9 @@ int ax25_decode(ax25_cb *ax25, struct sk_buff *skb, int *ns, int *nr, int *pf)
return frametype; return frametype;
} }
/* /*
* This routine is called when the HDLC layer internally generates a * This routine is called when the HDLC layer internally generates a
* command or response for the remote machine ( eg. RR, UA etc. ). * command or response for the remote machine ( eg. RR, UA etc. ).
* Only supervisory or unnumbered frames are processed. * Only supervisory or unnumbered frames are processed.
*/ */
void ax25_send_control(ax25_cb *ax25, int frametype, int poll_bit, int type) void ax25_send_control(ax25_cb *ax25, int frametype, int poll_bit, int type)
...@@ -231,7 +207,7 @@ void ax25_return_dm(struct net_device *dev, ax25_address *src, ax25_address *des ...@@ -231,7 +207,7 @@ void ax25_return_dm(struct net_device *dev, ax25_address *src, ax25_address *des
skb_reserve(skb, AX25_BPQ_HEADER_LEN + ax25_addr_size(digi)); skb_reserve(skb, AX25_BPQ_HEADER_LEN + ax25_addr_size(digi));
skb->nh.raw = skb->data; skb->nh.raw = skb->data;
ax25_digi_invert(digi, &retdigi); ax25_digi_invert(digi, &retdigi);
dptr = skb_put(skb, 1); dptr = skb_put(skb, 1);
......
/* /*
* AX.25 release 037 * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* *
* This code REQUIRES 2.1.15 or higher/ NET3.038 * Copyright (C) Alan Cox GW4PTS (alan@lxorguk.ukuu.org.uk)
* * Copyright (C) Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk)
* This module: * Copyright (C) Tomi Manninen OH2BNS (oh2bns@sral.fi)
* This module is free software; you can redistribute it and/or * Copyright (C) Darryl Miles G7LED (dlm@g7led.demon.co.uk)
* modify it under the terms of the GNU General Public License * Copyright (C) Joerg Reuter DL1BKE (jreuter@yaina.de)
* as published by the Free Software Foundation; either version * Copyright (C) Frederic Rible F1OAT (frible@teaser.fr)
* 2 of the License, or (at your option) any later version.
*
* History
* AX.25 028a Jonathan(G4KLX) New state machine based on SDL diagrams.
* AX.25 028b Jonathan(G4KLX) Extracted AX25 control block from the
* sock structure.
* AX.25 029 Alan(GW4PTS) Switched to KA9Q constant names.
* AX.25 031 Joerg(DL1BKE) Added DAMA support
* AX.25 032 Joerg(DL1BKE) Fixed DAMA timeout bug
* AX.25 033 Jonathan(G4KLX) Modularisation functions.
* AX.25 035 Frederic(F1OAT) Support for pseudo-digipeating.
* AX.25 036 Jonathan(G4KLX) Split Standard and DAMA code into separate files.
* Joerg(DL1BKE) Fixed DAMA Slave. We are *required* to start with
* standard AX.25 mode.
* AX.25 037 Jonathan(G4KLX) New timer architecture.
* Tomi(OH2BNS) Fixed heartbeat expiry (check ax25_dev).
*/ */
#include <linux/config.h> #include <linux/config.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/types.h> #include <linux/types.h>
......
/* /*
* AX.25 release 037 * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* *
* This code REQUIRES 2.1.15 or higher/ NET3.038 * Copyright (C) Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk)
*
* This module:
* This module is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*
* History
* AX.25 036 Jonathan(G4KLX) Split from af_ax25.c.
*/ */
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/socket.h> #include <linux/socket.h>
......
/* -*- linux-c -*- /*
* sysctl_net_ax25.c: sysctl interface to net AX.25 subsystem. * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* *
* Begun April 1, 1996, Mike Shaver. * Copyright (C) 1996 Mike Shaver (shaver@zeroknowledge.com)
* Added /proc/sys/net/ax25 directory entry (empty =) ). [MS]
*/ */
#include <linux/config.h> #include <linux/config.h>
#include <linux/mm.h> #include <linux/mm.h>
#include <linux/sysctl.h> #include <linux/sysctl.h>
...@@ -132,7 +133,7 @@ void ax25_register_sysctl(void) ...@@ -132,7 +133,7 @@ void ax25_register_sysctl(void)
ax25_table[n].mode = 0555; ax25_table[n].mode = 0555;
#ifndef CONFIG_AX25_DAMA_SLAVE #ifndef CONFIG_AX25_DAMA_SLAVE
/* /*
* We do not wish to have a representation of this parameter * We do not wish to have a representation of this parameter
* in /proc/sys/ when configured *not* to include the * in /proc/sys/ when configured *not* to include the
* AX.25 DAMA slave code, do we? * AX.25 DAMA slave code, do we?
......
/* /*
* NET/ROM release 007 * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* *
* This code REQUIRES 2.1.15 or higher/ NET3.038 * Copyright Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk)
* * Copyright Alan Cox GW4PTS (alan@lxorguk.ukuu.org.uk)
* This module: * Copyright Darryl Miles G7LED (dlm@g7led.demon.co.uk)
* This module is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*
* History
* NET/ROM 001 Jonathan(G4KLX) Cloned from the AX25 code.
* NET/ROM 002 Darryl(G7LED) Fixes and address enhancement.
* Jonathan(G4KLX) Complete bind re-think.
* Alan(GW4PTS) Trivial tweaks into new format.
* NET/ROM 003 Jonathan(G4KLX) Added G8BPQ extensions.
* Added NET/ROM routing ioctl.
* Darryl(G7LED) Fix autobinding (on connect).
* Fixed nr_release(), set TCP_CLOSE, wakeup app
* context, THEN make the sock dead.
* Circuit ID check before allocating it on
* a connection.
* Alan(GW4PTS) sendmsg/recvmsg only. Fixed connect clear bug
* inherited from AX.25
* NET/ROM 004 Jonathan(G4KLX) Converted to module.
* NET/ROM 005 Jonathan(G4KLX) Linux 2.1
* Alan(GW4PTS) Started POSIXisms
* NET/ROM 006 Alan(GW4PTS) Brought in line with the ANK changes
* Jonathan(G4KLX) Removed hdrincl.
* NET/ROM 007 Jonathan(G4KLX) New timer architecture.
* Implemented Idle timer.
* Arnaldo C. Melo s/suser/capable/, micro cleanups
*/ */
#include <linux/config.h> #include <linux/config.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/errno.h> #include <linux/errno.h>
...@@ -1264,36 +1239,33 @@ static int nr_get_info(char *buffer, char **start, off_t offset, int length) ...@@ -1264,36 +1239,33 @@ static int nr_get_info(char *buffer, char **start, off_t offset, int length)
} }
static struct net_proto_family nr_family_ops = { static struct net_proto_family nr_family_ops = {
.family = PF_NETROM, .family = PF_NETROM,
.create = nr_create, .create = nr_create,
}; };
static struct proto_ops SOCKOPS_WRAPPED(nr_proto_ops) = { static struct proto_ops nr_proto_ops = {
.family = PF_NETROM, .family = PF_NETROM,
.release = nr_release, .release = nr_release,
.bind = nr_bind, .bind = nr_bind,
.connect = nr_connect, .connect = nr_connect,
.socketpair = sock_no_socketpair, .socketpair = sock_no_socketpair,
.accept = nr_accept, .accept = nr_accept,
.getname = nr_getname, .getname = nr_getname,
.poll = datagram_poll, .poll = datagram_poll,
.ioctl = nr_ioctl, .ioctl = nr_ioctl,
.listen = nr_listen, .listen = nr_listen,
.shutdown = sock_no_shutdown, .shutdown = sock_no_shutdown,
.setsockopt = nr_setsockopt, .setsockopt = nr_setsockopt,
.getsockopt = nr_getsockopt, .getsockopt = nr_getsockopt,
.sendmsg = nr_sendmsg, .sendmsg = nr_sendmsg,
.recvmsg = nr_recvmsg, .recvmsg = nr_recvmsg,
.mmap = sock_no_mmap, .mmap = sock_no_mmap,
.sendpage = sock_no_sendpage, .sendpage = sock_no_sendpage,
}; };
#include <linux/smp_lock.h>
SOCKOPS_WRAP(nr_proto, PF_NETROM);
static struct notifier_block nr_dev_notifier = { static struct notifier_block nr_dev_notifier = {
.notifier_call =nr_device_event, .notifier_call = nr_device_event,
}; };
static struct net_device *dev_nr; static struct net_device *dev_nr;
......
/* /*
* NET/ROM release 007 * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* *
* This code REQUIRES 2.1.15 or higher/ NET3.038 * Copyright Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk)
*
* This module:
* This module is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*
* History
* NET/ROM 001 Jonathan(G4KLX) Cloned from loopback.c
* NET/ROM 002 Steve Whitehouse(GW7RRM) fixed the set_mac_address
* NET/ROM 003 Jonathan(G4KLX) Put nr_rebuild_header into line with
* ax25_rebuild_header
* NET/ROM 004 Jonathan(G4KLX) Callsign registration with AX.25.
* NET/ROM 006 Hans(PE1AYX) Fixed interface to IP layer.
*/ */
#include <linux/config.h> #include <linux/config.h>
#define __NO_VERSION__ #define __NO_VERSION__
#include <linux/module.h> #include <linux/module.h>
...@@ -115,7 +103,7 @@ static int nr_rebuild_header(struct sk_buff *skb) ...@@ -115,7 +103,7 @@ static int nr_rebuild_header(struct sk_buff *skb)
kfree_skb(skb); kfree_skb(skb);
len = skbn->len; len = skbn->len;
if (!nr_route_frame(skbn, NULL)) { if (!nr_route_frame(skbn, NULL)) {
kfree_skb(skbn); kfree_skb(skbn);
stats->tx_errors++; stats->tx_errors++;
......
/* /*
* NET/ROM release 007 * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* *
* This code REQUIRES 2.1.15 or higher/ NET3.038 * Copyright Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk)
* * Copyright Darryl Miles G7LED (dlm@g7led.demon.co.uk)
* This module:
* This module is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*
* Most of this code is based on the SDL diagrams published in the 7th
* ARRL Computer Networking Conference papers. The diagrams have mistakes
* in them, but are mostly correct. Before you modify the code could you
* read the SDL diagrams as the code is not obvious and probably very
* easy to break;
*
* History
* NET/ROM 001 Jonathan(G4KLX) Cloned from ax25_in.c
* NET/ROM 003 Jonathan(G4KLX) Added NET/ROM fragment reception.
* Darryl(G7LED) Added missing INFO with NAK case, optimized
* INFOACK handling, removed reconnect on error.
* NET/ROM 006 Jonathan(G4KLX) Hdrincl removal changes.
* NET/ROM 007 Jonathan(G4KLX) New timer architecture.
*/ */
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/socket.h> #include <linux/socket.h>
...@@ -77,7 +60,7 @@ static int nr_queue_rx_frame(struct sock *sk, struct sk_buff *skb, int more) ...@@ -77,7 +60,7 @@ static int nr_queue_rx_frame(struct sock *sk, struct sk_buff *skb, int more)
kfree_skb(skbo); kfree_skb(skbo);
} }
nr->fraglen = 0; nr->fraglen = 0;
} }
return sock_queue_rcv_skb(sk, skbn); return sock_queue_rcv_skb(sk, skbn);
......
/* /*
* NET/ROM release 007 * This program is free software; you can redistribute it and/or modify
* * it under the terms of the GNU General Public License as published by
* This code REQUIRES 2.1.15 or higher/ NET3.038 * the Free Software Foundation; either version 2 of the License, or
* * (at your option) any later version.
* This module:
* This module is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*
* History
* NET/ROM 007 Tomi(OH2BNS) Created this file.
* Small change in nr_loopback_queue().
* *
* Copyright Tomi Manninen OH2BNS (oh2bns@sral.fi)
*/ */
#include <linux/types.h> #include <linux/types.h>
#include <linux/socket.h> #include <linux/socket.h>
#include <linux/timer.h> #include <linux/timer.h>
......
/* /*
* NET/ROM release 007 * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* *
* This code REQUIRES 2.1.15 or higher/ NET3.038 * Copyright Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk)
* * Copyright Darryl Miles G7LED (dlm@g7led.demon.co.uk)
* This module:
* This module is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*
* History
* NET/ROM 001 Jonathan(G4KLX) Cloned from ax25_out.c
* NET/ROM 003 Jonathan(G4KLX) Added NET/ROM fragmentation.
* Darryl(G7LED) Fixed NAK, to give out correct reponse.
* NET/ROM 007 Jonathan(G4KLX) New timer architecture.
*/ */
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/socket.h> #include <linux/socket.h>
...@@ -85,7 +76,7 @@ void nr_output(struct sock *sk, struct sk_buff *skb) ...@@ -85,7 +76,7 @@ void nr_output(struct sock *sk, struct sk_buff *skb)
nr_kick(sk); nr_kick(sk);
} }
/* /*
* This procedure is passed a buffer descriptor for an iframe. It builds * This procedure is passed a buffer descriptor for an iframe. It builds
* the rest of the control part of the frame and then writes it out. * the rest of the control part of the frame and then writes it out.
*/ */
...@@ -104,7 +95,7 @@ static void nr_send_iframe(struct sock *sk, struct sk_buff *skb) ...@@ -104,7 +95,7 @@ static void nr_send_iframe(struct sock *sk, struct sk_buff *skb)
nr_start_idletimer(sk); nr_start_idletimer(sk);
nr_transmit_buffer(sk, skb); nr_transmit_buffer(sk, skb);
} }
void nr_send_nak_frame(struct sock *sk) void nr_send_nak_frame(struct sock *sk)
......
/* /*
* NET/ROM release 007 * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* *
* This code REQUIRES 2.1.15 or higher/ NET3.038 * Copyright Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk)
* * Copyright Alan Cox GW4PTS (alan@lxorguk.ukuu.org.uk)
* This module: * Copyright Tomi Manninen OH2BNS (oh2bns@sral.fi)
* This module is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*
* History
* NET/ROM 001 Jonathan(G4KLX) First attempt.
* NET/ROM 003 Jonathan(G4KLX) Use SIOCADDRT/SIOCDELRT ioctl values
* for NET/ROM routes.
* Use '*' for a blank mnemonic in /proc/net/nr_nodes.
* Change default quality for new neighbour when same
* as node callsign.
* Alan Cox(GW4PTS) Added the firewall hooks.
* NET/ROM 006 Jonathan(G4KLX) Added the setting of digipeated neighbours.
* Tomi(OH2BNS) Routing quality and link failure changes.
*/ */
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/socket.h> #include <linux/socket.h>
...@@ -47,12 +34,15 @@ ...@@ -47,12 +34,15 @@
#include <linux/notifier.h> #include <linux/notifier.h>
#include <linux/netfilter.h> #include <linux/netfilter.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/spinlock.h>
#include <net/netrom.h> #include <net/netrom.h>
static unsigned int nr_neigh_no = 1; static unsigned int nr_neigh_no = 1;
static struct nr_node *nr_node_list; static struct nr_node *nr_node_list;
static spinlock_t nr_node_lock;
static struct nr_neigh *nr_neigh_list; static struct nr_neigh *nr_neigh_list;
static spinlock_t nr_neigh_lock;
static void nr_remove_neigh(struct nr_neigh *); static void nr_remove_neigh(struct nr_neigh *);
...@@ -124,13 +114,10 @@ static int nr_add_node(ax25_address *nr, const char *mnemonic, ax25_address *ax2 ...@@ -124,13 +114,10 @@ static int nr_add_node(ax25_address *nr, const char *mnemonic, ax25_address *ax2
memcpy(nr_neigh->digipeat, ax25_digi, sizeof(ax25_digi)); memcpy(nr_neigh->digipeat, ax25_digi, sizeof(ax25_digi));
} }
save_flags(flags); spin_lock_irqsave(&nr_neigh_lock, flags);
cli();
nr_neigh->next = nr_neigh_list; nr_neigh->next = nr_neigh_list;
nr_neigh_list = nr_neigh; nr_neigh_list = nr_neigh;
spin_unlock_irqrestore(&nr_neigh_lock, flags);
restore_flags(flags);
} }
if (quality != 0 && ax25cmp(nr, ax25) == 0 && !nr_neigh->locked) if (quality != 0 && ax25cmp(nr, ax25) == 0 && !nr_neigh->locked)
...@@ -150,13 +137,10 @@ static int nr_add_node(ax25_address *nr, const char *mnemonic, ax25_address *ax2 ...@@ -150,13 +137,10 @@ static int nr_add_node(ax25_address *nr, const char *mnemonic, ax25_address *ax2
nr_node->routes[0].obs_count = obs_count; nr_node->routes[0].obs_count = obs_count;
nr_node->routes[0].neighbour = nr_neigh; nr_node->routes[0].neighbour = nr_neigh;
save_flags(flags); spin_lock_irqsave(&nr_node_lock, flags);
cli();
nr_node->next = nr_node_list; nr_node->next = nr_node_list;
nr_node_list = nr_node; nr_node_list = nr_node;
spin_unlock_irqrestore(&nr_node_lock, flags);
restore_flags(flags);
nr_neigh->count++; nr_neigh->count++;
...@@ -259,12 +243,10 @@ static void nr_remove_node(struct nr_node *nr_node) ...@@ -259,12 +243,10 @@ static void nr_remove_node(struct nr_node *nr_node)
struct nr_node *s; struct nr_node *s;
unsigned long flags; unsigned long flags;
save_flags(flags); spin_lock_irqsave(&nr_node_lock, flags);
cli();
if ((s = nr_node_list) == nr_node) { if ((s = nr_node_list) == nr_node) {
nr_node_list = nr_node->next; nr_node_list = nr_node->next;
restore_flags(flags); spin_unlock_irqrestore(&nr_node_lock, flags);
kfree(nr_node); kfree(nr_node);
return; return;
} }
...@@ -272,7 +254,7 @@ static void nr_remove_node(struct nr_node *nr_node) ...@@ -272,7 +254,7 @@ static void nr_remove_node(struct nr_node *nr_node)
while (s != NULL && s->next != NULL) { while (s != NULL && s->next != NULL) {
if (s->next == nr_node) { if (s->next == nr_node) {
s->next = nr_node->next; s->next = nr_node->next;
restore_flags(flags); spin_unlock_irqrestore(&nr_node_lock, flags);
kfree(nr_node); kfree(nr_node);
return; return;
} }
...@@ -280,20 +262,18 @@ static void nr_remove_node(struct nr_node *nr_node) ...@@ -280,20 +262,18 @@ static void nr_remove_node(struct nr_node *nr_node)
s = s->next; s = s->next;
} }
restore_flags(flags); spin_unlock_irqrestore(&nr_node_lock, flags);
} }
static void nr_remove_neigh(struct nr_neigh *nr_neigh) static void nr_remove_neigh(struct nr_neigh *nr_neigh)
{ {
struct nr_neigh *s; struct nr_neigh *s;
unsigned long flags; unsigned long flags;
save_flags(flags);
cli();
spin_lock_irqsave(&nr_neigh_lock, flags);
if ((s = nr_neigh_list) == nr_neigh) { if ((s = nr_neigh_list) == nr_neigh) {
nr_neigh_list = nr_neigh->next; nr_neigh_list = nr_neigh->next;
restore_flags(flags); spin_unlock_irqrestore(&nr_neigh_lock, flags);
if (nr_neigh->digipeat != NULL) if (nr_neigh->digipeat != NULL)
kfree(nr_neigh->digipeat); kfree(nr_neigh->digipeat);
kfree(nr_neigh); kfree(nr_neigh);
...@@ -303,7 +283,7 @@ static void nr_remove_neigh(struct nr_neigh *nr_neigh) ...@@ -303,7 +283,7 @@ static void nr_remove_neigh(struct nr_neigh *nr_neigh)
while (s != NULL && s->next != NULL) { while (s != NULL && s->next != NULL) {
if (s->next == nr_neigh) { if (s->next == nr_neigh) {
s->next = nr_neigh->next; s->next = nr_neigh->next;
restore_flags(flags); spin_unlock_irqrestore(&nr_neigh_lock, flags);
if (nr_neigh->digipeat != NULL) if (nr_neigh->digipeat != NULL)
kfree(nr_neigh->digipeat); kfree(nr_neigh->digipeat);
kfree(nr_neigh); kfree(nr_neigh);
...@@ -312,8 +292,7 @@ static void nr_remove_neigh(struct nr_neigh *nr_neigh) ...@@ -312,8 +292,7 @@ static void nr_remove_neigh(struct nr_neigh *nr_neigh)
s = s->next; s = s->next;
} }
spin_unlock_irqrestore(&nr_neigh_lock, flags);
restore_flags(flags);
} }
/* /*
...@@ -330,13 +309,15 @@ static int nr_del_node(ax25_address *callsign, ax25_address *neighbour, struct n ...@@ -330,13 +309,15 @@ static int nr_del_node(ax25_address *callsign, ax25_address *neighbour, struct n
if (ax25cmp(callsign, &nr_node->callsign) == 0) if (ax25cmp(callsign, &nr_node->callsign) == 0)
break; break;
if (nr_node == NULL) return -EINVAL; if (nr_node == NULL)
return -EINVAL;
for (nr_neigh = nr_neigh_list; nr_neigh != NULL; nr_neigh = nr_neigh->next) for (nr_neigh = nr_neigh_list; nr_neigh != NULL; nr_neigh = nr_neigh->next)
if (ax25cmp(neighbour, &nr_neigh->callsign) == 0 && nr_neigh->dev == dev) if (ax25cmp(neighbour, &nr_neigh->callsign) == 0 && nr_neigh->dev == dev)
break; break;
if (nr_neigh == NULL) return -EINVAL; if (nr_neigh == NULL)
return -EINVAL;
for (i = 0; i < nr_node->count; i++) { for (i = 0; i < nr_node->count; i++) {
if (nr_node->routes[i].neighbour == nr_neigh) { if (nr_node->routes[i].neighbour == nr_neigh) {
...@@ -404,15 +385,12 @@ static int nr_add_neigh(ax25_address *callsign, ax25_digi *ax25_digi, struct net ...@@ -404,15 +385,12 @@ static int nr_add_neigh(ax25_address *callsign, ax25_digi *ax25_digi, struct net
memcpy(nr_neigh->digipeat, ax25_digi, sizeof(ax25_digi)); memcpy(nr_neigh->digipeat, ax25_digi, sizeof(ax25_digi));
} }
save_flags(flags); spin_lock_irqsave(&nr_neigh_lock, flags);
cli();
nr_neigh->next = nr_neigh_list; nr_neigh->next = nr_neigh_list;
nr_neigh_list = nr_neigh; nr_neigh_list = nr_neigh;
spin_unlock_irqrestore(&nr_neigh_lock, flags);
restore_flags(flags); return 0;
return 0;
} }
/* /*
...@@ -753,13 +731,13 @@ int nr_route_frame(struct sk_buff *skb, ax25_cb *ax25) ...@@ -753,13 +731,13 @@ int nr_route_frame(struct sk_buff *skb, ax25_cb *ax25)
int nr_nodes_get_info(char *buffer, char **start, off_t offset, int length) int nr_nodes_get_info(char *buffer, char **start, off_t offset, int length)
{ {
struct nr_node *nr_node; struct nr_node *nr_node;
unsigned long flags;
int len = 0; int len = 0;
off_t pos = 0; off_t pos = 0;
off_t begin = 0; off_t begin = 0;
int i; int i;
cli(); spin_lock_irqsave(&nr_node_lock, flags);
len += sprintf(buffer, "callsign mnemonic w n qual obs neigh qual obs neigh qual obs neigh\n"); len += sprintf(buffer, "callsign mnemonic w n qual obs neigh qual obs neigh qual obs neigh\n");
for (nr_node = nr_node_list; nr_node != NULL; nr_node = nr_node->next) { for (nr_node = nr_node_list; nr_node != NULL; nr_node = nr_node->next) {
...@@ -767,7 +745,7 @@ int nr_nodes_get_info(char *buffer, char **start, off_t offset, int length) ...@@ -767,7 +745,7 @@ int nr_nodes_get_info(char *buffer, char **start, off_t offset, int length)
ax2asc(&nr_node->callsign), ax2asc(&nr_node->callsign),
(nr_node->mnemonic[0] == '\0') ? "*" : nr_node->mnemonic, (nr_node->mnemonic[0] == '\0') ? "*" : nr_node->mnemonic,
nr_node->which + 1, nr_node->which + 1,
nr_node->count); nr_node->count);
for (i = 0; i < nr_node->count; i++) { for (i = 0; i < nr_node->count; i++) {
len += sprintf(buffer + len, " %3d %d %05d", len += sprintf(buffer + len, " %3d %d %05d",
...@@ -788,8 +766,7 @@ int nr_nodes_get_info(char *buffer, char **start, off_t offset, int length) ...@@ -788,8 +766,7 @@ int nr_nodes_get_info(char *buffer, char **start, off_t offset, int length)
if (pos > offset + length) if (pos > offset + length)
break; break;
} }
spin_unlock_irqrestore(&nr_node_lock, flags);
sti();
*start = buffer + (offset - begin); *start = buffer + (offset - begin);
len -= (offset - begin); len -= (offset - begin);
...@@ -797,18 +774,18 @@ int nr_nodes_get_info(char *buffer, char **start, off_t offset, int length) ...@@ -797,18 +774,18 @@ int nr_nodes_get_info(char *buffer, char **start, off_t offset, int length)
if (len > length) len = length; if (len > length) len = length;
return len; return len;
} }
int nr_neigh_get_info(char *buffer, char **start, off_t offset, int length) int nr_neigh_get_info(char *buffer, char **start, off_t offset, int length)
{ {
struct nr_neigh *nr_neigh; struct nr_neigh *nr_neigh;
unsigned long flags;
int len = 0; int len = 0;
off_t pos = 0; off_t pos = 0;
off_t begin = 0; off_t begin = 0;
int i; int i;
cli(); spin_lock_irqsave(&nr_neigh_lock, flags);
len += sprintf(buffer, "addr callsign dev qual lock count failed digipeaters\n"); len += sprintf(buffer, "addr callsign dev qual lock count failed digipeaters\n");
for (nr_neigh = nr_neigh_list; nr_neigh != NULL; nr_neigh = nr_neigh->next) { for (nr_neigh = nr_neigh_list; nr_neigh != NULL; nr_neigh = nr_neigh->next) {
...@@ -839,7 +816,7 @@ int nr_neigh_get_info(char *buffer, char **start, off_t offset, int length) ...@@ -839,7 +816,7 @@ int nr_neigh_get_info(char *buffer, char **start, off_t offset, int length)
break; break;
} }
sti(); spin_unlock_irqrestore(&nr_neigh_lock, flags);
*start = buffer + (offset - begin); *start = buffer + (offset - begin);
len -= (offset - begin); len -= (offset - begin);
...@@ -847,7 +824,7 @@ int nr_neigh_get_info(char *buffer, char **start, off_t offset, int length) ...@@ -847,7 +824,7 @@ int nr_neigh_get_info(char *buffer, char **start, off_t offset, int length)
if (len > length) len = length; if (len > length) len = length;
return len; return len;
} }
/* /*
* Free all memory associated with the nodes and routes lists. * Free all memory associated with the nodes and routes lists.
......
/* /*
* NET/ROM release 007 * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* *
* This code REQUIRES 2.1.15 or higher/ NET3.038 * Copyright Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk)
*
* This module:
* This module is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*
* History
* NET/ROM 001 Jonathan(G4KLX) Cloned from ax25_subr.c
* NET/ROM 003 Jonathan(G4KLX) Added G8BPQ NET/ROM extensions.
* NET/ROM 007 Jonathan(G4KLX) New timer architecture.
*/ */
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/socket.h> #include <linux/socket.h>
...@@ -125,7 +116,7 @@ int nr_in_rx_window(struct sock *sk, unsigned short ns) ...@@ -125,7 +116,7 @@ int nr_in_rx_window(struct sock *sk, unsigned short ns)
return 0; return 0;
} }
/* /*
* This routine is called when the HDLC layer internally generates a * This routine is called when the HDLC layer internally generates a
* control frame. * control frame.
*/ */
...@@ -161,7 +152,7 @@ void nr_write_internal(struct sock *sk, int frametype) ...@@ -161,7 +152,7 @@ void nr_write_internal(struct sock *sk, int frametype)
* Space for AX.25 and NET/ROM network header * Space for AX.25 and NET/ROM network header
*/ */
skb_reserve(skb, AX25_BPQ_HEADER_LEN + AX25_MAX_HEADER_LEN + NR_NETWORK_LEN); skb_reserve(skb, AX25_BPQ_HEADER_LEN + AX25_MAX_HEADER_LEN + NR_NETWORK_LEN);
dptr = skb_put(skb, skb_tailroom(skb)); dptr = skb_put(skb, skb_tailroom(skb));
switch (frametype & 0x0F) { switch (frametype & 0x0F) {
...@@ -243,7 +234,7 @@ void nr_transmit_refusal(struct sk_buff *skb, int mine) ...@@ -243,7 +234,7 @@ void nr_transmit_refusal(struct sk_buff *skb, int mine)
dptr[6] &= ~AX25_EBIT; dptr[6] &= ~AX25_EBIT;
dptr[6] |= AX25_SSSID_SPARE; dptr[6] |= AX25_SSSID_SPARE;
dptr += AX25_ADDR_LEN; dptr += AX25_ADDR_LEN;
memcpy(dptr, skb->data + 0, AX25_ADDR_LEN); memcpy(dptr, skb->data + 0, AX25_ADDR_LEN);
dptr[6] &= ~AX25_CBIT; dptr[6] &= ~AX25_CBIT;
dptr[6] |= AX25_EBIT; dptr[6] |= AX25_EBIT;
......
/* /*
* NET/ROM release 007 * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* *
* This code REQUIRES 2.1.15 or higher/ NET3.038 * Copyright Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk)
*
* This module:
* This module is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*
* History
* NET/ROM 001 Jonathan(G4KLX) Cloned from ax25_timer.c
* NET/ROM 007 Jonathan(G4KLX) New timer architecture.
* Implemented idle timer.
*/ */
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/socket.h> #include <linux/socket.h>
...@@ -223,7 +214,7 @@ static void nr_t1timer_expiry(unsigned long param) ...@@ -223,7 +214,7 @@ static void nr_t1timer_expiry(unsigned long param)
switch (nr->state) { switch (nr->state) {
case NR_STATE_1: case NR_STATE_1:
if (nr->n2count == nr->n2) { if (nr->n2count == nr->n2) {
nr_disconnect(sk, ETIMEDOUT); nr_disconnect(sk, ETIMEDOUT);
return; return;
......
/* -*- linux-c -*- /*
* sysctl_net_netrom.c: sysctl interface to net NET/ROM subsystem. * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* *
* Begun April 1, 1996, Mike Shaver. * Copyright (C) 1996 Mike Shaver (shaver@zeroknowledge.com)
* Added /proc/sys/net/netrom directory entry (empty =) ). [MS]
*/ */
#include <linux/mm.h> #include <linux/mm.h>
#include <linux/sysctl.h> #include <linux/sysctl.h>
#include <linux/init.h> #include <linux/init.h>
......
This diff is collapsed.
/* /*
* ROSE release 003 * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* *
* This code REQUIRES 2.1.15 or higher/ NET3.038 * Copyright (C) Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk)
*
* This module:
* This module is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*
* History
* ROSE 001 Jonathan(G4KLX) Cloned from nr_dev.c.
* Hans(PE1AYX) Fixed interface to IP layer.
*/ */
#include <linux/config.h> #include <linux/config.h>
#define __NO_VERSION__ #define __NO_VERSION__
#include <linux/module.h> #include <linux/module.h>
...@@ -29,7 +21,7 @@ ...@@ -29,7 +21,7 @@
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/fcntl.h> #include <linux/fcntl.h>
#include <linux/in.h> #include <linux/in.h>
#include <linux/if_ether.h> /* For the statistics structure. */ #include <linux/if_ether.h>
#include <asm/system.h> #include <asm/system.h>
#include <asm/io.h> #include <asm/io.h>
......
/* /*
* ROSE release 003 * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* *
* This code REQUIRES 2.1.15 or higher/ NET3.038 * Copyright (C) Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk)
* *
* This module: * Most of this code is based on the SDL diagrams published in the 7th ARRL
* This module is free software; you can redistribute it and/or * Computer Networking Conference papers. The diagrams have mistakes in them,
* modify it under the terms of the GNU General Public License * but are mostly correct. Before you modify the code could you read the SDL
* as published by the Free Software Foundation; either version * diagrams as the code is not obvious and probably very easy to break.
* 2 of the License, or (at your option) any later version.
*
* Most of this code is based on the SDL diagrams published in the 7th
* ARRL Computer Networking Conference papers. The diagrams have mistakes
* in them, but are mostly correct. Before you modify the code could you
* read the SDL diagrams as the code is not obvious and probably very
* easy to break;
*
* History
* ROSE 001 Jonathan(G4KLX) Cloned from nr_in.c
* ROSE 002 Jonathan(G4KLX) Return cause and diagnostic codes from Clear Requests.
* ROSE 003 Jonathan(G4KLX) New timer architecture.
* Removed M bit processing.
*/ */
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/socket.h> #include <linux/socket.h>
......
/* /*
* ROSE release 003 * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* *
* This code REQUIRES 2.1.15 or higher/ NET3.038 * Copyright (C) Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk)
*
* This module:
* This module is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*
* History
* ROSE 001 Jonathan(G4KLX) Cloned from rose_timer.c
* ROSE 003 Jonathan(G4KLX) New timer architecture.
*/ */
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/socket.h> #include <linux/socket.h>
......
/* /*
* ROSE release 003 * This program is free software; you can redistribute it and/or modify
* * it under the terms of the GNU General Public License as published by
* This code REQUIRES 2.1.15 or higher/ NET3.038 * the Free Software Foundation; either version 2 of the License, or
* * (at your option) any later version.
* This module:
* This module is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*
* History
* ROSE 003 Jonathan(G4KLX) Created this file from nr_loopback.c.
* *
* Copyright (C) Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk)
*/ */
#include <linux/types.h> #include <linux/types.h>
#include <linux/socket.h> #include <linux/socket.h>
#include <linux/timer.h> #include <linux/timer.h>
......
/* /*
* ROSE release 003 * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* *
* This code REQUIRES 2.1.15 or higher/ NET3.038 * Copyright (C) Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk)
*
* This module:
* This module is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*
* History
* ROSE 001 Jonathan(G4KLX) Cloned from nr_out.c
* ROSE 003 Jonathan(G4KLX) New timer architecture.
* Removed M bit processing.
*/ */
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/socket.h> #include <linux/socket.h>
...@@ -36,7 +27,7 @@ ...@@ -36,7 +27,7 @@
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <net/rose.h> #include <net/rose.h>
/* /*
* This procedure is passed a buffer descriptor for an iframe. It builds * This procedure is passed a buffer descriptor for an iframe. It builds
* the rest of the control part of the frame and then writes it out. * the rest of the control part of the frame and then writes it out.
*/ */
...@@ -52,7 +43,7 @@ static void rose_send_iframe(struct sock *sk, struct sk_buff *skb) ...@@ -52,7 +43,7 @@ static void rose_send_iframe(struct sock *sk, struct sk_buff *skb)
rose_start_idletimer(sk); rose_start_idletimer(sk);
rose_transmit_link(skb, rose->neighbour); rose_transmit_link(skb, rose->neighbour);
} }
void rose_kick(struct sock *sk) void rose_kick(struct sock *sk)
......
This diff is collapsed.
/* /*
* ROSE release 003 * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* *
* This code REQUIRES 2.1.15 or higher/ NET3.038 * Copyright (C) Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk)
*
* This module:
* This module is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*
* History
* ROSE 001 Jonathan(G4KLX) Cloned from nr_subr.c
* ROSE 002 Jonathan(G4KLX) Centralised disconnect processing.
* ROSE 003 Jonathan(G4KLX) Added use count to neighbours.
*/ */
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/socket.h> #include <linux/socket.h>
...@@ -103,7 +94,7 @@ int rose_validate_nr(struct sock *sk, unsigned short nr) ...@@ -103,7 +94,7 @@ int rose_validate_nr(struct sock *sk, unsigned short nr)
return nr == rose->vs; return nr == rose->vs;
} }
/* /*
* This routine is called when the packet layer internally generates a * This routine is called when the packet layer internally generates a
* control frame. * control frame.
*/ */
...@@ -138,7 +129,7 @@ void rose_write_internal(struct sock *sk, int frametype) ...@@ -138,7 +129,7 @@ void rose_write_internal(struct sock *sk, int frametype)
* Space for AX.25 header and PID. * Space for AX.25 header and PID.
*/ */
skb_reserve(skb, AX25_BPQ_HEADER_LEN + AX25_MAX_HEADER_LEN + 1); skb_reserve(skb, AX25_BPQ_HEADER_LEN + AX25_MAX_HEADER_LEN + 1);
dptr = skb_put(skb, skb_tailroom(skb)); dptr = skb_put(skb, skb_tailroom(skb));
lci1 = (rose->lci >> 8) & 0x0F; lci1 = (rose->lci >> 8) & 0x0F;
......
/* /*
* ROSE release 003 * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* *
* This code REQUIRES 2.1.15 or higher/ NET3.038 * Copyright (C) Jonathan Naylor G4KLX (g4klx@g4klx.demon.co.uk)
*
* This module:
* This module is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*
* History
* ROSE 001 Jonathan(G4KLX) Cloned from nr_timer.c
* ROSE 003 Jonathan(G4KLX) New timer architecture.
* Implemented idle timer.
*/ */
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/socket.h> #include <linux/socket.h>
...@@ -210,7 +201,7 @@ static void rose_idletimer_expiry(unsigned long param) ...@@ -210,7 +201,7 @@ static void rose_idletimer_expiry(unsigned long param)
sk->state = TCP_CLOSE; sk->state = TCP_CLOSE;
sk->err = 0; sk->err = 0;
sk->shutdown |= SEND_SHUTDOWN; sk->shutdown |= SEND_SHUTDOWN;
if (!sk->dead) if (!sk->dead)
sk->state_change(sk); sk->state_change(sk);
......
/* -*- linux-c -*- /*
* sysctl_net_rose.c: sysctl interface to net ROSE subsystem. * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* *
* Begun April 1, 1996, Mike Shaver. * Copyright (C) 1996 Mike Shaver (shaver@zeroknowledge.com)
* Added /proc/sys/net/rose directory entry (empty =) ). [MS]
*/ */
#include <linux/mm.h> #include <linux/mm.h>
#include <linux/sysctl.h> #include <linux/sysctl.h>
#include <linux/init.h> #include <linux/init.h>
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment