diff options
author | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2008-01-09 11:05:12 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2008-01-09 11:05:12 -0500 |
commit | fd0b45dfd1858c6b49d06355a460bcf36d654c06 (patch) | |
tree | 85386a76355b398b7f452b737af4ab48f116677a /net | |
parent | fcfd50afb6e94c8cf121ca4e7e3e7166bae7c6aa (diff) | |
parent | 1c9b7aa1eb40ab708ef3242f74b9a61487623168 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6: (36 commits)
[ATM]: Check IP header validity in mpc_send_packet
[IPV6]: IPV6_MULTICAST_IF setting is ignored on link-local connect()
[CONNECTOR]: Don't touch queue dev after decrement of ref count.
[SOCK]: Adds a rcu_dereference() in sk_filter
[XFRM]: xfrm_algo_clone() allocates too much memory
[FORCEDETH]: Fix reversing the MAC address on suspend.
[NET]: mcs7830 passes msecs instead of jiffies to usb_control_msg
[LRO] Fix lro_mgr->features checks
[NET]: Clone the sk_buff 'iif' field in __skb_clone()
[IPV4] ROUTE: ip_rt_dump() is unecessary slow
[NET]: kaweth was forgotten in msec switchover of usb_start_wait_urb
[NET] Intel ethernet drivers: update MAINTAINERS
[NET]: Make ->poll() breakout consistent in Intel ethernet drivers.
[NET]: Stop polling when napi_disable() is pending.
[NET]: Fix drivers to handle napi_disable() disabling interrupts.
[NETXEN]: Fix ->poll() done logic.
mac80211: return an error when SIWRATE doesn't match any rate
ssb: Fix probing of PCI cores if PCI and PCIE core is available
[NET]: Do not check netif_running() and carrier state in ->poll()
[NET]: Add NAPI_STATE_DISABLE.
...
Diffstat (limited to 'net')
-rw-r--r-- | net/atm/mpc.c | 7 | ||||
-rw-r--r-- | net/core/dev.c | 8 | ||||
-rw-r--r-- | net/core/skbuff.c | 11 | ||||
-rw-r--r-- | net/ipv4/inet_lro.c | 16 | ||||
-rw-r--r-- | net/ipv4/ipconfig.c | 22 | ||||
-rw-r--r-- | net/ipv4/raw.c | 4 | ||||
-rw-r--r-- | net/ipv4/route.c | 8 | ||||
-rw-r--r-- | net/ipv6/datagram.c | 6 | ||||
-rw-r--r-- | net/irda/af_irda.c | 2 | ||||
-rw-r--r-- | net/mac80211/ieee80211_ioctl.c | 6 | ||||
-rw-r--r-- | net/sctp/sm_make_chunk.c | 6 | ||||
-rw-r--r-- | net/sctp/sm_statefuns.c | 22 | ||||
-rw-r--r-- | net/sctp/ulpevent.c | 2 | ||||
-rw-r--r-- | net/xfrm/xfrm_user.c | 17 |
14 files changed, 71 insertions, 66 deletions
diff --git a/net/atm/mpc.c b/net/atm/mpc.c index 2086396de177..9c7f712fc7e9 100644 --- a/net/atm/mpc.c +++ b/net/atm/mpc.c | |||
@@ -542,6 +542,13 @@ static int mpc_send_packet(struct sk_buff *skb, struct net_device *dev) | |||
542 | if (eth->h_proto != htons(ETH_P_IP)) | 542 | if (eth->h_proto != htons(ETH_P_IP)) |
543 | goto non_ip; /* Multi-Protocol Over ATM :-) */ | 543 | goto non_ip; /* Multi-Protocol Over ATM :-) */ |
544 | 544 | ||
545 | /* Weed out funny packets (e.g., AF_PACKET or raw). */ | ||
546 | if (skb->len < ETH_HLEN + sizeof(struct iphdr)) | ||
547 | goto non_ip; | ||
548 | skb_set_network_header(skb, ETH_HLEN); | ||
549 | if (skb->len < ETH_HLEN + ip_hdr(skb)->ihl * 4 || ip_hdr(skb)->ihl < 5) | ||
550 | goto non_ip; | ||
551 | |||
545 | while (i < mpc->number_of_mps_macs) { | 552 | while (i < mpc->number_of_mps_macs) { |
546 | if (!compare_ether_addr(eth->h_dest, (mpc->mps_macs + i*ETH_ALEN))) | 553 | if (!compare_ether_addr(eth->h_dest, (mpc->mps_macs + i*ETH_ALEN))) |
547 | if ( send_via_shortcut(skb, mpc) == 0 ) /* try shortcut */ | 554 | if ( send_via_shortcut(skb, mpc) == 0 ) /* try shortcut */ |
diff --git a/net/core/dev.c b/net/core/dev.c index be9d3015beaa..0879f52115eb 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -2207,8 +2207,12 @@ static void net_rx_action(struct softirq_action *h) | |||
2207 | * still "owns" the NAPI instance and therefore can | 2207 | * still "owns" the NAPI instance and therefore can |
2208 | * move the instance around on the list at-will. | 2208 | * move the instance around on the list at-will. |
2209 | */ | 2209 | */ |
2210 | if (unlikely(work == weight)) | 2210 | if (unlikely(work == weight)) { |
2211 | list_move_tail(&n->poll_list, list); | 2211 | if (unlikely(napi_disable_pending(n))) |
2212 | __napi_complete(n); | ||
2213 | else | ||
2214 | list_move_tail(&n->poll_list, list); | ||
2215 | } | ||
2212 | 2216 | ||
2213 | netpoll_poll_unlock(have); | 2217 | netpoll_poll_unlock(have); |
2214 | } | 2218 | } |
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 5b4ce9b4dd20..b6283779e93d 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c | |||
@@ -416,16 +416,17 @@ static struct sk_buff *__skb_clone(struct sk_buff *n, struct sk_buff *skb) | |||
416 | C(len); | 416 | C(len); |
417 | C(data_len); | 417 | C(data_len); |
418 | C(mac_len); | 418 | C(mac_len); |
419 | n->cloned = 1; | ||
420 | n->hdr_len = skb->nohdr ? skb_headroom(skb) : skb->hdr_len; | 419 | n->hdr_len = skb->nohdr ? skb_headroom(skb) : skb->hdr_len; |
420 | n->cloned = 1; | ||
421 | n->nohdr = 0; | 421 | n->nohdr = 0; |
422 | n->destructor = NULL; | 422 | n->destructor = NULL; |
423 | C(truesize); | 423 | C(iif); |
424 | atomic_set(&n->users, 1); | ||
425 | C(head); | ||
426 | C(data); | ||
427 | C(tail); | 424 | C(tail); |
428 | C(end); | 425 | C(end); |
426 | C(head); | ||
427 | C(data); | ||
428 | C(truesize); | ||
429 | atomic_set(&n->users, 1); | ||
429 | 430 | ||
430 | atomic_inc(&(skb_shinfo(skb)->dataref)); | 431 | atomic_inc(&(skb_shinfo(skb)->dataref)); |
431 | skb->cloned = 1; | 432 | skb->cloned = 1; |
diff --git a/net/ipv4/inet_lro.c b/net/ipv4/inet_lro.c index 9a96c277393d..4a4d49fca1f2 100644 --- a/net/ipv4/inet_lro.c +++ b/net/ipv4/inet_lro.c | |||
@@ -310,7 +310,7 @@ static void lro_flush(struct net_lro_mgr *lro_mgr, | |||
310 | skb_shinfo(lro_desc->parent)->gso_size = lro_desc->mss; | 310 | skb_shinfo(lro_desc->parent)->gso_size = lro_desc->mss; |
311 | 311 | ||
312 | if (lro_desc->vgrp) { | 312 | if (lro_desc->vgrp) { |
313 | if (test_bit(LRO_F_NAPI, &lro_mgr->features)) | 313 | if (lro_mgr->features & LRO_F_NAPI) |
314 | vlan_hwaccel_receive_skb(lro_desc->parent, | 314 | vlan_hwaccel_receive_skb(lro_desc->parent, |
315 | lro_desc->vgrp, | 315 | lro_desc->vgrp, |
316 | lro_desc->vlan_tag); | 316 | lro_desc->vlan_tag); |
@@ -320,7 +320,7 @@ static void lro_flush(struct net_lro_mgr *lro_mgr, | |||
320 | lro_desc->vlan_tag); | 320 | lro_desc->vlan_tag); |
321 | 321 | ||
322 | } else { | 322 | } else { |
323 | if (test_bit(LRO_F_NAPI, &lro_mgr->features)) | 323 | if (lro_mgr->features & LRO_F_NAPI) |
324 | netif_receive_skb(lro_desc->parent); | 324 | netif_receive_skb(lro_desc->parent); |
325 | else | 325 | else |
326 | netif_rx(lro_desc->parent); | 326 | netif_rx(lro_desc->parent); |
@@ -352,7 +352,7 @@ static int __lro_proc_skb(struct net_lro_mgr *lro_mgr, struct sk_buff *skb, | |||
352 | goto out; | 352 | goto out; |
353 | 353 | ||
354 | if ((skb->protocol == htons(ETH_P_8021Q)) | 354 | if ((skb->protocol == htons(ETH_P_8021Q)) |
355 | && !test_bit(LRO_F_EXTRACT_VLAN_ID, &lro_mgr->features)) | 355 | && !(lro_mgr->features & LRO_F_EXTRACT_VLAN_ID)) |
356 | vlan_hdr_len = VLAN_HLEN; | 356 | vlan_hdr_len = VLAN_HLEN; |
357 | 357 | ||
358 | if (!lro_desc->active) { /* start new lro session */ | 358 | if (!lro_desc->active) { /* start new lro session */ |
@@ -474,7 +474,7 @@ static struct sk_buff *__lro_proc_segment(struct net_lro_mgr *lro_mgr, | |||
474 | goto out; | 474 | goto out; |
475 | 475 | ||
476 | if ((skb->protocol == htons(ETH_P_8021Q)) | 476 | if ((skb->protocol == htons(ETH_P_8021Q)) |
477 | && !test_bit(LRO_F_EXTRACT_VLAN_ID, &lro_mgr->features)) | 477 | && !(lro_mgr->features & LRO_F_EXTRACT_VLAN_ID)) |
478 | vlan_hdr_len = VLAN_HLEN; | 478 | vlan_hdr_len = VLAN_HLEN; |
479 | 479 | ||
480 | iph = (void *)(skb->data + vlan_hdr_len); | 480 | iph = (void *)(skb->data + vlan_hdr_len); |
@@ -516,7 +516,7 @@ void lro_receive_skb(struct net_lro_mgr *lro_mgr, | |||
516 | void *priv) | 516 | void *priv) |
517 | { | 517 | { |
518 | if (__lro_proc_skb(lro_mgr, skb, NULL, 0, priv)) { | 518 | if (__lro_proc_skb(lro_mgr, skb, NULL, 0, priv)) { |
519 | if (test_bit(LRO_F_NAPI, &lro_mgr->features)) | 519 | if (lro_mgr->features & LRO_F_NAPI) |
520 | netif_receive_skb(skb); | 520 | netif_receive_skb(skb); |
521 | else | 521 | else |
522 | netif_rx(skb); | 522 | netif_rx(skb); |
@@ -531,7 +531,7 @@ void lro_vlan_hwaccel_receive_skb(struct net_lro_mgr *lro_mgr, | |||
531 | void *priv) | 531 | void *priv) |
532 | { | 532 | { |
533 | if (__lro_proc_skb(lro_mgr, skb, vgrp, vlan_tag, priv)) { | 533 | if (__lro_proc_skb(lro_mgr, skb, vgrp, vlan_tag, priv)) { |
534 | if (test_bit(LRO_F_NAPI, &lro_mgr->features)) | 534 | if (lro_mgr->features & LRO_F_NAPI) |
535 | vlan_hwaccel_receive_skb(skb, vgrp, vlan_tag); | 535 | vlan_hwaccel_receive_skb(skb, vgrp, vlan_tag); |
536 | else | 536 | else |
537 | vlan_hwaccel_rx(skb, vgrp, vlan_tag); | 537 | vlan_hwaccel_rx(skb, vgrp, vlan_tag); |
@@ -550,7 +550,7 @@ void lro_receive_frags(struct net_lro_mgr *lro_mgr, | |||
550 | if (!skb) | 550 | if (!skb) |
551 | return; | 551 | return; |
552 | 552 | ||
553 | if (test_bit(LRO_F_NAPI, &lro_mgr->features)) | 553 | if (lro_mgr->features & LRO_F_NAPI) |
554 | netif_receive_skb(skb); | 554 | netif_receive_skb(skb); |
555 | else | 555 | else |
556 | netif_rx(skb); | 556 | netif_rx(skb); |
@@ -570,7 +570,7 @@ void lro_vlan_hwaccel_receive_frags(struct net_lro_mgr *lro_mgr, | |||
570 | if (!skb) | 570 | if (!skb) |
571 | return; | 571 | return; |
572 | 572 | ||
573 | if (test_bit(LRO_F_NAPI, &lro_mgr->features)) | 573 | if (lro_mgr->features & LRO_F_NAPI) |
574 | vlan_hwaccel_receive_skb(skb, vgrp, vlan_tag); | 574 | vlan_hwaccel_receive_skb(skb, vgrp, vlan_tag); |
575 | else | 575 | else |
576 | vlan_hwaccel_rx(skb, vgrp, vlan_tag); | 576 | vlan_hwaccel_rx(skb, vgrp, vlan_tag); |
diff --git a/net/ipv4/ipconfig.c b/net/ipv4/ipconfig.c index 56a675734ea5..b8f7763b2261 100644 --- a/net/ipv4/ipconfig.c +++ b/net/ipv4/ipconfig.c | |||
@@ -1404,8 +1404,7 @@ static int __init ic_proto_name(char *name) | |||
1404 | return 1; | 1404 | return 1; |
1405 | } | 1405 | } |
1406 | if (!strcmp(name, "off") || !strcmp(name, "none")) { | 1406 | if (!strcmp(name, "off") || !strcmp(name, "none")) { |
1407 | ic_enable = 0; | 1407 | return 0; |
1408 | return 1; | ||
1409 | } | 1408 | } |
1410 | #ifdef CONFIG_IP_PNP_DHCP | 1409 | #ifdef CONFIG_IP_PNP_DHCP |
1411 | else if (!strcmp(name, "dhcp")) { | 1410 | else if (!strcmp(name, "dhcp")) { |
@@ -1442,10 +1441,22 @@ static int __init ip_auto_config_setup(char *addrs) | |||
1442 | ic_set_manually = 1; | 1441 | ic_set_manually = 1; |
1443 | ic_enable = 1; | 1442 | ic_enable = 1; |
1444 | 1443 | ||
1444 | /* | ||
1445 | * If any dhcp, bootp etc options are set, leave autoconfig on | ||
1446 | * and skip the below static IP processing. | ||
1447 | */ | ||
1445 | if (ic_proto_name(addrs)) | 1448 | if (ic_proto_name(addrs)) |
1446 | return 1; | 1449 | return 1; |
1447 | 1450 | ||
1448 | /* Parse the whole string */ | 1451 | /* If no static IP is given, turn off autoconfig and bail. */ |
1452 | if (*addrs == 0 || | ||
1453 | strcmp(addrs, "off") == 0 || | ||
1454 | strcmp(addrs, "none") == 0) { | ||
1455 | ic_enable = 0; | ||
1456 | return 1; | ||
1457 | } | ||
1458 | |||
1459 | /* Parse string for static IP assignment. */ | ||
1449 | ip = addrs; | 1460 | ip = addrs; |
1450 | while (ip && *ip) { | 1461 | while (ip && *ip) { |
1451 | if ((cp = strchr(ip, ':'))) | 1462 | if ((cp = strchr(ip, ':'))) |
@@ -1483,7 +1494,10 @@ static int __init ip_auto_config_setup(char *addrs) | |||
1483 | strlcpy(user_dev_name, ip, sizeof(user_dev_name)); | 1494 | strlcpy(user_dev_name, ip, sizeof(user_dev_name)); |
1484 | break; | 1495 | break; |
1485 | case 6: | 1496 | case 6: |
1486 | ic_proto_name(ip); | 1497 | if (ic_proto_name(ip) == 0 && |
1498 | ic_myaddr == NONE) { | ||
1499 | ic_enable = 0; | ||
1500 | } | ||
1487 | break; | 1501 | break; |
1488 | } | 1502 | } |
1489 | } | 1503 | } |
diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c index 66b42f547bf9..e7050f8eabeb 100644 --- a/net/ipv4/raw.c +++ b/net/ipv4/raw.c | |||
@@ -271,6 +271,7 @@ static int raw_send_hdrinc(struct sock *sk, void *from, size_t length, | |||
271 | int hh_len; | 271 | int hh_len; |
272 | struct iphdr *iph; | 272 | struct iphdr *iph; |
273 | struct sk_buff *skb; | 273 | struct sk_buff *skb; |
274 | unsigned int iphlen; | ||
274 | int err; | 275 | int err; |
275 | 276 | ||
276 | if (length > rt->u.dst.dev->mtu) { | 277 | if (length > rt->u.dst.dev->mtu) { |
@@ -304,7 +305,8 @@ static int raw_send_hdrinc(struct sock *sk, void *from, size_t length, | |||
304 | goto error_fault; | 305 | goto error_fault; |
305 | 306 | ||
306 | /* We don't modify invalid header */ | 307 | /* We don't modify invalid header */ |
307 | if (length >= sizeof(*iph) && iph->ihl * 4U <= length) { | 308 | iphlen = iph->ihl * 4; |
309 | if (iphlen >= sizeof(*iph) && iphlen <= length) { | ||
308 | if (!iph->saddr) | 310 | if (!iph->saddr) |
309 | iph->saddr = rt->rt_src; | 311 | iph->saddr = rt->rt_src; |
310 | iph->check = 0; | 312 | iph->check = 0; |
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index d2bc6148a737..d3377069ce05 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
@@ -2626,11 +2626,10 @@ int ip_rt_dump(struct sk_buff *skb, struct netlink_callback *cb) | |||
2626 | int idx, s_idx; | 2626 | int idx, s_idx; |
2627 | 2627 | ||
2628 | s_h = cb->args[0]; | 2628 | s_h = cb->args[0]; |
2629 | if (s_h < 0) | ||
2630 | s_h = 0; | ||
2629 | s_idx = idx = cb->args[1]; | 2631 | s_idx = idx = cb->args[1]; |
2630 | for (h = 0; h <= rt_hash_mask; h++) { | 2632 | for (h = s_h; h <= rt_hash_mask; h++) { |
2631 | if (h < s_h) continue; | ||
2632 | if (h > s_h) | ||
2633 | s_idx = 0; | ||
2634 | rcu_read_lock_bh(); | 2633 | rcu_read_lock_bh(); |
2635 | for (rt = rcu_dereference(rt_hash_table[h].chain), idx = 0; rt; | 2634 | for (rt = rcu_dereference(rt_hash_table[h].chain), idx = 0; rt; |
2636 | rt = rcu_dereference(rt->u.dst.rt_next), idx++) { | 2635 | rt = rcu_dereference(rt->u.dst.rt_next), idx++) { |
@@ -2647,6 +2646,7 @@ int ip_rt_dump(struct sk_buff *skb, struct netlink_callback *cb) | |||
2647 | dst_release(xchg(&skb->dst, NULL)); | 2646 | dst_release(xchg(&skb->dst, NULL)); |
2648 | } | 2647 | } |
2649 | rcu_read_unlock_bh(); | 2648 | rcu_read_unlock_bh(); |
2649 | s_idx = 0; | ||
2650 | } | 2650 | } |
2651 | 2651 | ||
2652 | done: | 2652 | done: |
diff --git a/net/ipv6/datagram.c b/net/ipv6/datagram.c index 2ed689ac449e..5d4245ab4183 100644 --- a/net/ipv6/datagram.c +++ b/net/ipv6/datagram.c | |||
@@ -123,11 +123,11 @@ ipv4_connected: | |||
123 | goto out; | 123 | goto out; |
124 | } | 124 | } |
125 | sk->sk_bound_dev_if = usin->sin6_scope_id; | 125 | sk->sk_bound_dev_if = usin->sin6_scope_id; |
126 | if (!sk->sk_bound_dev_if && | ||
127 | (addr_type & IPV6_ADDR_MULTICAST)) | ||
128 | fl.oif = np->mcast_oif; | ||
129 | } | 126 | } |
130 | 127 | ||
128 | if (!sk->sk_bound_dev_if && (addr_type & IPV6_ADDR_MULTICAST)) | ||
129 | sk->sk_bound_dev_if = np->mcast_oif; | ||
130 | |||
131 | /* Connect to link-local address requires an interface */ | 131 | /* Connect to link-local address requires an interface */ |
132 | if (!sk->sk_bound_dev_if) { | 132 | if (!sk->sk_bound_dev_if) { |
133 | err = -EINVAL; | 133 | err = -EINVAL; |
diff --git a/net/irda/af_irda.c b/net/irda/af_irda.c index 48ce59a6e026..d5e4dd75200b 100644 --- a/net/irda/af_irda.c +++ b/net/irda/af_irda.c | |||
@@ -1118,8 +1118,6 @@ static int irda_create(struct net *net, struct socket *sock, int protocol) | |||
1118 | self->max_sdu_size_rx = TTP_SAR_UNBOUND; | 1118 | self->max_sdu_size_rx = TTP_SAR_UNBOUND; |
1119 | break; | 1119 | break; |
1120 | default: | 1120 | default: |
1121 | IRDA_ERROR("%s: protocol not supported!\n", | ||
1122 | __FUNCTION__); | ||
1123 | return -ESOCKTNOSUPPORT; | 1121 | return -ESOCKTNOSUPPORT; |
1124 | } | 1122 | } |
1125 | break; | 1123 | break; |
diff --git a/net/mac80211/ieee80211_ioctl.c b/net/mac80211/ieee80211_ioctl.c index 7027eed4d4ae..308bbe4a1333 100644 --- a/net/mac80211/ieee80211_ioctl.c +++ b/net/mac80211/ieee80211_ioctl.c | |||
@@ -591,7 +591,7 @@ static int ieee80211_ioctl_siwrate(struct net_device *dev, | |||
591 | sdata->bss->force_unicast_rateidx = -1; | 591 | sdata->bss->force_unicast_rateidx = -1; |
592 | if (rate->value < 0) | 592 | if (rate->value < 0) |
593 | return 0; | 593 | return 0; |
594 | for (i=0; i< mode->num_rates; i++) { | 594 | for (i=0; i < mode->num_rates; i++) { |
595 | struct ieee80211_rate *rates = &mode->rates[i]; | 595 | struct ieee80211_rate *rates = &mode->rates[i]; |
596 | int this_rate = rates->rate; | 596 | int this_rate = rates->rate; |
597 | 597 | ||
@@ -599,10 +599,10 @@ static int ieee80211_ioctl_siwrate(struct net_device *dev, | |||
599 | sdata->bss->max_ratectrl_rateidx = i; | 599 | sdata->bss->max_ratectrl_rateidx = i; |
600 | if (rate->fixed) | 600 | if (rate->fixed) |
601 | sdata->bss->force_unicast_rateidx = i; | 601 | sdata->bss->force_unicast_rateidx = i; |
602 | break; | 602 | return 0; |
603 | } | 603 | } |
604 | } | 604 | } |
605 | return 0; | 605 | return -EINVAL; |
606 | } | 606 | } |
607 | 607 | ||
608 | static int ieee80211_ioctl_giwrate(struct net_device *dev, | 608 | static int ieee80211_ioctl_giwrate(struct net_device *dev, |
diff --git a/net/sctp/sm_make_chunk.c b/net/sctp/sm_make_chunk.c index ed7c9e30ebc9..3cc629d3c9ff 100644 --- a/net/sctp/sm_make_chunk.c +++ b/net/sctp/sm_make_chunk.c | |||
@@ -210,6 +210,9 @@ struct sctp_chunk *sctp_make_init(const struct sctp_association *asoc, | |||
210 | chunksize = sizeof(init) + addrs_len + SCTP_SAT_LEN(num_types); | 210 | chunksize = sizeof(init) + addrs_len + SCTP_SAT_LEN(num_types); |
211 | chunksize += sizeof(ecap_param); | 211 | chunksize += sizeof(ecap_param); |
212 | 212 | ||
213 | if (sctp_prsctp_enable) | ||
214 | chunksize += sizeof(prsctp_param); | ||
215 | |||
213 | /* ADDIP: Section 4.2.7: | 216 | /* ADDIP: Section 4.2.7: |
214 | * An implementation supporting this extension [ADDIP] MUST list | 217 | * An implementation supporting this extension [ADDIP] MUST list |
215 | * the ASCONF,the ASCONF-ACK, and the AUTH chunks in its INIT and | 218 | * the ASCONF,the ASCONF-ACK, and the AUTH chunks in its INIT and |
@@ -369,6 +372,9 @@ struct sctp_chunk *sctp_make_init_ack(const struct sctp_association *asoc, | |||
369 | if (asoc->peer.ecn_capable) | 372 | if (asoc->peer.ecn_capable) |
370 | chunksize += sizeof(ecap_param); | 373 | chunksize += sizeof(ecap_param); |
371 | 374 | ||
375 | if (sctp_prsctp_enable) | ||
376 | chunksize += sizeof(prsctp_param); | ||
377 | |||
372 | if (sctp_addip_enable) { | 378 | if (sctp_addip_enable) { |
373 | extensions[num_ext] = SCTP_CID_ASCONF; | 379 | extensions[num_ext] = SCTP_CID_ASCONF; |
374 | extensions[num_ext+1] = SCTP_CID_ASCONF_ACK; | 380 | extensions[num_ext+1] = SCTP_CID_ASCONF_ACK; |
diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c index 5fb84778846d..d247ed4ee423 100644 --- a/net/sctp/sm_statefuns.c +++ b/net/sctp/sm_statefuns.c | |||
@@ -1309,26 +1309,6 @@ static void sctp_tietags_populate(struct sctp_association *new_asoc, | |||
1309 | new_asoc->c.initial_tsn = asoc->c.initial_tsn; | 1309 | new_asoc->c.initial_tsn = asoc->c.initial_tsn; |
1310 | } | 1310 | } |
1311 | 1311 | ||
1312 | static void sctp_auth_params_populate(struct sctp_association *new_asoc, | ||
1313 | const struct sctp_association *asoc) | ||
1314 | { | ||
1315 | /* Only perform this if AUTH extension is enabled */ | ||
1316 | if (!sctp_auth_enable) | ||
1317 | return; | ||
1318 | |||
1319 | /* We need to provide the same parameter information as | ||
1320 | * was in the original INIT. This means that we need to copy | ||
1321 | * the HMACS, CHUNKS, and RANDOM parameter from the original | ||
1322 | * assocaition. | ||
1323 | */ | ||
1324 | memcpy(new_asoc->c.auth_random, asoc->c.auth_random, | ||
1325 | sizeof(asoc->c.auth_random)); | ||
1326 | memcpy(new_asoc->c.auth_hmacs, asoc->c.auth_hmacs, | ||
1327 | sizeof(asoc->c.auth_hmacs)); | ||
1328 | memcpy(new_asoc->c.auth_chunks, asoc->c.auth_chunks, | ||
1329 | sizeof(asoc->c.auth_chunks)); | ||
1330 | } | ||
1331 | |||
1332 | /* | 1312 | /* |
1333 | * Compare vtag/tietag values to determine unexpected COOKIE-ECHO | 1313 | * Compare vtag/tietag values to determine unexpected COOKIE-ECHO |
1334 | * handling action. | 1314 | * handling action. |
@@ -1486,8 +1466,6 @@ static sctp_disposition_t sctp_sf_do_unexpected_init( | |||
1486 | 1466 | ||
1487 | sctp_tietags_populate(new_asoc, asoc); | 1467 | sctp_tietags_populate(new_asoc, asoc); |
1488 | 1468 | ||
1489 | sctp_auth_params_populate(new_asoc, asoc); | ||
1490 | |||
1491 | /* B) "Z" shall respond immediately with an INIT ACK chunk. */ | 1469 | /* B) "Z" shall respond immediately with an INIT ACK chunk. */ |
1492 | 1470 | ||
1493 | /* If there are errors need to be reported for unknown parameters, | 1471 | /* If there are errors need to be reported for unknown parameters, |
diff --git a/net/sctp/ulpevent.c b/net/sctp/ulpevent.c index 2c17c7efad46..307314356e16 100644 --- a/net/sctp/ulpevent.c +++ b/net/sctp/ulpevent.c | |||
@@ -830,7 +830,7 @@ struct sctp_ulpevent *sctp_ulpevent_make_authkey( | |||
830 | ak = (struct sctp_authkey_event *) | 830 | ak = (struct sctp_authkey_event *) |
831 | skb_put(skb, sizeof(struct sctp_authkey_event)); | 831 | skb_put(skb, sizeof(struct sctp_authkey_event)); |
832 | 832 | ||
833 | ak->auth_type = SCTP_AUTHENTICATION_EVENT; | 833 | ak->auth_type = SCTP_AUTHENTICATION_INDICATION; |
834 | ak->auth_flags = 0; | 834 | ak->auth_flags = 0; |
835 | ak->auth_length = sizeof(struct sctp_authkey_event); | 835 | ak->auth_length = sizeof(struct sctp_authkey_event); |
836 | 836 | ||
diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c index e75dbdcb08a4..c4f6419b1769 100644 --- a/net/xfrm/xfrm_user.c +++ b/net/xfrm/xfrm_user.c | |||
@@ -31,11 +31,6 @@ | |||
31 | #include <linux/in6.h> | 31 | #include <linux/in6.h> |
32 | #endif | 32 | #endif |
33 | 33 | ||
34 | static inline int alg_len(struct xfrm_algo *alg) | ||
35 | { | ||
36 | return sizeof(*alg) + ((alg->alg_key_len + 7) / 8); | ||
37 | } | ||
38 | |||
39 | static int verify_one_alg(struct nlattr **attrs, enum xfrm_attr_type_t type) | 34 | static int verify_one_alg(struct nlattr **attrs, enum xfrm_attr_type_t type) |
40 | { | 35 | { |
41 | struct nlattr *rt = attrs[type]; | 36 | struct nlattr *rt = attrs[type]; |
@@ -45,7 +40,7 @@ static int verify_one_alg(struct nlattr **attrs, enum xfrm_attr_type_t type) | |||
45 | return 0; | 40 | return 0; |
46 | 41 | ||
47 | algp = nla_data(rt); | 42 | algp = nla_data(rt); |
48 | if (nla_len(rt) < alg_len(algp)) | 43 | if (nla_len(rt) < xfrm_alg_len(algp)) |
49 | return -EINVAL; | 44 | return -EINVAL; |
50 | 45 | ||
51 | switch (type) { | 46 | switch (type) { |
@@ -204,7 +199,7 @@ static int attach_one_algo(struct xfrm_algo **algpp, u8 *props, | |||
204 | return -ENOSYS; | 199 | return -ENOSYS; |
205 | *props = algo->desc.sadb_alg_id; | 200 | *props = algo->desc.sadb_alg_id; |
206 | 201 | ||
207 | p = kmemdup(ualg, alg_len(ualg), GFP_KERNEL); | 202 | p = kmemdup(ualg, xfrm_alg_len(ualg), GFP_KERNEL); |
208 | if (!p) | 203 | if (!p) |
209 | return -ENOMEM; | 204 | return -ENOMEM; |
210 | 205 | ||
@@ -516,9 +511,9 @@ static int copy_to_user_state_extra(struct xfrm_state *x, | |||
516 | NLA_PUT_U64(skb, XFRMA_LASTUSED, x->lastused); | 511 | NLA_PUT_U64(skb, XFRMA_LASTUSED, x->lastused); |
517 | 512 | ||
518 | if (x->aalg) | 513 | if (x->aalg) |
519 | NLA_PUT(skb, XFRMA_ALG_AUTH, alg_len(x->aalg), x->aalg); | 514 | NLA_PUT(skb, XFRMA_ALG_AUTH, xfrm_alg_len(x->aalg), x->aalg); |
520 | if (x->ealg) | 515 | if (x->ealg) |
521 | NLA_PUT(skb, XFRMA_ALG_CRYPT, alg_len(x->ealg), x->ealg); | 516 | NLA_PUT(skb, XFRMA_ALG_CRYPT, xfrm_alg_len(x->ealg), x->ealg); |
522 | if (x->calg) | 517 | if (x->calg) |
523 | NLA_PUT(skb, XFRMA_ALG_COMP, sizeof(*(x->calg)), x->calg); | 518 | NLA_PUT(skb, XFRMA_ALG_COMP, sizeof(*(x->calg)), x->calg); |
524 | 519 | ||
@@ -1978,9 +1973,9 @@ static inline size_t xfrm_sa_len(struct xfrm_state *x) | |||
1978 | { | 1973 | { |
1979 | size_t l = 0; | 1974 | size_t l = 0; |
1980 | if (x->aalg) | 1975 | if (x->aalg) |
1981 | l += nla_total_size(alg_len(x->aalg)); | 1976 | l += nla_total_size(xfrm_alg_len(x->aalg)); |
1982 | if (x->ealg) | 1977 | if (x->ealg) |
1983 | l += nla_total_size(alg_len(x->ealg)); | 1978 | l += nla_total_size(xfrm_alg_len(x->ealg)); |
1984 | if (x->calg) | 1979 | if (x->calg) |
1985 | l += nla_total_size(sizeof(*x->calg)); | 1980 | l += nla_total_size(sizeof(*x->calg)); |
1986 | if (x->encap) | 1981 | if (x->encap) |