diff options
author | Arnaldo Carvalho de Melo <acme@conectiva.com.br> | 2002-09-28 20:07:09 -0300 |
---|---|---|
committer | David S. Miller <davem@nuts.ninka.net> | 2002-09-28 20:07:09 -0300 |
commit | a134be24c2012076738593dc3d299765f4d40be3 (patch) | |
tree | 6aa5aeb39dec91fa715aa75d020a16084dfaa92f /net/lapb/lapb_subr.c | |
parent | 2150b1f5e5c41d4f48f1712c82e068de95c9bfe3 (diff) |
o LAPB: use refcounts and rwlock to protect lapb_cb and list
Also some CodingStyle code reformatting.
Ah, killed the typedef for lapb_cb.
Diffstat (limited to 'net/lapb/lapb_subr.c')
-rw-r--r-- | net/lapb/lapb_subr.c | 85 |
1 files changed, 55 insertions, 30 deletions
diff --git a/net/lapb/lapb_subr.c b/net/lapb/lapb_subr.c index 439a6dd8a8b8..36e1769330e4 100644 --- a/net/lapb/lapb_subr.c +++ b/net/lapb/lapb_subr.c @@ -36,7 +36,7 @@ /* * This routine purges all the queues of frames. */ -void lapb_clear_queues(lapb_cb *lapb) +void lapb_clear_queues(struct lapb_cb *lapb) { skb_queue_purge(&lapb->write_queue); skb_queue_purge(&lapb->ack_queue); @@ -47,7 +47,7 @@ void lapb_clear_queues(lapb_cb *lapb) * acknowledged. This replaces the boxes labelled "V(a) <- N(r)" on the * SDL diagram. */ -void lapb_frames_acked(lapb_cb *lapb, unsigned short nr) +void lapb_frames_acked(struct lapb_cb *lapb, unsigned short nr) { struct sk_buff *skb; int modulus; @@ -57,16 +57,15 @@ void lapb_frames_acked(lapb_cb *lapb, unsigned short nr) /* * Remove all the ack-ed frames from the ack queue. */ - if (lapb->va != nr) { - while (skb_peek(&lapb->ack_queue) != NULL && lapb->va != nr) { + if (lapb->va != nr) + while (skb_peek(&lapb->ack_queue) && lapb->va != nr) { skb = skb_dequeue(&lapb->ack_queue); kfree_skb(skb); lapb->va = (lapb->va + 1) % modulus; } - } } -void lapb_requeue_frames(lapb_cb *lapb) +void lapb_requeue_frames(struct lapb_cb *lapb) { struct sk_buff *skb, *skb_prev = NULL; @@ -76,7 +75,7 @@ void lapb_requeue_frames(lapb_cb *lapb) * possibility of an empty output queue. */ while ((skb = skb_dequeue(&lapb->ack_queue)) != NULL) { - if (skb_prev == NULL) + if (!skb_prev) skb_queue_head(&lapb->write_queue, skb); else skb_append(skb_prev, skb); @@ -88,7 +87,7 @@ void lapb_requeue_frames(lapb_cb *lapb) * Validate that the value of nr is between va and vs. Return true or * false for testing. */ -int lapb_validate_nr(lapb_cb *lapb, unsigned short nr) +int lapb_validate_nr(struct lapb_cb *lapb, unsigned short nr) { unsigned short vc = lapb->va; int modulus; @@ -96,25 +95,27 @@ int lapb_validate_nr(lapb_cb *lapb, unsigned short nr) modulus = (lapb->mode & LAPB_EXTENDED) ? LAPB_EMODULUS : LAPB_SMODULUS; while (vc != lapb->vs) { - if (nr == vc) return 1; + if (nr == vc) + return 1; vc = (vc + 1) % modulus; } - if (nr == lapb->vs) return 1; - - return 0; + return nr == lapb->vs; } /* * This routine is the centralised routine for parsing the control * information for the different frame formats. */ -void lapb_decode(lapb_cb *lapb, struct sk_buff *skb, struct lapb_frame *frame) +void lapb_decode(struct lapb_cb *lapb, struct sk_buff *skb, + struct lapb_frame *frame) { frame->type = LAPB_ILLEGAL; #if LAPB_DEBUG > 2 - printk(KERN_DEBUG "lapb: (%p) S%d RX %02X %02X %02X\n", lapb->token, lapb->state, skb->data[0], skb->data[1], skb->data[2]); + printk(KERN_DEBUG "lapb: (%p) S%d RX %02X %02X %02X\n", + lapb->token, lapb->state, + skb->data[0], skb->data[1], skb->data[2]); #endif if (lapb->mode & LAPB_MLP) { @@ -146,22 +147,31 @@ void lapb_decode(lapb_cb *lapb, struct sk_buff *skb, struct lapb_frame *frame) skb_pull(skb, 1); if (lapb->mode & LAPB_EXTENDED) { - if ((skb->data[0] & LAPB_S) == 0) { - frame->type = LAPB_I; /* I frame - carries NR/NS/PF */ + if (!(skb->data[0] & LAPB_S)) { + /* + * I frame - carries NR/NS/PF + */ + frame->type = LAPB_I; frame->ns = (skb->data[0] >> 1) & 0x7F; frame->nr = (skb->data[1] >> 1) & 0x7F; frame->pf = skb->data[1] & LAPB_EPF; frame->control[0] = skb->data[0]; frame->control[1] = skb->data[1]; skb_pull(skb, 2); - } else if ((skb->data[0] & LAPB_U) == 1) { /* S frame - take out PF/NR */ + } else if ((skb->data[0] & LAPB_U) == 1) { + /* + * S frame - take out PF/NR + */ frame->type = skb->data[0] & 0x0F; frame->nr = (skb->data[1] >> 1) & 0x7F; frame->pf = skb->data[1] & LAPB_EPF; frame->control[0] = skb->data[0]; frame->control[1] = skb->data[1]; skb_pull(skb, 2); - } else if ((skb->data[0] & LAPB_U) == 3) { /* U frame - take out PF */ + } else if ((skb->data[0] & LAPB_U) == 3) { + /* + * U frame - take out PF + */ frame->type = skb->data[0] & ~LAPB_SPF; frame->pf = skb->data[0] & LAPB_SPF; frame->control[0] = skb->data[0]; @@ -169,16 +179,25 @@ void lapb_decode(lapb_cb *lapb, struct sk_buff *skb, struct lapb_frame *frame) skb_pull(skb, 1); } } else { - if ((skb->data[0] & LAPB_S) == 0) { - frame->type = LAPB_I; /* I frame - carries NR/NS/PF */ + if (!(skb->data[0] & LAPB_S)) { + /* + * I frame - carries NR/NS/PF + */ + frame->type = LAPB_I; frame->ns = (skb->data[0] >> 1) & 0x07; frame->nr = (skb->data[0] >> 5) & 0x07; frame->pf = skb->data[0] & LAPB_SPF; - } else if ((skb->data[0] & LAPB_U) == 1) { /* S frame - take out PF/NR */ + } else if ((skb->data[0] & LAPB_U) == 1) { + /* + * S frame - take out PF/NR + */ frame->type = skb->data[0] & 0x0F; frame->nr = (skb->data[0] >> 5) & 0x07; frame->pf = skb->data[0] & LAPB_SPF; - } else if ((skb->data[0] & LAPB_U) == 3) { /* U frame - take out PF */ + } else if ((skb->data[0] & LAPB_U) == 3) { + /* + * U frame - take out PF + */ frame->type = skb->data[0] & ~LAPB_SPF; frame->pf = skb->data[0] & LAPB_SPF; } @@ -195,7 +214,8 @@ void lapb_decode(lapb_cb *lapb, struct sk_buff *skb, struct lapb_frame *frame) * Only supervisory or unnumbered frames are processed, FRMRs are handled * by lapb_transmit_frmr below. */ -void lapb_send_control(lapb_cb *lapb, int frametype, int poll_bit, int type) +void lapb_send_control(struct lapb_cb *lapb, int frametype, + int poll_bit, int type) { struct sk_buff *skb; unsigned char *dptr; @@ -209,18 +229,18 @@ void lapb_send_control(lapb_cb *lapb, int frametype, int poll_bit, int type) if ((frametype & LAPB_U) == LAPB_U) { dptr = skb_put(skb, 1); *dptr = frametype; - *dptr |= (poll_bit) ? LAPB_SPF : 0; + *dptr |= poll_bit ? LAPB_SPF : 0; } else { dptr = skb_put(skb, 2); dptr[0] = frametype; dptr[1] = (lapb->vr << 1); - dptr[1] |= (poll_bit) ? LAPB_EPF : 0; + dptr[1] |= poll_bit ? LAPB_EPF : 0; } } else { dptr = skb_put(skb, 1); *dptr = frametype; - *dptr |= (poll_bit) ? LAPB_SPF : 0; - if ((frametype & LAPB_U) == LAPB_S) /* S frames carry NR */ + *dptr |= poll_bit ? LAPB_SPF : 0; + if ((frametype & LAPB_U) == LAPB_S) /* S frames carry NR */ *dptr |= (lapb->vr << 5); } @@ -231,7 +251,7 @@ void lapb_send_control(lapb_cb *lapb, int frametype, int poll_bit, int type) * This routine generates FRMRs based on information previously stored in * the LAPB control block. */ -void lapb_transmit_frmr(lapb_cb *lapb) +void lapb_transmit_frmr(struct lapb_cb *lapb) { struct sk_buff *skb; unsigned char *dptr; @@ -254,7 +274,10 @@ void lapb_transmit_frmr(lapb_cb *lapb) *dptr++ = lapb->frmr_type; #if LAPB_DEBUG > 1 - printk(KERN_DEBUG "lapb: (%p) S%d TX FRMR %02X %02X %02X %02X %02X\n", lapb->token, lapb->state, skb->data[1], skb->data[2], skb->data[3], skb->data[4], skb->data[5]); + printk(KERN_DEBUG "lapb: (%p) S%d TX FRMR %02X %02X %02X %02X %02X\n", + lapb->token, lapb->state, + skb->data[1], skb->data[2], skb->data[3], + skb->data[4], skb->data[5]); #endif } else { dptr = skb_put(skb, 4); @@ -268,7 +291,9 @@ void lapb_transmit_frmr(lapb_cb *lapb) *dptr++ = lapb->frmr_type; #if LAPB_DEBUG > 1 - printk(KERN_DEBUG "lapb: (%p) S%d TX FRMR %02X %02X %02X\n", lapb->token, lapb->state, skb->data[1], skb->data[2], skb->data[3]); + printk(KERN_DEBUG "lapb: (%p) S%d TX FRMR %02X %02X %02X\n", + lapb->token, lapb->state, skb->data[1], + skb->data[2], skb->data[3]); #endif } |