Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6: (1699 commits) bnx2/bnx2x: Unsupported Ethtool operations should return -EINVAL. vlan: Calling vlan_hwaccel_do_receive() is always valid. tproxy: use the interface primary IP address as a default value for --on-ip tproxy: added IPv6 support to the socket match cxgb3: function namespace cleanup tproxy: added IPv6 support to the TPROXY target tproxy: added IPv6 socket lookup function to nf_tproxy_core be2net: Changes to use only priority codes allowed by f/w tproxy: allow non-local binds of IPv6 sockets if IP_TRANSPARENT is enabled tproxy: added tproxy sockopt interface in the IPV6 layer tproxy: added udp6_lib_lookup function tproxy: added const specifiers to udp lookup functions tproxy: split off ipv6 defragmentation to a separate module l2tp: small cleanup nf_nat: restrict ICMP translation for embedded header can: mcp251x: fix generation of error frames can: mcp251x: fix endless loop in interrupt handler if CANINTF_MERRF is set can-raw: add msg_flags to distinguish local traffic 9p: client code cleanup rds: make local functions/variables static ... Fix up conflicts in net/core/dev.c, drivers/net/pcmcia/smc91c92_cs.c and drivers/net/wireless/ath/ath9k/debug.c as per David
This commit is contained in:
@@ -1548,9 +1548,11 @@ ppp_channel_push(struct channel *pch)
|
||||
* Receive-side routines.
|
||||
*/
|
||||
|
||||
/* misuse a few fields of the skb for MP reconstruction */
|
||||
#define sequence priority
|
||||
#define BEbits cb[0]
|
||||
struct ppp_mp_skb_parm {
|
||||
u32 sequence;
|
||||
u8 BEbits;
|
||||
};
|
||||
#define PPP_MP_CB(skb) ((struct ppp_mp_skb_parm *)((skb)->cb))
|
||||
|
||||
static inline void
|
||||
ppp_do_recv(struct ppp *ppp, struct sk_buff *skb, struct channel *pch)
|
||||
@@ -1879,13 +1881,13 @@ ppp_receive_mp_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch)
|
||||
seq = (skb->data[3] << 16) | (skb->data[4] << 8)| skb->data[5];
|
||||
mask = 0xffffff;
|
||||
}
|
||||
skb->BEbits = skb->data[2];
|
||||
PPP_MP_CB(skb)->BEbits = skb->data[2];
|
||||
skb_pull(skb, mphdrlen); /* pull off PPP and MP headers */
|
||||
|
||||
/*
|
||||
* Do protocol ID decompression on the first fragment of each packet.
|
||||
*/
|
||||
if ((skb->BEbits & B) && (skb->data[0] & 1))
|
||||
if ((PPP_MP_CB(skb)->BEbits & B) && (skb->data[0] & 1))
|
||||
*skb_push(skb, 1) = 0;
|
||||
|
||||
/*
|
||||
@@ -1897,7 +1899,7 @@ ppp_receive_mp_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch)
|
||||
seq += mask + 1;
|
||||
else if ((int)(seq - ppp->minseq) > (int)(mask >> 1))
|
||||
seq -= mask + 1; /* should never happen */
|
||||
skb->sequence = seq;
|
||||
PPP_MP_CB(skb)->sequence = seq;
|
||||
pch->lastseq = seq;
|
||||
|
||||
/*
|
||||
@@ -1933,8 +1935,8 @@ ppp_receive_mp_frame(struct ppp *ppp, struct sk_buff *skb, struct channel *pch)
|
||||
before the start of the queue. */
|
||||
if (skb_queue_len(&ppp->mrq) >= PPP_MP_MAX_QLEN) {
|
||||
struct sk_buff *mskb = skb_peek(&ppp->mrq);
|
||||
if (seq_before(ppp->minseq, mskb->sequence))
|
||||
ppp->minseq = mskb->sequence;
|
||||
if (seq_before(ppp->minseq, PPP_MP_CB(mskb)->sequence))
|
||||
ppp->minseq = PPP_MP_CB(mskb)->sequence;
|
||||
}
|
||||
|
||||
/* Pull completed packets off the queue and receive them. */
|
||||
@@ -1964,12 +1966,12 @@ ppp_mp_insert(struct ppp *ppp, struct sk_buff *skb)
|
||||
{
|
||||
struct sk_buff *p;
|
||||
struct sk_buff_head *list = &ppp->mrq;
|
||||
u32 seq = skb->sequence;
|
||||
u32 seq = PPP_MP_CB(skb)->sequence;
|
||||
|
||||
/* N.B. we don't need to lock the list lock because we have the
|
||||
ppp unit receive-side lock. */
|
||||
skb_queue_walk(list, p) {
|
||||
if (seq_before(seq, p->sequence))
|
||||
if (seq_before(seq, PPP_MP_CB(p)->sequence))
|
||||
break;
|
||||
}
|
||||
__skb_queue_before(list, p, skb);
|
||||
@@ -1998,22 +2000,22 @@ ppp_mp_reconstruct(struct ppp *ppp)
|
||||
tail = NULL;
|
||||
for (p = head; p != (struct sk_buff *) list; p = next) {
|
||||
next = p->next;
|
||||
if (seq_before(p->sequence, seq)) {
|
||||
if (seq_before(PPP_MP_CB(p)->sequence, seq)) {
|
||||
/* this can't happen, anyway ignore the skb */
|
||||
printk(KERN_ERR "ppp_mp_reconstruct bad seq %u < %u\n",
|
||||
p->sequence, seq);
|
||||
PPP_MP_CB(p)->sequence, seq);
|
||||
head = next;
|
||||
continue;
|
||||
}
|
||||
if (p->sequence != seq) {
|
||||
if (PPP_MP_CB(p)->sequence != seq) {
|
||||
/* Fragment `seq' is missing. If it is after
|
||||
minseq, it might arrive later, so stop here. */
|
||||
if (seq_after(seq, minseq))
|
||||
break;
|
||||
/* Fragment `seq' is lost, keep going. */
|
||||
lost = 1;
|
||||
seq = seq_before(minseq, p->sequence)?
|
||||
minseq + 1: p->sequence;
|
||||
seq = seq_before(minseq, PPP_MP_CB(p)->sequence)?
|
||||
minseq + 1: PPP_MP_CB(p)->sequence;
|
||||
next = p;
|
||||
continue;
|
||||
}
|
||||
@@ -2027,7 +2029,7 @@ ppp_mp_reconstruct(struct ppp *ppp)
|
||||
*/
|
||||
|
||||
/* B bit set indicates this fragment starts a packet */
|
||||
if (p->BEbits & B) {
|
||||
if (PPP_MP_CB(p)->BEbits & B) {
|
||||
head = p;
|
||||
lost = 0;
|
||||
len = 0;
|
||||
@@ -2036,7 +2038,8 @@ ppp_mp_reconstruct(struct ppp *ppp)
|
||||
len += p->len;
|
||||
|
||||
/* Got a complete packet yet? */
|
||||
if (lost == 0 && (p->BEbits & E) && (head->BEbits & B)) {
|
||||
if (lost == 0 && (PPP_MP_CB(p)->BEbits & E) &&
|
||||
(PPP_MP_CB(head)->BEbits & B)) {
|
||||
if (len > ppp->mrru + 2) {
|
||||
++ppp->dev->stats.rx_length_errors;
|
||||
printk(KERN_DEBUG "PPP: reconstructed packet"
|
||||
@@ -2062,7 +2065,7 @@ ppp_mp_reconstruct(struct ppp *ppp)
|
||||
* and we haven't found a complete valid packet yet,
|
||||
* we can discard up to and including this fragment.
|
||||
*/
|
||||
if (p->BEbits & E)
|
||||
if (PPP_MP_CB(p)->BEbits & E)
|
||||
head = next;
|
||||
|
||||
++seq;
|
||||
@@ -2072,10 +2075,11 @@ ppp_mp_reconstruct(struct ppp *ppp)
|
||||
if (tail != NULL) {
|
||||
/* If we have discarded any fragments,
|
||||
signal a receive error. */
|
||||
if (head->sequence != ppp->nextseq) {
|
||||
if (PPP_MP_CB(head)->sequence != ppp->nextseq) {
|
||||
if (ppp->debug & 1)
|
||||
printk(KERN_DEBUG " missed pkts %u..%u\n",
|
||||
ppp->nextseq, head->sequence-1);
|
||||
ppp->nextseq,
|
||||
PPP_MP_CB(head)->sequence-1);
|
||||
++ppp->dev->stats.rx_dropped;
|
||||
ppp_receive_error(ppp);
|
||||
}
|
||||
@@ -2084,7 +2088,7 @@ ppp_mp_reconstruct(struct ppp *ppp)
|
||||
/* copy to a single skb */
|
||||
for (p = head; p != tail->next; p = p->next)
|
||||
skb_copy_bits(p, 0, skb_put(skb, p->len), p->len);
|
||||
ppp->nextseq = tail->sequence + 1;
|
||||
ppp->nextseq = PPP_MP_CB(tail)->sequence + 1;
|
||||
head = tail->next;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user