diff options
author | David S. Miller <davem@davemloft.net> | 2008-06-16 21:25:48 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-06-16 21:25:48 -0400 |
commit | caea902f72b053fd0c76d0d3b6b2e057beb3fc64 (patch) | |
tree | 74e8d476b2c51480420e2ef7c9bbae249b6edbc9 /net | |
parent | 0b4419162aa6c4204843f3a13b48d9ab821d3167 (diff) | |
parent | 65c3e4715b1b934f8dcc002d9f46b4371ca7a9b1 (diff) |
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
Conflicts:
drivers/net/wireless/rt2x00/Kconfig
drivers/net/wireless/rt2x00/rt2x00usb.c
net/sctp/protocol.c
Diffstat (limited to 'net')
-rw-r--r-- | net/atm/br2684.c | 78 | ||||
-rw-r--r-- | net/core/dev.c | 34 | ||||
-rw-r--r-- | net/ipv4/inet_connection_sock.c | 6 | ||||
-rw-r--r-- | net/ipv4/raw.c | 2 | ||||
-rw-r--r-- | net/ipv4/tcp_ipv4.c | 4 | ||||
-rw-r--r-- | net/ipv6/sit.c | 44 | ||||
-rw-r--r-- | net/mac80211/wext.c | 3 | ||||
-rw-r--r-- | net/mac80211/wme.c | 2 | ||||
-rw-r--r-- | net/sched/sch_htb.c | 23 | ||||
-rw-r--r-- | net/sctp/associola.c | 13 | ||||
-rw-r--r-- | net/sctp/protocol.c | 19 |
11 files changed, 143 insertions, 85 deletions
diff --git a/net/atm/br2684.c b/net/atm/br2684.c index 9d52ebfc1962..05fafdc2eea3 100644 --- a/net/atm/br2684.c +++ b/net/atm/br2684.c | |||
@@ -188,10 +188,13 @@ static int br2684_xmit_vcc(struct sk_buff *skb, struct br2684_dev *brdev, | |||
188 | return 0; | 188 | return 0; |
189 | } | 189 | } |
190 | } | 190 | } |
191 | } else { | 191 | } else { /* e_vc */ |
192 | skb_push(skb, 2); | 192 | if (brdev->payload == p_bridged) { |
193 | if (brdev->payload == p_bridged) | 193 | skb_push(skb, 2); |
194 | memset(skb->data, 0, 2); | 194 | memset(skb->data, 0, 2); |
195 | } else { /* p_routed */ | ||
196 | skb_pull(skb, ETH_HLEN); | ||
197 | } | ||
195 | } | 198 | } |
196 | skb_debug(skb); | 199 | skb_debug(skb); |
197 | 200 | ||
@@ -377,11 +380,8 @@ static void br2684_push(struct atm_vcc *atmvcc, struct sk_buff *skb) | |||
377 | (skb->data + 6, ethertype_ipv4, | 380 | (skb->data + 6, ethertype_ipv4, |
378 | sizeof(ethertype_ipv4)) == 0) | 381 | sizeof(ethertype_ipv4)) == 0) |
379 | skb->protocol = __constant_htons(ETH_P_IP); | 382 | skb->protocol = __constant_htons(ETH_P_IP); |
380 | else { | 383 | else |
381 | brdev->stats.rx_errors++; | 384 | goto error; |
382 | dev_kfree_skb(skb); | ||
383 | return; | ||
384 | } | ||
385 | skb_pull(skb, sizeof(llc_oui_ipv4)); | 385 | skb_pull(skb, sizeof(llc_oui_ipv4)); |
386 | skb_reset_network_header(skb); | 386 | skb_reset_network_header(skb); |
387 | skb->pkt_type = PACKET_HOST; | 387 | skb->pkt_type = PACKET_HOST; |
@@ -394,44 +394,56 @@ static void br2684_push(struct atm_vcc *atmvcc, struct sk_buff *skb) | |||
394 | (memcmp(skb->data, llc_oui_pid_pad, 7) == 0)) { | 394 | (memcmp(skb->data, llc_oui_pid_pad, 7) == 0)) { |
395 | skb_pull(skb, sizeof(llc_oui_pid_pad)); | 395 | skb_pull(skb, sizeof(llc_oui_pid_pad)); |
396 | skb->protocol = eth_type_trans(skb, net_dev); | 396 | skb->protocol = eth_type_trans(skb, net_dev); |
397 | } else { | 397 | } else |
398 | brdev->stats.rx_errors++; | 398 | goto error; |
399 | dev_kfree_skb(skb); | ||
400 | return; | ||
401 | } | ||
402 | 399 | ||
403 | } else { | 400 | } else { /* e_vc */ |
404 | /* first 2 chars should be 0 */ | 401 | if (brdev->payload == p_routed) { |
405 | if (*((u16 *) (skb->data)) != 0) { | 402 | struct iphdr *iph; |
406 | brdev->stats.rx_errors++; | 403 | |
407 | dev_kfree_skb(skb); | 404 | skb_reset_network_header(skb); |
408 | return; | 405 | iph = ip_hdr(skb); |
406 | if (iph->version == 4) | ||
407 | skb->protocol = __constant_htons(ETH_P_IP); | ||
408 | else if (iph->version == 6) | ||
409 | skb->protocol = __constant_htons(ETH_P_IPV6); | ||
410 | else | ||
411 | goto error; | ||
412 | skb->pkt_type = PACKET_HOST; | ||
413 | } else { /* p_bridged */ | ||
414 | /* first 2 chars should be 0 */ | ||
415 | if (*((u16 *) (skb->data)) != 0) | ||
416 | goto error; | ||
417 | skb_pull(skb, BR2684_PAD_LEN); | ||
418 | skb->protocol = eth_type_trans(skb, net_dev); | ||
409 | } | 419 | } |
410 | skb_pull(skb, BR2684_PAD_LEN + ETH_HLEN); /* pad, dstmac, srcmac, ethtype */ | ||
411 | skb->protocol = eth_type_trans(skb, net_dev); | ||
412 | } | 420 | } |
413 | 421 | ||
414 | #ifdef CONFIG_ATM_BR2684_IPFILTER | 422 | #ifdef CONFIG_ATM_BR2684_IPFILTER |
415 | if (unlikely(packet_fails_filter(skb->protocol, brvcc, skb))) { | 423 | if (unlikely(packet_fails_filter(skb->protocol, brvcc, skb))) |
416 | brdev->stats.rx_dropped++; | 424 | goto dropped; |
417 | dev_kfree_skb(skb); | ||
418 | return; | ||
419 | } | ||
420 | #endif /* CONFIG_ATM_BR2684_IPFILTER */ | 425 | #endif /* CONFIG_ATM_BR2684_IPFILTER */ |
421 | skb->dev = net_dev; | 426 | skb->dev = net_dev; |
422 | ATM_SKB(skb)->vcc = atmvcc; /* needed ? */ | 427 | ATM_SKB(skb)->vcc = atmvcc; /* needed ? */ |
423 | pr_debug("received packet's protocol: %x\n", ntohs(skb->protocol)); | 428 | pr_debug("received packet's protocol: %x\n", ntohs(skb->protocol)); |
424 | skb_debug(skb); | 429 | skb_debug(skb); |
425 | if (unlikely(!(net_dev->flags & IFF_UP))) { | 430 | /* sigh, interface is down? */ |
426 | /* sigh, interface is down */ | 431 | if (unlikely(!(net_dev->flags & IFF_UP))) |
427 | brdev->stats.rx_dropped++; | 432 | goto dropped; |
428 | dev_kfree_skb(skb); | ||
429 | return; | ||
430 | } | ||
431 | brdev->stats.rx_packets++; | 433 | brdev->stats.rx_packets++; |
432 | brdev->stats.rx_bytes += skb->len; | 434 | brdev->stats.rx_bytes += skb->len; |
433 | memset(ATM_SKB(skb), 0, sizeof(struct atm_skb_data)); | 435 | memset(ATM_SKB(skb), 0, sizeof(struct atm_skb_data)); |
434 | netif_rx(skb); | 436 | netif_rx(skb); |
437 | return; | ||
438 | |||
439 | dropped: | ||
440 | brdev->stats.rx_dropped++; | ||
441 | goto free_skb; | ||
442 | error: | ||
443 | brdev->stats.rx_errors++; | ||
444 | free_skb: | ||
445 | dev_kfree_skb(skb); | ||
446 | return; | ||
435 | } | 447 | } |
436 | 448 | ||
437 | /* | 449 | /* |
@@ -518,9 +530,9 @@ static int br2684_regvcc(struct atm_vcc *atmvcc, void __user * arg) | |||
518 | struct sk_buff *next = skb->next; | 530 | struct sk_buff *next = skb->next; |
519 | 531 | ||
520 | skb->next = skb->prev = NULL; | 532 | skb->next = skb->prev = NULL; |
533 | br2684_push(atmvcc, skb); | ||
521 | BRPRIV(skb->dev)->stats.rx_bytes -= skb->len; | 534 | BRPRIV(skb->dev)->stats.rx_bytes -= skb->len; |
522 | BRPRIV(skb->dev)->stats.rx_packets--; | 535 | BRPRIV(skb->dev)->stats.rx_packets--; |
523 | br2684_push(atmvcc, skb); | ||
524 | 536 | ||
525 | skb = next; | 537 | skb = next; |
526 | } | 538 | } |
diff --git a/net/core/dev.c b/net/core/dev.c index 582963077877..68d8df0992ab 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -119,6 +119,7 @@ | |||
119 | #include <linux/err.h> | 119 | #include <linux/err.h> |
120 | #include <linux/ctype.h> | 120 | #include <linux/ctype.h> |
121 | #include <linux/if_arp.h> | 121 | #include <linux/if_arp.h> |
122 | #include <linux/if_vlan.h> | ||
122 | 123 | ||
123 | #include "net-sysfs.h" | 124 | #include "net-sysfs.h" |
124 | 125 | ||
@@ -1362,6 +1363,29 @@ void netif_device_attach(struct net_device *dev) | |||
1362 | } | 1363 | } |
1363 | EXPORT_SYMBOL(netif_device_attach); | 1364 | EXPORT_SYMBOL(netif_device_attach); |
1364 | 1365 | ||
1366 | static bool can_checksum_protocol(unsigned long features, __be16 protocol) | ||
1367 | { | ||
1368 | return ((features & NETIF_F_GEN_CSUM) || | ||
1369 | ((features & NETIF_F_IP_CSUM) && | ||
1370 | protocol == htons(ETH_P_IP)) || | ||
1371 | ((features & NETIF_F_IPV6_CSUM) && | ||
1372 | protocol == htons(ETH_P_IPV6))); | ||
1373 | } | ||
1374 | |||
1375 | static bool dev_can_checksum(struct net_device *dev, struct sk_buff *skb) | ||
1376 | { | ||
1377 | if (can_checksum_protocol(dev->features, skb->protocol)) | ||
1378 | return true; | ||
1379 | |||
1380 | if (skb->protocol == htons(ETH_P_8021Q)) { | ||
1381 | struct vlan_ethhdr *veh = (struct vlan_ethhdr *)skb->data; | ||
1382 | if (can_checksum_protocol(dev->features & dev->vlan_features, | ||
1383 | veh->h_vlan_encapsulated_proto)) | ||
1384 | return true; | ||
1385 | } | ||
1386 | |||
1387 | return false; | ||
1388 | } | ||
1365 | 1389 | ||
1366 | /* | 1390 | /* |
1367 | * Invalidate hardware checksum when packet is to be mangled, and | 1391 | * Invalidate hardware checksum when packet is to be mangled, and |
@@ -1640,14 +1664,8 @@ int dev_queue_xmit(struct sk_buff *skb) | |||
1640 | if (skb->ip_summed == CHECKSUM_PARTIAL) { | 1664 | if (skb->ip_summed == CHECKSUM_PARTIAL) { |
1641 | skb_set_transport_header(skb, skb->csum_start - | 1665 | skb_set_transport_header(skb, skb->csum_start - |
1642 | skb_headroom(skb)); | 1666 | skb_headroom(skb)); |
1643 | 1667 | if (!dev_can_checksum(dev, skb) && skb_checksum_help(skb)) | |
1644 | if (!(dev->features & NETIF_F_GEN_CSUM) && | 1668 | goto out_kfree_skb; |
1645 | !((dev->features & NETIF_F_IP_CSUM) && | ||
1646 | skb->protocol == htons(ETH_P_IP)) && | ||
1647 | !((dev->features & NETIF_F_IPV6_CSUM) && | ||
1648 | skb->protocol == htons(ETH_P_IPV6))) | ||
1649 | if (skb_checksum_help(skb)) | ||
1650 | goto out_kfree_skb; | ||
1651 | } | 1669 | } |
1652 | 1670 | ||
1653 | gso: | 1671 | gso: |
diff --git a/net/ipv4/inet_connection_sock.c b/net/ipv4/inet_connection_sock.c index 4c804b3c287b..5bbf00051512 100644 --- a/net/ipv4/inet_connection_sock.c +++ b/net/ipv4/inet_connection_sock.c | |||
@@ -468,9 +468,9 @@ void inet_csk_reqsk_queue_prune(struct sock *parent, | |||
468 | reqp=&lopt->syn_table[i]; | 468 | reqp=&lopt->syn_table[i]; |
469 | while ((req = *reqp) != NULL) { | 469 | while ((req = *reqp) != NULL) { |
470 | if (time_after_eq(now, req->expires)) { | 470 | if (time_after_eq(now, req->expires)) { |
471 | if ((req->retrans < (inet_rsk(req)->acked ? max_retries : thresh)) && | 471 | if ((req->retrans < thresh || |
472 | (inet_rsk(req)->acked || | 472 | (inet_rsk(req)->acked && req->retrans < max_retries)) |
473 | !req->rsk_ops->rtx_syn_ack(parent, req))) { | 473 | && !req->rsk_ops->rtx_syn_ack(parent, req)) { |
474 | unsigned long timeo; | 474 | unsigned long timeo; |
475 | 475 | ||
476 | if (req->retrans++ == 0) | 476 | if (req->retrans++ == 0) |
diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c index 36035a0c6dc2..7d449468409e 100644 --- a/net/ipv4/raw.c +++ b/net/ipv4/raw.c | |||
@@ -931,7 +931,7 @@ static void raw_sock_seq_show(struct seq_file *seq, struct sock *sp, int i) | |||
931 | srcp = inet->num; | 931 | srcp = inet->num; |
932 | 932 | ||
933 | seq_printf(seq, "%4d: %08X:%04X %08X:%04X" | 933 | seq_printf(seq, "%4d: %08X:%04X %08X:%04X" |
934 | " %02X %08X:%08X %02X:%08lX %08X %5d %8d %lu %d %p %d", | 934 | " %02X %08X:%08X %02X:%08lX %08X %5d %8d %lu %d %p %d\n", |
935 | i, src, srcp, dest, destp, sp->sk_state, | 935 | i, src, srcp, dest, destp, sp->sk_state, |
936 | atomic_read(&sp->sk_wmem_alloc), | 936 | atomic_read(&sp->sk_wmem_alloc), |
937 | atomic_read(&sp->sk_rmem_alloc), | 937 | atomic_read(&sp->sk_rmem_alloc), |
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 64b385f65930..0db9b75c1fa2 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c | |||
@@ -83,10 +83,6 @@ | |||
83 | int sysctl_tcp_tw_reuse __read_mostly; | 83 | int sysctl_tcp_tw_reuse __read_mostly; |
84 | int sysctl_tcp_low_latency __read_mostly; | 84 | int sysctl_tcp_low_latency __read_mostly; |
85 | 85 | ||
86 | /* Check TCP sequence numbers in ICMP packets. */ | ||
87 | #define ICMP_MIN_LENGTH 8 | ||
88 | |||
89 | void tcp_v4_send_check(struct sock *sk, int len, struct sk_buff *skb); | ||
90 | 86 | ||
91 | #ifdef CONFIG_TCP_MD5SIG | 87 | #ifdef CONFIG_TCP_MD5SIG |
92 | static struct tcp_md5sig_key *tcp_v4_md5_do_lookup(struct sock *sk, | 88 | static struct tcp_md5sig_key *tcp_v4_md5_do_lookup(struct sock *sk, |
diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c index b0c5080420a8..b7a50e968506 100644 --- a/net/ipv6/sit.c +++ b/net/ipv6/sit.c | |||
@@ -220,15 +220,18 @@ __ipip6_tunnel_locate_prl(struct ip_tunnel *t, __be32 addr) | |||
220 | 220 | ||
221 | } | 221 | } |
222 | 222 | ||
223 | static int ipip6_tunnel_get_prl(struct ip_tunnel *t, struct ip_tunnel_prl *a) | 223 | static int ipip6_tunnel_get_prl(struct ip_tunnel *t, |
224 | struct ip_tunnel_prl __user *a) | ||
224 | { | 225 | { |
225 | struct ip_tunnel_prl *kp; | 226 | struct ip_tunnel_prl kprl, *kp; |
226 | struct ip_tunnel_prl_entry *prl; | 227 | struct ip_tunnel_prl_entry *prl; |
227 | unsigned int cmax, c = 0, ca, len; | 228 | unsigned int cmax, c = 0, ca, len; |
228 | int ret = 0; | 229 | int ret = 0; |
229 | 230 | ||
230 | cmax = a->datalen / sizeof(*a); | 231 | if (copy_from_user(&kprl, a, sizeof(kprl))) |
231 | if (cmax > 1 && a->addr != htonl(INADDR_ANY)) | 232 | return -EFAULT; |
233 | cmax = kprl.datalen / sizeof(kprl); | ||
234 | if (cmax > 1 && kprl.addr != htonl(INADDR_ANY)) | ||
232 | cmax = 1; | 235 | cmax = 1; |
233 | 236 | ||
234 | /* For simple GET or for root users, | 237 | /* For simple GET or for root users, |
@@ -259,26 +262,25 @@ static int ipip6_tunnel_get_prl(struct ip_tunnel *t, struct ip_tunnel_prl *a) | |||
259 | for (prl = t->prl; prl; prl = prl->next) { | 262 | for (prl = t->prl; prl; prl = prl->next) { |
260 | if (c > cmax) | 263 | if (c > cmax) |
261 | break; | 264 | break; |
262 | if (a->addr != htonl(INADDR_ANY) && prl->addr != a->addr) | 265 | if (kprl.addr != htonl(INADDR_ANY) && prl->addr != kprl.addr) |
263 | continue; | 266 | continue; |
264 | kp[c].addr = prl->addr; | 267 | kp[c].addr = prl->addr; |
265 | kp[c].flags = prl->flags; | 268 | kp[c].flags = prl->flags; |
266 | c++; | 269 | c++; |
267 | if (a->addr != htonl(INADDR_ANY)) | 270 | if (kprl.addr != htonl(INADDR_ANY)) |
268 | break; | 271 | break; |
269 | } | 272 | } |
270 | out: | 273 | out: |
271 | read_unlock(&ipip6_lock); | 274 | read_unlock(&ipip6_lock); |
272 | 275 | ||
273 | len = sizeof(*kp) * c; | 276 | len = sizeof(*kp) * c; |
274 | ret = len ? copy_to_user(a->data, kp, len) : 0; | 277 | ret = 0; |
278 | if ((len && copy_to_user(a + 1, kp, len)) || put_user(len, &a->datalen)) | ||
279 | ret = -EFAULT; | ||
275 | 280 | ||
276 | kfree(kp); | 281 | kfree(kp); |
277 | if (ret) | ||
278 | return -EFAULT; | ||
279 | 282 | ||
280 | a->datalen = len; | 283 | return ret; |
281 | return 0; | ||
282 | } | 284 | } |
283 | 285 | ||
284 | static int | 286 | static int |
@@ -871,11 +873,20 @@ ipip6_tunnel_ioctl (struct net_device *dev, struct ifreq *ifr, int cmd) | |||
871 | break; | 873 | break; |
872 | 874 | ||
873 | case SIOCGETPRL: | 875 | case SIOCGETPRL: |
876 | err = -EINVAL; | ||
877 | if (dev == sitn->fb_tunnel_dev) | ||
878 | goto done; | ||
879 | err = -ENOENT; | ||
880 | if (!(t = netdev_priv(dev))) | ||
881 | goto done; | ||
882 | err = ipip6_tunnel_get_prl(t, ifr->ifr_ifru.ifru_data); | ||
883 | break; | ||
884 | |||
874 | case SIOCADDPRL: | 885 | case SIOCADDPRL: |
875 | case SIOCDELPRL: | 886 | case SIOCDELPRL: |
876 | case SIOCCHGPRL: | 887 | case SIOCCHGPRL: |
877 | err = -EPERM; | 888 | err = -EPERM; |
878 | if (cmd != SIOCGETPRL && !capable(CAP_NET_ADMIN)) | 889 | if (!capable(CAP_NET_ADMIN)) |
879 | goto done; | 890 | goto done; |
880 | err = -EINVAL; | 891 | err = -EINVAL; |
881 | if (dev == sitn->fb_tunnel_dev) | 892 | if (dev == sitn->fb_tunnel_dev) |
@@ -888,12 +899,6 @@ ipip6_tunnel_ioctl (struct net_device *dev, struct ifreq *ifr, int cmd) | |||
888 | goto done; | 899 | goto done; |
889 | 900 | ||
890 | switch (cmd) { | 901 | switch (cmd) { |
891 | case SIOCGETPRL: | ||
892 | err = ipip6_tunnel_get_prl(t, &prl); | ||
893 | if (!err && copy_to_user(ifr->ifr_ifru.ifru_data, | ||
894 | &prl, sizeof(prl))) | ||
895 | err = -EFAULT; | ||
896 | break; | ||
897 | case SIOCDELPRL: | 902 | case SIOCDELPRL: |
898 | err = ipip6_tunnel_del_prl(t, &prl); | 903 | err = ipip6_tunnel_del_prl(t, &prl); |
899 | break; | 904 | break; |
@@ -902,8 +907,7 @@ ipip6_tunnel_ioctl (struct net_device *dev, struct ifreq *ifr, int cmd) | |||
902 | err = ipip6_tunnel_add_prl(t, &prl, cmd == SIOCCHGPRL); | 907 | err = ipip6_tunnel_add_prl(t, &prl, cmd == SIOCCHGPRL); |
903 | break; | 908 | break; |
904 | } | 909 | } |
905 | if (cmd != SIOCGETPRL) | 910 | netdev_state_change(dev); |
906 | netdev_state_change(dev); | ||
907 | break; | 911 | break; |
908 | 912 | ||
909 | default: | 913 | default: |
diff --git a/net/mac80211/wext.c b/net/mac80211/wext.c index 4806d96b9877..5af3862e7191 100644 --- a/net/mac80211/wext.c +++ b/net/mac80211/wext.c | |||
@@ -508,7 +508,8 @@ static int ieee80211_ioctl_giwap(struct net_device *dev, | |||
508 | sdata = IEEE80211_DEV_TO_SUB_IF(dev); | 508 | sdata = IEEE80211_DEV_TO_SUB_IF(dev); |
509 | if (sdata->vif.type == IEEE80211_IF_TYPE_STA || | 509 | if (sdata->vif.type == IEEE80211_IF_TYPE_STA || |
510 | sdata->vif.type == IEEE80211_IF_TYPE_IBSS) { | 510 | sdata->vif.type == IEEE80211_IF_TYPE_IBSS) { |
511 | if (sdata->u.sta.state == IEEE80211_ASSOCIATED) { | 511 | if (sdata->u.sta.state == IEEE80211_ASSOCIATED || |
512 | sdata->u.sta.state == IEEE80211_IBSS_JOINED) { | ||
512 | ap_addr->sa_family = ARPHRD_ETHER; | 513 | ap_addr->sa_family = ARPHRD_ETHER; |
513 | memcpy(&ap_addr->sa_data, sdata->u.sta.bssid, ETH_ALEN); | 514 | memcpy(&ap_addr->sa_data, sdata->u.sta.bssid, ETH_ALEN); |
514 | return 0; | 515 | return 0; |
diff --git a/net/mac80211/wme.c b/net/mac80211/wme.c index d8c2f9688b25..cfa8fbb0736a 100644 --- a/net/mac80211/wme.c +++ b/net/mac80211/wme.c | |||
@@ -637,7 +637,7 @@ int ieee80211_ht_agg_queue_add(struct ieee80211_local *local, | |||
637 | #ifdef CONFIG_MAC80211_HT_DEBUG | 637 | #ifdef CONFIG_MAC80211_HT_DEBUG |
638 | if (net_ratelimit()) | 638 | if (net_ratelimit()) |
639 | printk(KERN_DEBUG "allocated aggregation queue" | 639 | printk(KERN_DEBUG "allocated aggregation queue" |
640 | " %d tid %d addr %s pool=0x%lX", | 640 | " %d tid %d addr %s pool=0x%lX\n", |
641 | i, tid, print_mac(mac, sta->addr), | 641 | i, tid, print_mac(mac, sta->addr), |
642 | q->qdisc_pool[0]); | 642 | q->qdisc_pool[0]); |
643 | #endif /* CONFIG_MAC80211_HT_DEBUG */ | 643 | #endif /* CONFIG_MAC80211_HT_DEBUG */ |
diff --git a/net/sched/sch_htb.c b/net/sched/sch_htb.c index 213071859030..2cef8f34b2cb 100644 --- a/net/sched/sch_htb.c +++ b/net/sched/sch_htb.c | |||
@@ -26,6 +26,7 @@ | |||
26 | * and many others. thanks. | 26 | * and many others. thanks. |
27 | */ | 27 | */ |
28 | #include <linux/module.h> | 28 | #include <linux/module.h> |
29 | #include <linux/moduleparam.h> | ||
29 | #include <linux/types.h> | 30 | #include <linux/types.h> |
30 | #include <linux/kernel.h> | 31 | #include <linux/kernel.h> |
31 | #include <linux/string.h> | 32 | #include <linux/string.h> |
@@ -51,13 +52,17 @@ | |||
51 | */ | 52 | */ |
52 | 53 | ||
53 | #define HTB_HSIZE 16 /* classid hash size */ | 54 | #define HTB_HSIZE 16 /* classid hash size */ |
54 | #define HTB_HYSTERESIS 1 /* whether to use mode hysteresis for speedup */ | 55 | static int htb_hysteresis __read_mostly = 0; /* whether to use mode hysteresis for speedup */ |
55 | #define HTB_VER 0x30011 /* major must be matched with number suplied by TC as version */ | 56 | #define HTB_VER 0x30011 /* major must be matched with number suplied by TC as version */ |
56 | 57 | ||
57 | #if HTB_VER >> 16 != TC_HTB_PROTOVER | 58 | #if HTB_VER >> 16 != TC_HTB_PROTOVER |
58 | #error "Mismatched sch_htb.c and pkt_sch.h" | 59 | #error "Mismatched sch_htb.c and pkt_sch.h" |
59 | #endif | 60 | #endif |
60 | 61 | ||
62 | /* Module parameter and sysfs export */ | ||
63 | module_param (htb_hysteresis, int, 0640); | ||
64 | MODULE_PARM_DESC(htb_hysteresis, "Hysteresis mode, less CPU load, less accurate"); | ||
65 | |||
61 | /* used internaly to keep status of single class */ | 66 | /* used internaly to keep status of single class */ |
62 | enum htb_cmode { | 67 | enum htb_cmode { |
63 | HTB_CANT_SEND, /* class can't send and can't borrow */ | 68 | HTB_CANT_SEND, /* class can't send and can't borrow */ |
@@ -460,19 +465,21 @@ static void htb_deactivate_prios(struct htb_sched *q, struct htb_class *cl) | |||
460 | htb_remove_class_from_row(q, cl, mask); | 465 | htb_remove_class_from_row(q, cl, mask); |
461 | } | 466 | } |
462 | 467 | ||
463 | #if HTB_HYSTERESIS | ||
464 | static inline long htb_lowater(const struct htb_class *cl) | 468 | static inline long htb_lowater(const struct htb_class *cl) |
465 | { | 469 | { |
466 | return cl->cmode != HTB_CANT_SEND ? -cl->cbuffer : 0; | 470 | if (htb_hysteresis) |
471 | return cl->cmode != HTB_CANT_SEND ? -cl->cbuffer : 0; | ||
472 | else | ||
473 | return 0; | ||
467 | } | 474 | } |
468 | static inline long htb_hiwater(const struct htb_class *cl) | 475 | static inline long htb_hiwater(const struct htb_class *cl) |
469 | { | 476 | { |
470 | return cl->cmode == HTB_CAN_SEND ? -cl->buffer : 0; | 477 | if (htb_hysteresis) |
478 | return cl->cmode == HTB_CAN_SEND ? -cl->buffer : 0; | ||
479 | else | ||
480 | return 0; | ||
471 | } | 481 | } |
472 | #else | 482 | |
473 | #define htb_lowater(cl) (0) | ||
474 | #define htb_hiwater(cl) (0) | ||
475 | #endif | ||
476 | 483 | ||
477 | /** | 484 | /** |
478 | * htb_class_mode - computes and returns current class mode | 485 | * htb_class_mode - computes and returns current class mode |
diff --git a/net/sctp/associola.c b/net/sctp/associola.c index d5cc731b6798..35b6a023a6d0 100644 --- a/net/sctp/associola.c +++ b/net/sctp/associola.c | |||
@@ -476,6 +476,15 @@ static void sctp_association_destroy(struct sctp_association *asoc) | |||
476 | void sctp_assoc_set_primary(struct sctp_association *asoc, | 476 | void sctp_assoc_set_primary(struct sctp_association *asoc, |
477 | struct sctp_transport *transport) | 477 | struct sctp_transport *transport) |
478 | { | 478 | { |
479 | int changeover = 0; | ||
480 | |||
481 | /* it's a changeover only if we already have a primary path | ||
482 | * that we are changing | ||
483 | */ | ||
484 | if (asoc->peer.primary_path != NULL && | ||
485 | asoc->peer.primary_path != transport) | ||
486 | changeover = 1 ; | ||
487 | |||
479 | asoc->peer.primary_path = transport; | 488 | asoc->peer.primary_path = transport; |
480 | 489 | ||
481 | /* Set a default msg_name for events. */ | 490 | /* Set a default msg_name for events. */ |
@@ -501,12 +510,12 @@ void sctp_assoc_set_primary(struct sctp_association *asoc, | |||
501 | * double switch to the same destination address. | 510 | * double switch to the same destination address. |
502 | */ | 511 | */ |
503 | if (transport->cacc.changeover_active) | 512 | if (transport->cacc.changeover_active) |
504 | transport->cacc.cycling_changeover = 1; | 513 | transport->cacc.cycling_changeover = changeover; |
505 | 514 | ||
506 | /* 2) The sender MUST set CHANGEOVER_ACTIVE to indicate that | 515 | /* 2) The sender MUST set CHANGEOVER_ACTIVE to indicate that |
507 | * a changeover has occurred. | 516 | * a changeover has occurred. |
508 | */ | 517 | */ |
509 | transport->cacc.changeover_active = 1; | 518 | transport->cacc.changeover_active = changeover; |
510 | 519 | ||
511 | /* 3) The sender MUST store the next TSN to be sent in | 520 | /* 3) The sender MUST store the next TSN to be sent in |
512 | * next_tsn_at_change. | 521 | * next_tsn_at_change. |
diff --git a/net/sctp/protocol.c b/net/sctp/protocol.c index d6af466091d2..23aaffb97ca3 100644 --- a/net/sctp/protocol.c +++ b/net/sctp/protocol.c | |||
@@ -108,16 +108,27 @@ static __init int sctp_proc_init(void) | |||
108 | } | 108 | } |
109 | 109 | ||
110 | if (sctp_snmp_proc_init()) | 110 | if (sctp_snmp_proc_init()) |
111 | goto out_nomem; | 111 | goto out_snmp_proc_init; |
112 | if (sctp_eps_proc_init()) | 112 | if (sctp_eps_proc_init()) |
113 | goto out_nomem; | 113 | goto out_eps_proc_init; |
114 | if (sctp_assocs_proc_init()) | 114 | if (sctp_assocs_proc_init()) |
115 | goto out_nomem; | 115 | goto out_assocs_proc_init; |
116 | if (sctp_remaddr_proc_init()) | 116 | if (sctp_remaddr_proc_init()) |
117 | goto out_nomem; | 117 | goto out_remaddr_proc_init; |
118 | 118 | ||
119 | return 0; | 119 | return 0; |
120 | 120 | ||
121 | out_remaddr_proc_init: | ||
122 | sctp_remaddr_proc_exit(); | ||
123 | out_assocs_proc_init: | ||
124 | sctp_eps_proc_exit(); | ||
125 | out_eps_proc_init: | ||
126 | sctp_snmp_proc_exit(); | ||
127 | out_snmp_proc_init: | ||
128 | if (proc_net_sctp) { | ||
129 | proc_net_sctp = NULL; | ||
130 | remove_proc_entry("sctp", init_net.proc_net); | ||
131 | } | ||
121 | out_nomem: | 132 | out_nomem: |
122 | return -ENOMEM; | 133 | return -ENOMEM; |
123 | } | 134 | } |