diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-10-31 18:22:44 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-10-31 18:22:44 -0400 |
commit | 1a4ceab195e66bce9c1638fdded6d92988100ba4 (patch) | |
tree | 3ec17bd66fb3ac1429131e373cc8d99550d5451a /net | |
parent | 83f89ca755c9f783b8229d968c4e9d2c660ca427 (diff) | |
parent | 6a32e4f9dd9219261f8856f817e6655114cfec2f (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net: (27 commits)
vlan: allow nested vlan_do_receive()
ipv6: fix route lookup in addrconf_prefix_rcv()
bonding: eliminate bond_close race conditions
qlcnic: fix beacon and LED test.
qlcnic: Updated License file
qlcnic: updated reset sequence
qlcnic: reset loopback mode if promiscous mode setting fails.
qlcnic: skip IDC ack check in fw reset path.
i825xx: Fix incorrect dependency for BVME6000_NET
ipv6: fix route error binding peer in func icmp6_dst_alloc
ipv6: fix error propagation in ip6_ufo_append_data()
stmmac: update normal descriptor structure (v2)
stmmac: fix NULL pointer dereference in capabilities fixup (v2)
stmmac: fix a bug while checking the HW cap reg (v2)
be2net: Changing MAC Address of a VF was broken.
be2net: Refactored be_cmds.c file.
bnx2x: update driver version to 1.70.30-0
bnx2x: use FW 7.0.29.0
bnx2x: Enable changing speed when port type is PORT_DA
bnx2x: Fix 54618se LED behavior
...
Diffstat (limited to 'net')
-rw-r--r-- | net/8021q/vlan_core.c | 7 | ||||
-rw-r--r-- | net/batman-adv/translation-table.c | 17 | ||||
-rw-r--r-- | net/batman-adv/types.h | 4 | ||||
-rw-r--r-- | net/core/dev.c | 4 | ||||
-rw-r--r-- | net/dccp/ipv6.c | 4 | ||||
-rw-r--r-- | net/ipv4/tcp_minisocks.c | 1 | ||||
-rw-r--r-- | net/ipv6/addrconf.c | 43 | ||||
-rw-r--r-- | net/ipv6/inet6_connection_sock.c | 2 | ||||
-rw-r--r-- | net/ipv6/ip6_output.c | 9 | ||||
-rw-r--r-- | net/ipv6/route.c | 3 | ||||
-rw-r--r-- | net/ipv6/tcp_ipv6.c | 17 | ||||
-rw-r--r-- | net/sctp/ipv6.c | 2 |
12 files changed, 83 insertions, 30 deletions
diff --git a/net/8021q/vlan_core.c b/net/8021q/vlan_core.c index f1f2f7bb6661..163397f1fd5a 100644 --- a/net/8021q/vlan_core.c +++ b/net/8021q/vlan_core.c | |||
@@ -4,7 +4,7 @@ | |||
4 | #include <linux/netpoll.h> | 4 | #include <linux/netpoll.h> |
5 | #include "vlan.h" | 5 | #include "vlan.h" |
6 | 6 | ||
7 | bool vlan_do_receive(struct sk_buff **skbp) | 7 | bool vlan_do_receive(struct sk_buff **skbp, bool last_handler) |
8 | { | 8 | { |
9 | struct sk_buff *skb = *skbp; | 9 | struct sk_buff *skb = *skbp; |
10 | u16 vlan_id = skb->vlan_tci & VLAN_VID_MASK; | 10 | u16 vlan_id = skb->vlan_tci & VLAN_VID_MASK; |
@@ -13,7 +13,10 @@ bool vlan_do_receive(struct sk_buff **skbp) | |||
13 | 13 | ||
14 | vlan_dev = vlan_find_dev(skb->dev, vlan_id); | 14 | vlan_dev = vlan_find_dev(skb->dev, vlan_id); |
15 | if (!vlan_dev) { | 15 | if (!vlan_dev) { |
16 | if (vlan_id) | 16 | /* Only the last call to vlan_do_receive() should change |
17 | * pkt_type to PACKET_OTHERHOST | ||
18 | */ | ||
19 | if (vlan_id && last_handler) | ||
17 | skb->pkt_type = PACKET_OTHERHOST; | 20 | skb->pkt_type = PACKET_OTHERHOST; |
18 | return false; | 21 | return false; |
19 | } | 22 | } |
diff --git a/net/batman-adv/translation-table.c b/net/batman-adv/translation-table.c index 873fb3d8e56f..c7aafc7c5ed4 100644 --- a/net/batman-adv/translation-table.c +++ b/net/batman-adv/translation-table.c | |||
@@ -137,10 +137,22 @@ static void tt_local_entry_free_ref(struct tt_local_entry *tt_local_entry) | |||
137 | kfree_rcu(tt_local_entry, rcu); | 137 | kfree_rcu(tt_local_entry, rcu); |
138 | } | 138 | } |
139 | 139 | ||
140 | static void tt_global_entry_free_rcu(struct rcu_head *rcu) | ||
141 | { | ||
142 | struct tt_global_entry *tt_global_entry; | ||
143 | |||
144 | tt_global_entry = container_of(rcu, struct tt_global_entry, rcu); | ||
145 | |||
146 | if (tt_global_entry->orig_node) | ||
147 | orig_node_free_ref(tt_global_entry->orig_node); | ||
148 | |||
149 | kfree(tt_global_entry); | ||
150 | } | ||
151 | |||
140 | static void tt_global_entry_free_ref(struct tt_global_entry *tt_global_entry) | 152 | static void tt_global_entry_free_ref(struct tt_global_entry *tt_global_entry) |
141 | { | 153 | { |
142 | if (atomic_dec_and_test(&tt_global_entry->refcount)) | 154 | if (atomic_dec_and_test(&tt_global_entry->refcount)) |
143 | kfree_rcu(tt_global_entry, rcu); | 155 | call_rcu(&tt_global_entry->rcu, tt_global_entry_free_rcu); |
144 | } | 156 | } |
145 | 157 | ||
146 | static void tt_local_event(struct bat_priv *bat_priv, const uint8_t *addr, | 158 | static void tt_local_event(struct bat_priv *bat_priv, const uint8_t *addr, |
@@ -710,6 +722,9 @@ void tt_global_del_orig(struct bat_priv *bat_priv, | |||
710 | struct hlist_head *head; | 722 | struct hlist_head *head; |
711 | spinlock_t *list_lock; /* protects write access to the hash lists */ | 723 | spinlock_t *list_lock; /* protects write access to the hash lists */ |
712 | 724 | ||
725 | if (!hash) | ||
726 | return; | ||
727 | |||
713 | for (i = 0; i < hash->size; i++) { | 728 | for (i = 0; i < hash->size; i++) { |
714 | head = &hash->table[i]; | 729 | head = &hash->table[i]; |
715 | list_lock = &hash->list_locks[i]; | 730 | list_lock = &hash->list_locks[i]; |
diff --git a/net/batman-adv/types.h b/net/batman-adv/types.h index 1ae355750511..ab8d0fe6df5a 100644 --- a/net/batman-adv/types.h +++ b/net/batman-adv/types.h | |||
@@ -224,22 +224,22 @@ struct socket_packet { | |||
224 | 224 | ||
225 | struct tt_local_entry { | 225 | struct tt_local_entry { |
226 | uint8_t addr[ETH_ALEN]; | 226 | uint8_t addr[ETH_ALEN]; |
227 | struct hlist_node hash_entry; | ||
227 | unsigned long last_seen; | 228 | unsigned long last_seen; |
228 | uint16_t flags; | 229 | uint16_t flags; |
229 | atomic_t refcount; | 230 | atomic_t refcount; |
230 | struct rcu_head rcu; | 231 | struct rcu_head rcu; |
231 | struct hlist_node hash_entry; | ||
232 | }; | 232 | }; |
233 | 233 | ||
234 | struct tt_global_entry { | 234 | struct tt_global_entry { |
235 | uint8_t addr[ETH_ALEN]; | 235 | uint8_t addr[ETH_ALEN]; |
236 | struct hlist_node hash_entry; /* entry in the global table */ | ||
236 | struct orig_node *orig_node; | 237 | struct orig_node *orig_node; |
237 | uint8_t ttvn; | 238 | uint8_t ttvn; |
238 | uint16_t flags; /* only TT_GLOBAL_ROAM is used */ | 239 | uint16_t flags; /* only TT_GLOBAL_ROAM is used */ |
239 | unsigned long roam_at; /* time at which TT_GLOBAL_ROAM was set */ | 240 | unsigned long roam_at; /* time at which TT_GLOBAL_ROAM was set */ |
240 | atomic_t refcount; | 241 | atomic_t refcount; |
241 | struct rcu_head rcu; | 242 | struct rcu_head rcu; |
242 | struct hlist_node hash_entry; /* entry in the global table */ | ||
243 | }; | 243 | }; |
244 | 244 | ||
245 | struct tt_change_node { | 245 | struct tt_change_node { |
diff --git a/net/core/dev.c b/net/core/dev.c index edcf019c056d..6ba50a1e404c 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -3283,18 +3283,18 @@ another_round: | |||
3283 | ncls: | 3283 | ncls: |
3284 | #endif | 3284 | #endif |
3285 | 3285 | ||
3286 | rx_handler = rcu_dereference(skb->dev->rx_handler); | ||
3286 | if (vlan_tx_tag_present(skb)) { | 3287 | if (vlan_tx_tag_present(skb)) { |
3287 | if (pt_prev) { | 3288 | if (pt_prev) { |
3288 | ret = deliver_skb(skb, pt_prev, orig_dev); | 3289 | ret = deliver_skb(skb, pt_prev, orig_dev); |
3289 | pt_prev = NULL; | 3290 | pt_prev = NULL; |
3290 | } | 3291 | } |
3291 | if (vlan_do_receive(&skb)) | 3292 | if (vlan_do_receive(&skb, !rx_handler)) |
3292 | goto another_round; | 3293 | goto another_round; |
3293 | else if (unlikely(!skb)) | 3294 | else if (unlikely(!skb)) |
3294 | goto out; | 3295 | goto out; |
3295 | } | 3296 | } |
3296 | 3297 | ||
3297 | rx_handler = rcu_dereference(skb->dev->rx_handler); | ||
3298 | if (rx_handler) { | 3298 | if (rx_handler) { |
3299 | if (pt_prev) { | 3299 | if (pt_prev) { |
3300 | ret = deliver_skb(skb, pt_prev, orig_dev); | 3300 | ret = deliver_skb(skb, pt_prev, orig_dev); |
diff --git a/net/dccp/ipv6.c b/net/dccp/ipv6.c index b74f76117dcf..17ee85ce148d 100644 --- a/net/dccp/ipv6.c +++ b/net/dccp/ipv6.c | |||
@@ -271,7 +271,7 @@ static int dccp_v6_send_response(struct sock *sk, struct request_sock *req, | |||
271 | &ireq6->loc_addr, | 271 | &ireq6->loc_addr, |
272 | &ireq6->rmt_addr); | 272 | &ireq6->rmt_addr); |
273 | ipv6_addr_copy(&fl6.daddr, &ireq6->rmt_addr); | 273 | ipv6_addr_copy(&fl6.daddr, &ireq6->rmt_addr); |
274 | err = ip6_xmit(sk, skb, &fl6, opt); | 274 | err = ip6_xmit(sk, skb, &fl6, opt, np->tclass); |
275 | err = net_xmit_eval(err); | 275 | err = net_xmit_eval(err); |
276 | } | 276 | } |
277 | 277 | ||
@@ -326,7 +326,7 @@ static void dccp_v6_ctl_send_reset(struct sock *sk, struct sk_buff *rxskb) | |||
326 | dst = ip6_dst_lookup_flow(ctl_sk, &fl6, NULL, false); | 326 | dst = ip6_dst_lookup_flow(ctl_sk, &fl6, NULL, false); |
327 | if (!IS_ERR(dst)) { | 327 | if (!IS_ERR(dst)) { |
328 | skb_dst_set(skb, dst); | 328 | skb_dst_set(skb, dst); |
329 | ip6_xmit(ctl_sk, skb, &fl6, NULL); | 329 | ip6_xmit(ctl_sk, skb, &fl6, NULL, 0); |
330 | DCCP_INC_STATS_BH(DCCP_MIB_OUTSEGS); | 330 | DCCP_INC_STATS_BH(DCCP_MIB_OUTSEGS); |
331 | DCCP_INC_STATS_BH(DCCP_MIB_OUTRSTS); | 331 | DCCP_INC_STATS_BH(DCCP_MIB_OUTRSTS); |
332 | return; | 332 | return; |
diff --git a/net/ipv4/tcp_minisocks.c b/net/ipv4/tcp_minisocks.c index 85a2fbebd7ef..66363b689ad6 100644 --- a/net/ipv4/tcp_minisocks.c +++ b/net/ipv4/tcp_minisocks.c | |||
@@ -345,6 +345,7 @@ void tcp_time_wait(struct sock *sk, int state, int timeo) | |||
345 | tw6 = inet6_twsk((struct sock *)tw); | 345 | tw6 = inet6_twsk((struct sock *)tw); |
346 | ipv6_addr_copy(&tw6->tw_v6_daddr, &np->daddr); | 346 | ipv6_addr_copy(&tw6->tw_v6_daddr, &np->daddr); |
347 | ipv6_addr_copy(&tw6->tw_v6_rcv_saddr, &np->rcv_saddr); | 347 | ipv6_addr_copy(&tw6->tw_v6_rcv_saddr, &np->rcv_saddr); |
348 | tw->tw_tclass = np->tclass; | ||
348 | tw->tw_ipv6only = np->ipv6only; | 349 | tw->tw_ipv6only = np->ipv6only; |
349 | } | 350 | } |
350 | #endif | 351 | #endif |
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index e39239e6426e..d0611a5de45f 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
@@ -1713,6 +1713,40 @@ addrconf_prefix_route(struct in6_addr *pfx, int plen, struct net_device *dev, | |||
1713 | ip6_route_add(&cfg); | 1713 | ip6_route_add(&cfg); |
1714 | } | 1714 | } |
1715 | 1715 | ||
1716 | |||
1717 | static struct rt6_info *addrconf_get_prefix_route(const struct in6_addr *pfx, | ||
1718 | int plen, | ||
1719 | const struct net_device *dev, | ||
1720 | u32 flags, u32 noflags) | ||
1721 | { | ||
1722 | struct fib6_node *fn; | ||
1723 | struct rt6_info *rt = NULL; | ||
1724 | struct fib6_table *table; | ||
1725 | |||
1726 | table = fib6_get_table(dev_net(dev), RT6_TABLE_PREFIX); | ||
1727 | if (table == NULL) | ||
1728 | return NULL; | ||
1729 | |||
1730 | write_lock_bh(&table->tb6_lock); | ||
1731 | fn = fib6_locate(&table->tb6_root, pfx, plen, NULL, 0); | ||
1732 | if (!fn) | ||
1733 | goto out; | ||
1734 | for (rt = fn->leaf; rt; rt = rt->dst.rt6_next) { | ||
1735 | if (rt->rt6i_dev->ifindex != dev->ifindex) | ||
1736 | continue; | ||
1737 | if ((rt->rt6i_flags & flags) != flags) | ||
1738 | continue; | ||
1739 | if ((noflags != 0) && ((rt->rt6i_flags & flags) != 0)) | ||
1740 | continue; | ||
1741 | dst_hold(&rt->dst); | ||
1742 | break; | ||
1743 | } | ||
1744 | out: | ||
1745 | write_unlock_bh(&table->tb6_lock); | ||
1746 | return rt; | ||
1747 | } | ||
1748 | |||
1749 | |||
1716 | /* Create "default" multicast route to the interface */ | 1750 | /* Create "default" multicast route to the interface */ |
1717 | 1751 | ||
1718 | static void addrconf_add_mroute(struct net_device *dev) | 1752 | static void addrconf_add_mroute(struct net_device *dev) |
@@ -1842,10 +1876,13 @@ void addrconf_prefix_rcv(struct net_device *dev, u8 *opt, int len) | |||
1842 | if (addrconf_finite_timeout(rt_expires)) | 1876 | if (addrconf_finite_timeout(rt_expires)) |
1843 | rt_expires *= HZ; | 1877 | rt_expires *= HZ; |
1844 | 1878 | ||
1845 | rt = rt6_lookup(net, &pinfo->prefix, NULL, | 1879 | rt = addrconf_get_prefix_route(&pinfo->prefix, |
1846 | dev->ifindex, 1); | 1880 | pinfo->prefix_len, |
1881 | dev, | ||
1882 | RTF_ADDRCONF | RTF_PREFIX_RT, | ||
1883 | RTF_GATEWAY | RTF_DEFAULT); | ||
1847 | 1884 | ||
1848 | if (rt && addrconf_is_prefix_route(rt)) { | 1885 | if (rt) { |
1849 | /* Autoconf prefix route */ | 1886 | /* Autoconf prefix route */ |
1850 | if (valid_lft == 0) { | 1887 | if (valid_lft == 0) { |
1851 | ip6_del_rt(rt); | 1888 | ip6_del_rt(rt); |
diff --git a/net/ipv6/inet6_connection_sock.c b/net/ipv6/inet6_connection_sock.c index 2916200f90c1..fee46d5a2f12 100644 --- a/net/ipv6/inet6_connection_sock.c +++ b/net/ipv6/inet6_connection_sock.c | |||
@@ -248,7 +248,7 @@ int inet6_csk_xmit(struct sk_buff *skb, struct flowi *fl_unused) | |||
248 | /* Restore final destination back after routing done */ | 248 | /* Restore final destination back after routing done */ |
249 | ipv6_addr_copy(&fl6.daddr, &np->daddr); | 249 | ipv6_addr_copy(&fl6.daddr, &np->daddr); |
250 | 250 | ||
251 | res = ip6_xmit(sk, skb, &fl6, np->opt); | 251 | res = ip6_xmit(sk, skb, &fl6, np->opt, np->tclass); |
252 | rcu_read_unlock(); | 252 | rcu_read_unlock(); |
253 | return res; | 253 | return res; |
254 | } | 254 | } |
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index 1c9bf8b5c30a..84d0bd5cac93 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c | |||
@@ -180,7 +180,7 @@ int ip6_output(struct sk_buff *skb) | |||
180 | */ | 180 | */ |
181 | 181 | ||
182 | int ip6_xmit(struct sock *sk, struct sk_buff *skb, struct flowi6 *fl6, | 182 | int ip6_xmit(struct sock *sk, struct sk_buff *skb, struct flowi6 *fl6, |
183 | struct ipv6_txoptions *opt) | 183 | struct ipv6_txoptions *opt, int tclass) |
184 | { | 184 | { |
185 | struct net *net = sock_net(sk); | 185 | struct net *net = sock_net(sk); |
186 | struct ipv6_pinfo *np = inet6_sk(sk); | 186 | struct ipv6_pinfo *np = inet6_sk(sk); |
@@ -190,7 +190,6 @@ int ip6_xmit(struct sock *sk, struct sk_buff *skb, struct flowi6 *fl6, | |||
190 | u8 proto = fl6->flowi6_proto; | 190 | u8 proto = fl6->flowi6_proto; |
191 | int seg_len = skb->len; | 191 | int seg_len = skb->len; |
192 | int hlimit = -1; | 192 | int hlimit = -1; |
193 | int tclass = 0; | ||
194 | u32 mtu; | 193 | u32 mtu; |
195 | 194 | ||
196 | if (opt) { | 195 | if (opt) { |
@@ -228,10 +227,8 @@ int ip6_xmit(struct sock *sk, struct sk_buff *skb, struct flowi6 *fl6, | |||
228 | /* | 227 | /* |
229 | * Fill in the IPv6 header | 228 | * Fill in the IPv6 header |
230 | */ | 229 | */ |
231 | if (np) { | 230 | if (np) |
232 | tclass = np->tclass; | ||
233 | hlimit = np->hop_limit; | 231 | hlimit = np->hop_limit; |
234 | } | ||
235 | if (hlimit < 0) | 232 | if (hlimit < 0) |
236 | hlimit = ip6_dst_hoplimit(dst); | 233 | hlimit = ip6_dst_hoplimit(dst); |
237 | 234 | ||
@@ -1126,7 +1123,7 @@ static inline int ip6_ufo_append_data(struct sock *sk, | |||
1126 | hh_len + fragheaderlen + transhdrlen + 20, | 1123 | hh_len + fragheaderlen + transhdrlen + 20, |
1127 | (flags & MSG_DONTWAIT), &err); | 1124 | (flags & MSG_DONTWAIT), &err); |
1128 | if (skb == NULL) | 1125 | if (skb == NULL) |
1129 | return -ENOMEM; | 1126 | return err; |
1130 | 1127 | ||
1131 | /* reserve space for Hardware header */ | 1128 | /* reserve space for Hardware header */ |
1132 | skb_reserve(skb, hh_len); | 1129 | skb_reserve(skb, hh_len); |
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index fb545edef6ea..57b82dc1ae91 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
@@ -1086,11 +1086,10 @@ struct dst_entry *icmp6_dst_alloc(struct net_device *dev, | |||
1086 | rt->dst.output = ip6_output; | 1086 | rt->dst.output = ip6_output; |
1087 | dst_set_neighbour(&rt->dst, neigh); | 1087 | dst_set_neighbour(&rt->dst, neigh); |
1088 | atomic_set(&rt->dst.__refcnt, 1); | 1088 | atomic_set(&rt->dst.__refcnt, 1); |
1089 | dst_metric_set(&rt->dst, RTAX_HOPLIMIT, 255); | ||
1090 | |||
1091 | ipv6_addr_copy(&rt->rt6i_dst.addr, addr); | 1089 | ipv6_addr_copy(&rt->rt6i_dst.addr, addr); |
1092 | rt->rt6i_dst.plen = 128; | 1090 | rt->rt6i_dst.plen = 128; |
1093 | rt->rt6i_idev = idev; | 1091 | rt->rt6i_idev = idev; |
1092 | dst_metric_set(&rt->dst, RTAX_HOPLIMIT, 255); | ||
1094 | 1093 | ||
1095 | spin_lock_bh(&icmp6_dst_lock); | 1094 | spin_lock_bh(&icmp6_dst_lock); |
1096 | rt->dst.next = icmp6_dst_gc_list; | 1095 | rt->dst.next = icmp6_dst_gc_list; |
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index c8683fcc487a..10b2b3165a1a 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c | |||
@@ -513,7 +513,7 @@ static int tcp_v6_send_synack(struct sock *sk, struct request_sock *req, | |||
513 | __tcp_v6_send_check(skb, &treq->loc_addr, &treq->rmt_addr); | 513 | __tcp_v6_send_check(skb, &treq->loc_addr, &treq->rmt_addr); |
514 | 514 | ||
515 | ipv6_addr_copy(&fl6.daddr, &treq->rmt_addr); | 515 | ipv6_addr_copy(&fl6.daddr, &treq->rmt_addr); |
516 | err = ip6_xmit(sk, skb, &fl6, opt); | 516 | err = ip6_xmit(sk, skb, &fl6, opt, np->tclass); |
517 | err = net_xmit_eval(err); | 517 | err = net_xmit_eval(err); |
518 | } | 518 | } |
519 | 519 | ||
@@ -979,7 +979,7 @@ static int tcp6_gro_complete(struct sk_buff *skb) | |||
979 | } | 979 | } |
980 | 980 | ||
981 | static void tcp_v6_send_response(struct sk_buff *skb, u32 seq, u32 ack, u32 win, | 981 | static void tcp_v6_send_response(struct sk_buff *skb, u32 seq, u32 ack, u32 win, |
982 | u32 ts, struct tcp_md5sig_key *key, int rst) | 982 | u32 ts, struct tcp_md5sig_key *key, int rst, u8 tclass) |
983 | { | 983 | { |
984 | const struct tcphdr *th = tcp_hdr(skb); | 984 | const struct tcphdr *th = tcp_hdr(skb); |
985 | struct tcphdr *t1; | 985 | struct tcphdr *t1; |
@@ -1060,7 +1060,7 @@ static void tcp_v6_send_response(struct sk_buff *skb, u32 seq, u32 ack, u32 win, | |||
1060 | dst = ip6_dst_lookup_flow(ctl_sk, &fl6, NULL, false); | 1060 | dst = ip6_dst_lookup_flow(ctl_sk, &fl6, NULL, false); |
1061 | if (!IS_ERR(dst)) { | 1061 | if (!IS_ERR(dst)) { |
1062 | skb_dst_set(buff, dst); | 1062 | skb_dst_set(buff, dst); |
1063 | ip6_xmit(ctl_sk, buff, &fl6, NULL); | 1063 | ip6_xmit(ctl_sk, buff, &fl6, NULL, tclass); |
1064 | TCP_INC_STATS_BH(net, TCP_MIB_OUTSEGS); | 1064 | TCP_INC_STATS_BH(net, TCP_MIB_OUTSEGS); |
1065 | if (rst) | 1065 | if (rst) |
1066 | TCP_INC_STATS_BH(net, TCP_MIB_OUTRSTS); | 1066 | TCP_INC_STATS_BH(net, TCP_MIB_OUTRSTS); |
@@ -1093,13 +1093,13 @@ static void tcp_v6_send_reset(struct sock *sk, struct sk_buff *skb) | |||
1093 | ack_seq = ntohl(th->seq) + th->syn + th->fin + skb->len - | 1093 | ack_seq = ntohl(th->seq) + th->syn + th->fin + skb->len - |
1094 | (th->doff << 2); | 1094 | (th->doff << 2); |
1095 | 1095 | ||
1096 | tcp_v6_send_response(skb, seq, ack_seq, 0, 0, key, 1); | 1096 | tcp_v6_send_response(skb, seq, ack_seq, 0, 0, key, 1, 0); |
1097 | } | 1097 | } |
1098 | 1098 | ||
1099 | static void tcp_v6_send_ack(struct sk_buff *skb, u32 seq, u32 ack, u32 win, u32 ts, | 1099 | static void tcp_v6_send_ack(struct sk_buff *skb, u32 seq, u32 ack, u32 win, u32 ts, |
1100 | struct tcp_md5sig_key *key) | 1100 | struct tcp_md5sig_key *key, u8 tclass) |
1101 | { | 1101 | { |
1102 | tcp_v6_send_response(skb, seq, ack, win, ts, key, 0); | 1102 | tcp_v6_send_response(skb, seq, ack, win, ts, key, 0, tclass); |
1103 | } | 1103 | } |
1104 | 1104 | ||
1105 | static void tcp_v6_timewait_ack(struct sock *sk, struct sk_buff *skb) | 1105 | static void tcp_v6_timewait_ack(struct sock *sk, struct sk_buff *skb) |
@@ -1109,7 +1109,8 @@ static void tcp_v6_timewait_ack(struct sock *sk, struct sk_buff *skb) | |||
1109 | 1109 | ||
1110 | tcp_v6_send_ack(skb, tcptw->tw_snd_nxt, tcptw->tw_rcv_nxt, | 1110 | tcp_v6_send_ack(skb, tcptw->tw_snd_nxt, tcptw->tw_rcv_nxt, |
1111 | tcptw->tw_rcv_wnd >> tw->tw_rcv_wscale, | 1111 | tcptw->tw_rcv_wnd >> tw->tw_rcv_wscale, |
1112 | tcptw->tw_ts_recent, tcp_twsk_md5_key(tcptw)); | 1112 | tcptw->tw_ts_recent, tcp_twsk_md5_key(tcptw), |
1113 | tw->tw_tclass); | ||
1113 | 1114 | ||
1114 | inet_twsk_put(tw); | 1115 | inet_twsk_put(tw); |
1115 | } | 1116 | } |
@@ -1118,7 +1119,7 @@ static void tcp_v6_reqsk_send_ack(struct sock *sk, struct sk_buff *skb, | |||
1118 | struct request_sock *req) | 1119 | struct request_sock *req) |
1119 | { | 1120 | { |
1120 | tcp_v6_send_ack(skb, tcp_rsk(req)->snt_isn + 1, tcp_rsk(req)->rcv_isn + 1, req->rcv_wnd, req->ts_recent, | 1121 | tcp_v6_send_ack(skb, tcp_rsk(req)->snt_isn + 1, tcp_rsk(req)->rcv_isn + 1, req->rcv_wnd, req->ts_recent, |
1121 | tcp_v6_md5_do_lookup(sk, &ipv6_hdr(skb)->daddr)); | 1122 | tcp_v6_md5_do_lookup(sk, &ipv6_hdr(skb)->daddr), 0); |
1122 | } | 1123 | } |
1123 | 1124 | ||
1124 | 1125 | ||
diff --git a/net/sctp/ipv6.c b/net/sctp/ipv6.c index aabaee41dd3e..810427833bcd 100644 --- a/net/sctp/ipv6.c +++ b/net/sctp/ipv6.c | |||
@@ -243,7 +243,7 @@ static int sctp_v6_xmit(struct sk_buff *skb, struct sctp_transport *transport) | |||
243 | if (!(transport->param_flags & SPP_PMTUD_ENABLE)) | 243 | if (!(transport->param_flags & SPP_PMTUD_ENABLE)) |
244 | skb->local_df = 1; | 244 | skb->local_df = 1; |
245 | 245 | ||
246 | return ip6_xmit(sk, skb, &fl6, np->opt); | 246 | return ip6_xmit(sk, skb, &fl6, np->opt, np->tclass); |
247 | } | 247 | } |
248 | 248 | ||
249 | /* Returns the dst cache entry for the given source and destination ip | 249 | /* Returns the dst cache entry for the given source and destination ip |