diff options
author | Ralf Baechle <ralf@linux-mips.org> | 1999-02-15 02:15:32 +0000 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 1999-02-15 02:15:32 +0000 |
commit | 86464aed71025541805e7b1515541aee89879e33 (patch) | |
tree | e01a457a4912a8553bc65524aa3125d51f29f810 /net/ax25 | |
parent | 88f99939ecc6a95a79614574cb7d95ffccfc3466 (diff) |
Merge with Linux 2.2.1.
Diffstat (limited to 'net/ax25')
-rw-r--r-- | net/ax25/af_ax25.c | 16 | ||||
-rw-r--r-- | net/ax25/ax25_ds_in.c | 39 | ||||
-rw-r--r-- | net/ax25/ax25_ds_timer.c | 14 | ||||
-rw-r--r-- | net/ax25/ax25_in.c | 4 | ||||
-rw-r--r-- | net/ax25/ax25_out.c | 7 |
5 files changed, 49 insertions, 31 deletions
diff --git a/net/ax25/af_ax25.c b/net/ax25/af_ax25.c index 77cb218d3..f9392fe34 100644 --- a/net/ax25/af_ax25.c +++ b/net/ax25/af_ax25.c @@ -1242,21 +1242,17 @@ static int ax25_accept(struct socket *sock, struct socket *newsock, int flags) return -EINVAL; /* - * The write queue this time is holding sockets ready to use + * The read queue this time is holding sockets ready to use * hooked into the SABM we saved */ do { - cli(); if ((skb = skb_dequeue(&sk->receive_queue)) == NULL) { - if (flags & O_NONBLOCK) { - sti(); + if (flags & O_NONBLOCK) return -EWOULDBLOCK; - } + interruptible_sleep_on(sk->sleep); - if (signal_pending(current)) { - sti(); + if (signal_pending(current)) return -ERESTARTSYS; - } } } while (skb == NULL); @@ -1264,10 +1260,10 @@ static int ax25_accept(struct socket *sock, struct socket *newsock, int flags) newsk->pair = NULL; newsk->socket = newsock; newsk->sleep = &newsock->wait; - sti(); /* Now attach up the new socket */ skb->sk = NULL; + skb->destructor = NULL; kfree_skb(skb); sk->ack_backlog--; newsock->sk = newsk; @@ -1810,7 +1806,7 @@ __initfunc(void ax25_proto_init(struct net_proto *pro)) proc_net_register(&proc_ax25_calls); #endif - printk(KERN_INFO "G4KLX/GW4PTS AX.25 for Linux. Version 0.37 for Linux NET3.038 (Linux 2.1)\n"); + printk(KERN_INFO "NET4: G4KLX/GW4PTS AX.25 for Linux. Version 0.37 for Linux NET4.0\n"); } #ifdef MODULE diff --git a/net/ax25/ax25_ds_in.c b/net/ax25/ax25_ds_in.c index 6b5e68236..464122823 100644 --- a/net/ax25/ax25_ds_in.c +++ b/net/ax25/ax25_ds_in.c @@ -19,6 +19,7 @@ * 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/config.h> @@ -47,7 +48,7 @@ /* * State machine for state 1, Awaiting Connection State. - * The handling of the timer(s) is in file ax25_timer.c. + * The handling of the timer(s) is in file ax25_ds_timer.c. * Handling of state 0 and connection release is in ax25.c. */ static int ax25_ds_state1_machine(ax25_cb *ax25, struct sk_buff *skb, int frametype, int pf, int type) @@ -58,6 +59,12 @@ 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_send_control(ax25, AX25_UA, pf, AX25_RESPONSE); break; + + case AX25_SABME: + ax25->modulus = AX25_EMODULUS; + ax25->window = ax25->ax25_dev->values[AX25_VALUES_EWINDOW]; + ax25_send_control(ax25, AX25_UA, pf, AX25_RESPONSE); + break; case AX25_DISC: ax25_send_control(ax25, AX25_DM, pf, AX25_RESPONSE); @@ -83,7 +90,7 @@ static int ax25_ds_state1_machine(ax25_cb *ax25, struct sk_buff *skb, int framet /* according to DK4EG´s spec we are required to * send a RR RESPONSE FINAL NR=0. Please mail - * <jr@lykos.oche.de> if this causes problems + * <jreuter@poboxes.com> if this causes problems * with the TheNetNode DAMA Master implementation. */ @@ -104,13 +111,14 @@ static int ax25_ds_state1_machine(ax25_cb *ax25, struct sk_buff *skb, int framet /* * State machine for state 2, Awaiting Release State. - * The handling of the timer(s) is in file ax25_timer.c + * The handling of the timer(s) is in file ax25_ds_timer.c * Handling of state 0 and connection release is in ax25.c. */ static int ax25_ds_state2_machine(ax25_cb *ax25, struct sk_buff *skb, int frametype, int pf, int type) { switch (frametype) { case AX25_SABM: + case AX25_SABME: ax25_send_control(ax25, AX25_DISC, AX25_POLLON, AX25_COMMAND); ax25_dama_off(ax25); break; @@ -157,8 +165,14 @@ static int ax25_ds_state3_machine(ax25_cb *ax25, struct sk_buff *skb, int framet switch (frametype) { case AX25_SABM: - ax25->modulus = AX25_MODULUS; - ax25->window = ax25->ax25_dev->values[AX25_VALUES_WINDOW]; + case AX25_SABME: + if (frametype == AX25_SABM) { + ax25->modulus = AX25_MODULUS; + ax25->window = ax25->ax25_dev->values[AX25_VALUES_WINDOW]; + } else { + ax25->modulus = AX25_EMODULUS; + ax25->window = ax25->ax25_dev->values[AX25_VALUES_EWINDOW]; + } ax25_send_control(ax25, AX25_UA, pf, AX25_RESPONSE); ax25_stop_t1timer(ax25); ax25_start_t3timer(ax25); @@ -188,8 +202,10 @@ static int ax25_ds_state3_machine(ax25_cb *ax25, struct sk_buff *skb, int framet ax25->condition &= ~AX25_COND_PEER_RX_BUSY; else ax25->condition |= AX25_COND_PEER_RX_BUSY; + if (ax25_validate_nr(ax25, nr)) { - ax25_check_iframes_acked(ax25, nr); + if (ax25_check_iframes_acked(ax25, nr)) + ax25->n2count=0; if (type == AX25_COMMAND && pf) ax25_ds_enquiry_response(ax25); } else { @@ -200,13 +216,17 @@ static int ax25_ds_state3_machine(ax25_cb *ax25, struct sk_buff *skb, int framet case AX25_REJ: ax25->condition &= ~AX25_COND_PEER_RX_BUSY; + if (ax25_validate_nr(ax25, nr)) { + if (ax25->va != nr) + ax25->n2count=0; + ax25_frames_acked(ax25, nr); ax25_calculate_rtt(ax25); ax25_stop_t1timer(ax25); ax25_start_t3timer(ax25); - ax25->n2count = 0; ax25_requeue_frames(ax25); + if (type == AX25_COMMAND && pf) ax25_ds_enquiry_response(ax25); } else { @@ -225,14 +245,15 @@ static int ax25_ds_state3_machine(ax25_cb *ax25, struct sk_buff *skb, int framet ax25_frames_acked(ax25, nr); ax25->n2count = 0; } else { - ax25_check_iframes_acked(ax25, nr); + if (ax25_check_iframes_acked(ax25, nr)) + ax25->n2count = 0; } if (ax25->condition & AX25_COND_OWN_RX_BUSY) { if (pf) ax25_ds_enquiry_response(ax25); break; } if (ns == ax25->vr) { - ax25->vr = (ax25->vr + 1) % AX25_MODULUS; + ax25->vr = (ax25->vr + 1) % ax25->modulus; queued = ax25_rx_iframe(ax25, skb); if (ax25->condition & AX25_COND_OWN_RX_BUSY) ax25->vr = ns; /* ax25->vr - 1 */ diff --git a/net/ax25/ax25_ds_timer.c b/net/ax25/ax25_ds_timer.c index 841149996..06135e9de 100644 --- a/net/ax25/ax25_ds_timer.c +++ b/net/ax25/ax25_ds_timer.c @@ -119,8 +119,10 @@ void ax25_ds_heartbeat_expiry(ax25_cb *ax25) * Check the state of the receive buffer. */ if (ax25->sk != NULL) { - if (atomic_read(&ax25->sk->rmem_alloc) < (ax25->sk->rcvbuf / 2) && (ax25->condition & AX25_COND_OWN_RX_BUSY)) { + 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_ACK_PENDING; break; } } @@ -150,17 +152,11 @@ void ax25_ds_idletimer_expiry(ax25_cb *ax25) ax25_clear_queues(ax25); ax25->n2count = 0; - - /* state 1 or 2 should not happen, but... */ - - if (ax25->state == AX25_STATE_1 || ax25->state == AX25_STATE_2) - ax25->state = AX25_STATE_0; - else - ax25->state = AX25_STATE_2; + ax25->state = AX25_STATE_2; ax25_calculate_t1(ax25); ax25_start_t1timer(ax25); - ax25_start_t3timer(ax25); + ax25_stop_t3timer(ax25); if (ax25->sk != NULL) { ax25->sk->state = TCP_CLOSE; diff --git a/net/ax25/ax25_in.c b/net/ax25/ax25_in.c index 79fef3dcb..dee4565ad 100644 --- a/net/ax25/ax25_in.c +++ b/net/ax25/ax25_in.c @@ -389,10 +389,9 @@ static int ax25_rcv(struct sk_buff *skb, struct device *dev, ax25_address *dev_a } ax25 = make->protinfo.ax25; - + skb_set_owner_r(skb, make); skb_queue_head(&sk->receive_queue, skb); - skb->sk = make; make->state = TCP_ESTABLISHED; make->pair = sk; @@ -473,6 +472,7 @@ static int ax25_rcv(struct sk_buff *skb, struct device *dev, ax25_address *dev_a int ax25_kiss_rcv(struct sk_buff *skb, struct device *dev, struct packet_type *ptype) { skb->sk = NULL; /* Initially we don't know who it's for */ + skb->destructor = NULL; /* Who initializes this, dammit?! */ if ((*skb->data & 0x0F) != 0) { kfree_skb(skb); /* Not a KISS data frame */ diff --git a/net/ax25/ax25_out.c b/net/ax25/ax25_out.c index beac955e5..423b6690b 100644 --- a/net/ax25/ax25_out.c +++ b/net/ax25/ax25_out.c @@ -30,6 +30,8 @@ * 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> @@ -391,20 +393,23 @@ void ax25_queue_xmit(struct sk_buff *skb) dev_queue_xmit(skb); } -void ax25_check_iframes_acked(ax25_cb *ax25, unsigned short nr) +int ax25_check_iframes_acked(ax25_cb *ax25, unsigned short nr) { if (ax25->vs == nr) { ax25_frames_acked(ax25, nr); ax25_calculate_rtt(ax25); ax25_stop_t1timer(ax25); ax25_start_t3timer(ax25); + return 1; } else { if (ax25->va != nr) { ax25_frames_acked(ax25, nr); ax25_calculate_t1(ax25); ax25_start_t1timer(ax25); + return 1; } } + return 0; } #endif |