aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ppp_generic.c
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2010-10-05 04:36:52 -0400
committerDavid S. Miller <davem@davemloft.net>2010-10-05 04:36:52 -0400
commita00eac0c459abecb539fb2a2abd3122dd7ca5d4a (patch)
tree53c69204e88eff280923d7f84dc9796a9ed0af9b /drivers/net/ppp_generic.c
parentc61393ea83573ff422af505b6fd49ef9ec9b91ca (diff)
ppp: Use a real SKB control block in fragmentation engine.
Do this instead of subverting fields in skb proper. The macros that could very easily match variable or function names were also just asking for trouble. Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ppp_generic.c')
-rw-r--r--drivers/net/ppp_generic.c46
1 files changed, 25 insertions, 21 deletions
diff --git a/drivers/net/ppp_generic.c b/drivers/net/ppp_generic.c
index 736b91703b3e..866e221643ab 100644
--- a/drivers/net/ppp_generic.c
+++ b/drivers/net/ppp_generic.c
@@ -1547,9 +1547,11 @@ ppp_channel_push(struct channel *pch)
1547 * Receive-side routines. 1547 * Receive-side routines.
1548 */ 1548 */
1549 1549
1550/* misuse a few fields of the skb for MP reconstruction */ 1550struct ppp_mp_skb_parm {
1551#define sequence priority 1551 u32 sequence;
1552#define BEbits cb[0] 1552 u8 BEbits;
1553};
1554#define PPP_MP_CB(skb) ((struct ppp_mp_skb_parm *)((skb)->cb))
1553 1555
1554static inline void 1556static inline void
1555ppp_do_recv(struct ppp *ppp, struct sk_buff *skb, struct channel *pch) 1557ppp_do_recv(struct ppp *ppp, struct sk_buff *skb, struct channel *pch)
@@ -1878,13 +1880,13 @@ ppp_receive_mp_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch)
1878 seq = (skb->data[3] << 16) | (skb->data[4] << 8)| skb->data[5]; 1880 seq = (skb->data[3] << 16) | (skb->data[4] << 8)| skb->data[5];
1879 mask = 0xffffff; 1881 mask = 0xffffff;
1880 } 1882 }
1881 skb->BEbits = skb->data[2]; 1883 PPP_MP_CB(skb)->BEbits = skb->data[2];
1882 skb_pull(skb, mphdrlen); /* pull off PPP and MP headers */ 1884 skb_pull(skb, mphdrlen); /* pull off PPP and MP headers */
1883 1885
1884 /* 1886 /*
1885 * Do protocol ID decompression on the first fragment of each packet. 1887 * Do protocol ID decompression on the first fragment of each packet.
1886 */ 1888 */
1887 if ((skb->BEbits & B) && (skb->data[0] & 1)) 1889 if ((PPP_MP_CB(skb)->BEbits & B) && (skb->data[0] & 1))
1888 *skb_push(skb, 1) = 0; 1890 *skb_push(skb, 1) = 0;
1889 1891
1890 /* 1892 /*
@@ -1896,7 +1898,7 @@ ppp_receive_mp_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch)
1896 seq += mask + 1; 1898 seq += mask + 1;
1897 else if ((int)(seq - ppp->minseq) > (int)(mask >> 1)) 1899 else if ((int)(seq - ppp->minseq) > (int)(mask >> 1))
1898 seq -= mask + 1; /* should never happen */ 1900 seq -= mask + 1; /* should never happen */
1899 skb->sequence = seq; 1901 PPP_MP_CB(skb)->sequence = seq;
1900 pch->lastseq = seq; 1902 pch->lastseq = seq;
1901 1903
1902 /* 1904 /*
@@ -1932,8 +1934,8 @@ ppp_receive_mp_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch)
1932 before the start of the queue. */ 1934 before the start of the queue. */
1933 if (skb_queue_len(&ppp->mrq) >= PPP_MP_MAX_QLEN) { 1935 if (skb_queue_len(&ppp->mrq) >= PPP_MP_MAX_QLEN) {
1934 struct sk_buff *mskb = skb_peek(&ppp->mrq); 1936 struct sk_buff *mskb = skb_peek(&ppp->mrq);
1935 if (seq_before(ppp->minseq, mskb->sequence)) 1937 if (seq_before(ppp->minseq, PPP_MP_CB(mskb)->sequence))
1936 ppp->minseq = mskb->sequence; 1938 ppp->minseq = PPP_MP_CB(mskb)->sequence;
1937 } 1939 }
1938 1940
1939 /* Pull completed packets off the queue and receive them. */ 1941 /* Pull completed packets off the queue and receive them. */
@@ -1963,12 +1965,12 @@ ppp_mp_insert(struct ppp *ppp, struct sk_buff *skb)
1963{ 1965{
1964 struct sk_buff *p; 1966 struct sk_buff *p;
1965 struct sk_buff_head *list = &ppp->mrq; 1967 struct sk_buff_head *list = &ppp->mrq;
1966 u32 seq = skb->sequence; 1968 u32 seq = PPP_MP_CB(skb)->sequence;
1967 1969
1968 /* N.B. we don't need to lock the list lock because we have the 1970 /* N.B. we don't need to lock the list lock because we have the
1969 ppp unit receive-side lock. */ 1971 ppp unit receive-side lock. */
1970 skb_queue_walk(list, p) { 1972 skb_queue_walk(list, p) {
1971 if (seq_before(seq, p->sequence)) 1973 if (seq_before(seq, PPP_MP_CB(p)->sequence))
1972 break; 1974 break;
1973 } 1975 }
1974 __skb_queue_before(list, p, skb); 1976 __skb_queue_before(list, p, skb);
@@ -1997,22 +1999,22 @@ ppp_mp_reconstruct(struct ppp *ppp)
1997 tail = NULL; 1999 tail = NULL;
1998 for (p = head; p != (struct sk_buff *) list; p = next) { 2000 for (p = head; p != (struct sk_buff *) list; p = next) {
1999 next = p->next; 2001 next = p->next;
2000 if (seq_before(p->sequence, seq)) { 2002 if (seq_before(PPP_MP_CB(p)->sequence, seq)) {
2001 /* this can't happen, anyway ignore the skb */ 2003 /* this can't happen, anyway ignore the skb */
2002 printk(KERN_ERR "ppp_mp_reconstruct bad seq %u < %u\n", 2004 printk(KERN_ERR "ppp_mp_reconstruct bad seq %u < %u\n",
2003 p->sequence, seq); 2005 PPP_MP_CB(p)->sequence, seq);
2004 head = next; 2006 head = next;
2005 continue; 2007 continue;
2006 } 2008 }
2007 if (p->sequence != seq) { 2009 if (PPP_MP_CB(p)->sequence != seq) {
2008 /* Fragment `seq' is missing. If it is after 2010 /* Fragment `seq' is missing. If it is after
2009 minseq, it might arrive later, so stop here. */ 2011 minseq, it might arrive later, so stop here. */
2010 if (seq_after(seq, minseq)) 2012 if (seq_after(seq, minseq))
2011 break; 2013 break;
2012 /* Fragment `seq' is lost, keep going. */ 2014 /* Fragment `seq' is lost, keep going. */
2013 lost = 1; 2015 lost = 1;
2014 seq = seq_before(minseq, p->sequence)? 2016 seq = seq_before(minseq, PPP_MP_CB(p)->sequence)?
2015 minseq + 1: p->sequence; 2017 minseq + 1: PPP_MP_CB(p)->sequence;
2016 next = p; 2018 next = p;
2017 continue; 2019 continue;
2018 } 2020 }
@@ -2026,7 +2028,7 @@ ppp_mp_reconstruct(struct ppp *ppp)
2026 */ 2028 */
2027 2029
2028 /* B bit set indicates this fragment starts a packet */ 2030 /* B bit set indicates this fragment starts a packet */
2029 if (p->BEbits & B) { 2031 if (PPP_MP_CB(p)->BEbits & B) {
2030 head = p; 2032 head = p;
2031 lost = 0; 2033 lost = 0;
2032 len = 0; 2034 len = 0;
@@ -2035,7 +2037,8 @@ ppp_mp_reconstruct(struct ppp *ppp)
2035 len += p->len; 2037 len += p->len;
2036 2038
2037 /* Got a complete packet yet? */ 2039 /* Got a complete packet yet? */
2038 if (lost == 0 && (p->BEbits & E) && (head->BEbits & B)) { 2040 if (lost == 0 && (PPP_MP_CB(p)->BEbits & E) &&
2041 (PPP_MP_CB(head)->BEbits & B)) {
2039 if (len > ppp->mrru + 2) { 2042 if (len > ppp->mrru + 2) {
2040 ++ppp->dev->stats.rx_length_errors; 2043 ++ppp->dev->stats.rx_length_errors;
2041 printk(KERN_DEBUG "PPP: reconstructed packet" 2044 printk(KERN_DEBUG "PPP: reconstructed packet"
@@ -2061,7 +2064,7 @@ ppp_mp_reconstruct(struct ppp *ppp)
2061 * and we haven't found a complete valid packet yet, 2064 * and we haven't found a complete valid packet yet,
2062 * we can discard up to and including this fragment. 2065 * we can discard up to and including this fragment.
2063 */ 2066 */
2064 if (p->BEbits & E) 2067 if (PPP_MP_CB(p)->BEbits & E)
2065 head = next; 2068 head = next;
2066 2069
2067 ++seq; 2070 ++seq;
@@ -2071,10 +2074,11 @@ ppp_mp_reconstruct(struct ppp *ppp)
2071 if (tail != NULL) { 2074 if (tail != NULL) {
2072 /* If we have discarded any fragments, 2075 /* If we have discarded any fragments,
2073 signal a receive error. */ 2076 signal a receive error. */
2074 if (head->sequence != ppp->nextseq) { 2077 if (PPP_MP_CB(head)->sequence != ppp->nextseq) {
2075 if (ppp->debug & 1) 2078 if (ppp->debug & 1)
2076 printk(KERN_DEBUG " missed pkts %u..%u\n", 2079 printk(KERN_DEBUG " missed pkts %u..%u\n",
2077 ppp->nextseq, head->sequence-1); 2080 ppp->nextseq,
2081 PPP_MP_CB(head)->sequence-1);
2078 ++ppp->dev->stats.rx_dropped; 2082 ++ppp->dev->stats.rx_dropped;
2079 ppp_receive_error(ppp); 2083 ppp_receive_error(ppp);
2080 } 2084 }
@@ -2083,7 +2087,7 @@ ppp_mp_reconstruct(struct ppp *ppp)
2083 /* copy to a single skb */ 2087 /* copy to a single skb */
2084 for (p = head; p != tail->next; p = p->next) 2088 for (p = head; p != tail->next; p = p->next)
2085 skb_copy_bits(p, 0, skb_put(skb, p->len), p->len); 2089 skb_copy_bits(p, 0, skb_put(skb, p->len), p->len);
2086 ppp->nextseq = tail->sequence + 1; 2090 ppp->nextseq = PPP_MP_CB(tail)->sequence + 1;
2087 head = tail->next; 2091 head = tail->next;
2088 } 2092 }
2089 2093