diff options
author | David S. Miller <davem@davemloft.net> | 2013-02-12 18:58:28 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-02-12 18:58:28 -0500 |
commit | 9f6d98c298d48eec29a32ae8ed6f4d896eb4f634 (patch) | |
tree | 24a21ecbd80cd737ce0a4a21591340e6d7f51964 /net | |
parent | db98f081888cbdd995c7c4cfd407781da35e33ba (diff) | |
parent | 9c10f4115cc3722635d6e277385ec96003281784 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Conflicts:
drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
The bnx2x gso_type setting bug fix in 'net' conflicted with
changes in 'net-next' that broke the gso_* setting logic
out into a seperate function, which also fixes the bug in
question. Thus, use the 'net-next' version.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r-- | net/bridge/br_stp_bpdu.c | 2 | ||||
-rw-r--r-- | net/core/datagram.c | 2 | ||||
-rw-r--r-- | net/ipv4/arp.c | 21 | ||||
-rw-r--r-- | net/ipv6/netfilter/ip6t_NPT.c | 18 | ||||
-rw-r--r-- | net/mac80211/cfg.c | 3 | ||||
-rw-r--r-- | net/mac80211/mlme.c | 11 | ||||
-rw-r--r-- | net/netfilter/ipvs/ip_vs_proto_sctp.c | 35 | ||||
-rw-r--r-- | net/netfilter/ipvs/ip_vs_sync.c | 2 | ||||
-rw-r--r-- | net/sched/sch_htb.c | 4 |
9 files changed, 58 insertions, 40 deletions
diff --git a/net/bridge/br_stp_bpdu.c b/net/bridge/br_stp_bpdu.c index 7f884e3fb955..8660ea3be705 100644 --- a/net/bridge/br_stp_bpdu.c +++ b/net/bridge/br_stp_bpdu.c | |||
@@ -16,6 +16,7 @@ | |||
16 | #include <linux/etherdevice.h> | 16 | #include <linux/etherdevice.h> |
17 | #include <linux/llc.h> | 17 | #include <linux/llc.h> |
18 | #include <linux/slab.h> | 18 | #include <linux/slab.h> |
19 | #include <linux/pkt_sched.h> | ||
19 | #include <net/net_namespace.h> | 20 | #include <net/net_namespace.h> |
20 | #include <net/llc.h> | 21 | #include <net/llc.h> |
21 | #include <net/llc_pdu.h> | 22 | #include <net/llc_pdu.h> |
@@ -40,6 +41,7 @@ static void br_send_bpdu(struct net_bridge_port *p, | |||
40 | 41 | ||
41 | skb->dev = p->dev; | 42 | skb->dev = p->dev; |
42 | skb->protocol = htons(ETH_P_802_2); | 43 | skb->protocol = htons(ETH_P_802_2); |
44 | skb->priority = TC_PRIO_CONTROL; | ||
43 | 45 | ||
44 | skb_reserve(skb, LLC_RESERVE); | 46 | skb_reserve(skb, LLC_RESERVE); |
45 | memcpy(__skb_put(skb, length), data, length); | 47 | memcpy(__skb_put(skb, length), data, length); |
diff --git a/net/core/datagram.c b/net/core/datagram.c index 0337e2b76862..368f9c3f9dc6 100644 --- a/net/core/datagram.c +++ b/net/core/datagram.c | |||
@@ -187,7 +187,7 @@ struct sk_buff *__skb_recv_datagram(struct sock *sk, unsigned int flags, | |||
187 | skb_queue_walk(queue, skb) { | 187 | skb_queue_walk(queue, skb) { |
188 | *peeked = skb->peeked; | 188 | *peeked = skb->peeked; |
189 | if (flags & MSG_PEEK) { | 189 | if (flags & MSG_PEEK) { |
190 | if (*off >= skb->len) { | 190 | if (*off >= skb->len && skb->len) { |
191 | *off -= skb->len; | 191 | *off -= skb->len; |
192 | continue; | 192 | continue; |
193 | } | 193 | } |
diff --git a/net/ipv4/arp.c b/net/ipv4/arp.c index 9547a273b9e9..ded146b217f1 100644 --- a/net/ipv4/arp.c +++ b/net/ipv4/arp.c | |||
@@ -928,24 +928,25 @@ static void parp_redo(struct sk_buff *skb) | |||
928 | static int arp_rcv(struct sk_buff *skb, struct net_device *dev, | 928 | static int arp_rcv(struct sk_buff *skb, struct net_device *dev, |
929 | struct packet_type *pt, struct net_device *orig_dev) | 929 | struct packet_type *pt, struct net_device *orig_dev) |
930 | { | 930 | { |
931 | struct arphdr *arp; | 931 | const struct arphdr *arp; |
932 | |||
933 | if (dev->flags & IFF_NOARP || | ||
934 | skb->pkt_type == PACKET_OTHERHOST || | ||
935 | skb->pkt_type == PACKET_LOOPBACK) | ||
936 | goto freeskb; | ||
937 | |||
938 | skb = skb_share_check(skb, GFP_ATOMIC); | ||
939 | if (!skb) | ||
940 | goto out_of_mem; | ||
932 | 941 | ||
933 | /* ARP header, plus 2 device addresses, plus 2 IP addresses. */ | 942 | /* ARP header, plus 2 device addresses, plus 2 IP addresses. */ |
934 | if (!pskb_may_pull(skb, arp_hdr_len(dev))) | 943 | if (!pskb_may_pull(skb, arp_hdr_len(dev))) |
935 | goto freeskb; | 944 | goto freeskb; |
936 | 945 | ||
937 | arp = arp_hdr(skb); | 946 | arp = arp_hdr(skb); |
938 | if (arp->ar_hln != dev->addr_len || | 947 | if (arp->ar_hln != dev->addr_len || arp->ar_pln != 4) |
939 | dev->flags & IFF_NOARP || | ||
940 | skb->pkt_type == PACKET_OTHERHOST || | ||
941 | skb->pkt_type == PACKET_LOOPBACK || | ||
942 | arp->ar_pln != 4) | ||
943 | goto freeskb; | 948 | goto freeskb; |
944 | 949 | ||
945 | skb = skb_share_check(skb, GFP_ATOMIC); | ||
946 | if (skb == NULL) | ||
947 | goto out_of_mem; | ||
948 | |||
949 | memset(NEIGH_CB(skb), 0, sizeof(struct neighbour_cb)); | 950 | memset(NEIGH_CB(skb), 0, sizeof(struct neighbour_cb)); |
950 | 951 | ||
951 | return NF_HOOK(NFPROTO_ARP, NF_ARP_IN, skb, dev, NULL, arp_process); | 952 | return NF_HOOK(NFPROTO_ARP, NF_ARP_IN, skb, dev, NULL, arp_process); |
diff --git a/net/ipv6/netfilter/ip6t_NPT.c b/net/ipv6/netfilter/ip6t_NPT.c index 7302b0b7b642..83acc1405a18 100644 --- a/net/ipv6/netfilter/ip6t_NPT.c +++ b/net/ipv6/netfilter/ip6t_NPT.c | |||
@@ -9,6 +9,7 @@ | |||
9 | #include <linux/module.h> | 9 | #include <linux/module.h> |
10 | #include <linux/skbuff.h> | 10 | #include <linux/skbuff.h> |
11 | #include <linux/ipv6.h> | 11 | #include <linux/ipv6.h> |
12 | #include <net/ipv6.h> | ||
12 | #include <linux/netfilter.h> | 13 | #include <linux/netfilter.h> |
13 | #include <linux/netfilter_ipv6.h> | 14 | #include <linux/netfilter_ipv6.h> |
14 | #include <linux/netfilter_ipv6/ip6t_NPT.h> | 15 | #include <linux/netfilter_ipv6/ip6t_NPT.h> |
@@ -18,11 +19,20 @@ static int ip6t_npt_checkentry(const struct xt_tgchk_param *par) | |||
18 | { | 19 | { |
19 | struct ip6t_npt_tginfo *npt = par->targinfo; | 20 | struct ip6t_npt_tginfo *npt = par->targinfo; |
20 | __wsum src_sum = 0, dst_sum = 0; | 21 | __wsum src_sum = 0, dst_sum = 0; |
22 | struct in6_addr pfx; | ||
21 | unsigned int i; | 23 | unsigned int i; |
22 | 24 | ||
23 | if (npt->src_pfx_len > 64 || npt->dst_pfx_len > 64) | 25 | if (npt->src_pfx_len > 64 || npt->dst_pfx_len > 64) |
24 | return -EINVAL; | 26 | return -EINVAL; |
25 | 27 | ||
28 | /* Ensure that LSB of prefix is zero */ | ||
29 | ipv6_addr_prefix(&pfx, &npt->src_pfx.in6, npt->src_pfx_len); | ||
30 | if (!ipv6_addr_equal(&pfx, &npt->src_pfx.in6)) | ||
31 | return -EINVAL; | ||
32 | ipv6_addr_prefix(&pfx, &npt->dst_pfx.in6, npt->dst_pfx_len); | ||
33 | if (!ipv6_addr_equal(&pfx, &npt->dst_pfx.in6)) | ||
34 | return -EINVAL; | ||
35 | |||
26 | for (i = 0; i < ARRAY_SIZE(npt->src_pfx.in6.s6_addr16); i++) { | 36 | for (i = 0; i < ARRAY_SIZE(npt->src_pfx.in6.s6_addr16); i++) { |
27 | src_sum = csum_add(src_sum, | 37 | src_sum = csum_add(src_sum, |
28 | (__force __wsum)npt->src_pfx.in6.s6_addr16[i]); | 38 | (__force __wsum)npt->src_pfx.in6.s6_addr16[i]); |
@@ -30,7 +40,7 @@ static int ip6t_npt_checkentry(const struct xt_tgchk_param *par) | |||
30 | (__force __wsum)npt->dst_pfx.in6.s6_addr16[i]); | 40 | (__force __wsum)npt->dst_pfx.in6.s6_addr16[i]); |
31 | } | 41 | } |
32 | 42 | ||
33 | npt->adjustment = (__force __sum16) csum_sub(src_sum, dst_sum); | 43 | npt->adjustment = ~csum_fold(csum_sub(src_sum, dst_sum)); |
34 | return 0; | 44 | return 0; |
35 | } | 45 | } |
36 | 46 | ||
@@ -51,7 +61,7 @@ static bool ip6t_npt_map_pfx(const struct ip6t_npt_tginfo *npt, | |||
51 | 61 | ||
52 | idx = i / 32; | 62 | idx = i / 32; |
53 | addr->s6_addr32[idx] &= mask; | 63 | addr->s6_addr32[idx] &= mask; |
54 | addr->s6_addr32[idx] |= npt->dst_pfx.in6.s6_addr32[idx]; | 64 | addr->s6_addr32[idx] |= ~mask & npt->dst_pfx.in6.s6_addr32[idx]; |
55 | } | 65 | } |
56 | 66 | ||
57 | if (pfx_len <= 48) | 67 | if (pfx_len <= 48) |
@@ -66,8 +76,8 @@ static bool ip6t_npt_map_pfx(const struct ip6t_npt_tginfo *npt, | |||
66 | return false; | 76 | return false; |
67 | } | 77 | } |
68 | 78 | ||
69 | sum = (__force __sum16) csum_add((__force __wsum)addr->s6_addr16[idx], | 79 | sum = ~csum_fold(csum_add(csum_unfold((__force __sum16)addr->s6_addr16[idx]), |
70 | npt->adjustment); | 80 | csum_unfold(npt->adjustment))); |
71 | if (sum == CSUM_MANGLED_0) | 81 | if (sum == CSUM_MANGLED_0) |
72 | sum = 0; | 82 | sum = 0; |
73 | *(__force __sum16 *)&addr->s6_addr16[idx] = sum; | 83 | *(__force __sum16 *)&addr->s6_addr16[idx] = sum; |
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c index 661b878bd19c..15d886c639e9 100644 --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c | |||
@@ -2058,7 +2058,8 @@ static int ieee80211_set_mcast_rate(struct wiphy *wiphy, struct net_device *dev, | |||
2058 | { | 2058 | { |
2059 | struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); | 2059 | struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); |
2060 | 2060 | ||
2061 | memcpy(sdata->vif.bss_conf.mcast_rate, rate, sizeof(rate)); | 2061 | memcpy(sdata->vif.bss_conf.mcast_rate, rate, |
2062 | sizeof(int) * IEEE80211_NUM_BANDS); | ||
2062 | 2063 | ||
2063 | return 0; | 2064 | return 0; |
2064 | } | 2065 | } |
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index 5913fb924b12..72924399077e 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c | |||
@@ -3422,6 +3422,7 @@ ieee80211_determine_chantype(struct ieee80211_sub_if_data *sdata, | |||
3422 | 3422 | ||
3423 | ret = 0; | 3423 | ret = 0; |
3424 | 3424 | ||
3425 | out: | ||
3425 | while (!cfg80211_chandef_usable(sdata->local->hw.wiphy, chandef, | 3426 | while (!cfg80211_chandef_usable(sdata->local->hw.wiphy, chandef, |
3426 | IEEE80211_CHAN_DISABLED)) { | 3427 | IEEE80211_CHAN_DISABLED)) { |
3427 | if (WARN_ON(chandef->width == NL80211_CHAN_WIDTH_20_NOHT)) { | 3428 | if (WARN_ON(chandef->width == NL80211_CHAN_WIDTH_20_NOHT)) { |
@@ -3430,14 +3431,13 @@ ieee80211_determine_chantype(struct ieee80211_sub_if_data *sdata, | |||
3430 | goto out; | 3431 | goto out; |
3431 | } | 3432 | } |
3432 | 3433 | ||
3433 | ret = chandef_downgrade(chandef); | 3434 | ret |= chandef_downgrade(chandef); |
3434 | } | 3435 | } |
3435 | 3436 | ||
3436 | if (chandef->width != vht_chandef.width) | 3437 | if (chandef->width != vht_chandef.width) |
3437 | sdata_info(sdata, | 3438 | sdata_info(sdata, |
3438 | "local regulatory prevented using AP HT/VHT configuration, downgraded\n"); | 3439 | "capabilities/regulatory prevented using AP HT/VHT configuration, downgraded\n"); |
3439 | 3440 | ||
3440 | out: | ||
3441 | WARN_ON_ONCE(!cfg80211_chandef_valid(chandef)); | 3441 | WARN_ON_ONCE(!cfg80211_chandef_valid(chandef)); |
3442 | return ret; | 3442 | return ret; |
3443 | } | 3443 | } |
@@ -3551,8 +3551,11 @@ static int ieee80211_prep_channel(struct ieee80211_sub_if_data *sdata, | |||
3551 | */ | 3551 | */ |
3552 | ret = ieee80211_vif_use_channel(sdata, &chandef, | 3552 | ret = ieee80211_vif_use_channel(sdata, &chandef, |
3553 | IEEE80211_CHANCTX_SHARED); | 3553 | IEEE80211_CHANCTX_SHARED); |
3554 | while (ret && chandef.width != NL80211_CHAN_WIDTH_20_NOHT) | 3554 | while (ret && chandef.width != NL80211_CHAN_WIDTH_20_NOHT) { |
3555 | ifmgd->flags |= chandef_downgrade(&chandef); | 3555 | ifmgd->flags |= chandef_downgrade(&chandef); |
3556 | ret = ieee80211_vif_use_channel(sdata, &chandef, | ||
3557 | IEEE80211_CHANCTX_SHARED); | ||
3558 | } | ||
3556 | return ret; | 3559 | return ret; |
3557 | } | 3560 | } |
3558 | 3561 | ||
diff --git a/net/netfilter/ipvs/ip_vs_proto_sctp.c b/net/netfilter/ipvs/ip_vs_proto_sctp.c index 746048b13ef3..ae8ec6f27688 100644 --- a/net/netfilter/ipvs/ip_vs_proto_sctp.c +++ b/net/netfilter/ipvs/ip_vs_proto_sctp.c | |||
@@ -61,14 +61,27 @@ sctp_conn_schedule(int af, struct sk_buff *skb, struct ip_vs_proto_data *pd, | |||
61 | return 1; | 61 | return 1; |
62 | } | 62 | } |
63 | 63 | ||
64 | static void sctp_nat_csum(struct sk_buff *skb, sctp_sctphdr_t *sctph, | ||
65 | unsigned int sctphoff) | ||
66 | { | ||
67 | __u32 crc32; | ||
68 | struct sk_buff *iter; | ||
69 | |||
70 | crc32 = sctp_start_cksum((__u8 *)sctph, skb_headlen(skb) - sctphoff); | ||
71 | skb_walk_frags(skb, iter) | ||
72 | crc32 = sctp_update_cksum((u8 *) iter->data, | ||
73 | skb_headlen(iter), crc32); | ||
74 | sctph->checksum = sctp_end_cksum(crc32); | ||
75 | |||
76 | skb->ip_summed = CHECKSUM_UNNECESSARY; | ||
77 | } | ||
78 | |||
64 | static int | 79 | static int |
65 | sctp_snat_handler(struct sk_buff *skb, struct ip_vs_protocol *pp, | 80 | sctp_snat_handler(struct sk_buff *skb, struct ip_vs_protocol *pp, |
66 | struct ip_vs_conn *cp, struct ip_vs_iphdr *iph) | 81 | struct ip_vs_conn *cp, struct ip_vs_iphdr *iph) |
67 | { | 82 | { |
68 | sctp_sctphdr_t *sctph; | 83 | sctp_sctphdr_t *sctph; |
69 | unsigned int sctphoff = iph->len; | 84 | unsigned int sctphoff = iph->len; |
70 | struct sk_buff *iter; | ||
71 | __be32 crc32; | ||
72 | 85 | ||
73 | #ifdef CONFIG_IP_VS_IPV6 | 86 | #ifdef CONFIG_IP_VS_IPV6 |
74 | if (cp->af == AF_INET6 && iph->fragoffs) | 87 | if (cp->af == AF_INET6 && iph->fragoffs) |
@@ -92,13 +105,7 @@ sctp_snat_handler(struct sk_buff *skb, struct ip_vs_protocol *pp, | |||
92 | sctph = (void *) skb_network_header(skb) + sctphoff; | 105 | sctph = (void *) skb_network_header(skb) + sctphoff; |
93 | sctph->source = cp->vport; | 106 | sctph->source = cp->vport; |
94 | 107 | ||
95 | /* Calculate the checksum */ | 108 | sctp_nat_csum(skb, sctph, sctphoff); |
96 | crc32 = sctp_start_cksum((u8 *) sctph, skb_headlen(skb) - sctphoff); | ||
97 | skb_walk_frags(skb, iter) | ||
98 | crc32 = sctp_update_cksum((u8 *) iter->data, skb_headlen(iter), | ||
99 | crc32); | ||
100 | crc32 = sctp_end_cksum(crc32); | ||
101 | sctph->checksum = crc32; | ||
102 | 109 | ||
103 | return 1; | 110 | return 1; |
104 | } | 111 | } |
@@ -109,8 +116,6 @@ sctp_dnat_handler(struct sk_buff *skb, struct ip_vs_protocol *pp, | |||
109 | { | 116 | { |
110 | sctp_sctphdr_t *sctph; | 117 | sctp_sctphdr_t *sctph; |
111 | unsigned int sctphoff = iph->len; | 118 | unsigned int sctphoff = iph->len; |
112 | struct sk_buff *iter; | ||
113 | __be32 crc32; | ||
114 | 119 | ||
115 | #ifdef CONFIG_IP_VS_IPV6 | 120 | #ifdef CONFIG_IP_VS_IPV6 |
116 | if (cp->af == AF_INET6 && iph->fragoffs) | 121 | if (cp->af == AF_INET6 && iph->fragoffs) |
@@ -134,13 +139,7 @@ sctp_dnat_handler(struct sk_buff *skb, struct ip_vs_protocol *pp, | |||
134 | sctph = (void *) skb_network_header(skb) + sctphoff; | 139 | sctph = (void *) skb_network_header(skb) + sctphoff; |
135 | sctph->dest = cp->dport; | 140 | sctph->dest = cp->dport; |
136 | 141 | ||
137 | /* Calculate the checksum */ | 142 | sctp_nat_csum(skb, sctph, sctphoff); |
138 | crc32 = sctp_start_cksum((u8 *) sctph, skb_headlen(skb) - sctphoff); | ||
139 | skb_walk_frags(skb, iter) | ||
140 | crc32 = sctp_update_cksum((u8 *) iter->data, skb_headlen(iter), | ||
141 | crc32); | ||
142 | crc32 = sctp_end_cksum(crc32); | ||
143 | sctph->checksum = crc32; | ||
144 | 143 | ||
145 | return 1; | 144 | return 1; |
146 | } | 145 | } |
diff --git a/net/netfilter/ipvs/ip_vs_sync.c b/net/netfilter/ipvs/ip_vs_sync.c index effa10c9e4e3..44fd10c539ac 100644 --- a/net/netfilter/ipvs/ip_vs_sync.c +++ b/net/netfilter/ipvs/ip_vs_sync.c | |||
@@ -1795,6 +1795,8 @@ int start_sync_thread(struct net *net, int state, char *mcast_ifn, __u8 syncid) | |||
1795 | GFP_KERNEL); | 1795 | GFP_KERNEL); |
1796 | if (!tinfo->buf) | 1796 | if (!tinfo->buf) |
1797 | goto outtinfo; | 1797 | goto outtinfo; |
1798 | } else { | ||
1799 | tinfo->buf = NULL; | ||
1798 | } | 1800 | } |
1799 | tinfo->id = id; | 1801 | tinfo->id = id; |
1800 | 1802 | ||
diff --git a/net/sched/sch_htb.c b/net/sched/sch_htb.c index 51561eafcb72..79e8ed4ac7ce 100644 --- a/net/sched/sch_htb.c +++ b/net/sched/sch_htb.c | |||
@@ -1135,9 +1135,9 @@ static int htb_dump_class(struct Qdisc *sch, unsigned long arg, | |||
1135 | memset(&opt, 0, sizeof(opt)); | 1135 | memset(&opt, 0, sizeof(opt)); |
1136 | 1136 | ||
1137 | opt.rate.rate = cl->rate.rate_bps >> 3; | 1137 | opt.rate.rate = cl->rate.rate_bps >> 3; |
1138 | opt.buffer = cl->buffer; | 1138 | opt.buffer = PSCHED_NS2TICKS(cl->buffer); |
1139 | opt.ceil.rate = cl->ceil.rate_bps >> 3; | 1139 | opt.ceil.rate = cl->ceil.rate_bps >> 3; |
1140 | opt.cbuffer = cl->cbuffer; | 1140 | opt.cbuffer = PSCHED_NS2TICKS(cl->cbuffer); |
1141 | opt.quantum = cl->quantum; | 1141 | opt.quantum = cl->quantum; |
1142 | opt.prio = cl->prio; | 1142 | opt.prio = cl->prio; |
1143 | opt.level = cl->level; | 1143 | opt.level = cl->level; |