diff options
| author | Russell King <rmk+kernel@arm.linux.org.uk> | 2010-07-29 10:48:02 -0400 |
|---|---|---|
| committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2010-07-29 10:48:02 -0400 |
| commit | 129961ecaf21c9ee899ad9067d917c1aa172fb7a (patch) | |
| tree | 49eafdcf4d6ac490ecdd92c36c285817872eaf34 /net | |
| parent | 392c57a2ec811db37ae45adc513704cf92ba3e69 (diff) | |
| parent | cccf59abea4e1c36322e365d6e61ff7de1f3ee07 (diff) | |
Merge branch 'wells/lpc32xx-arch_v2' of git://git.lpclinux.com/linux-2.6-lpc into devel-stable
Diffstat (limited to 'net')
| -rw-r--r-- | net/bluetooth/hci_conn.c | 5 | ||||
| -rw-r--r-- | net/bluetooth/hci_event.c | 2 | ||||
| -rw-r--r-- | net/bluetooth/l2cap.c | 14 | ||||
| -rw-r--r-- | net/bridge/br_device.c | 9 | ||||
| -rw-r--r-- | net/bridge/br_forward.c | 23 | ||||
| -rw-r--r-- | net/core/dev.c | 21 | ||||
| -rw-r--r-- | net/core/neighbour.c | 5 | ||||
| -rw-r--r-- | net/core/skbuff.c | 7 | ||||
| -rw-r--r-- | net/dsa/Kconfig | 2 | ||||
| -rw-r--r-- | net/ipv4/ipmr.c | 8 | ||||
| -rw-r--r-- | net/ipv4/tcp.c | 1 | ||||
| -rw-r--r-- | net/ipv4/tcp_output.c | 3 | ||||
| -rw-r--r-- | net/ipv6/addrconf.c | 14 | ||||
| -rw-r--r-- | net/ipv6/mip6.c | 3 | ||||
| -rw-r--r-- | net/mac80211/cfg.c | 2 | ||||
| -rw-r--r-- | net/phonet/pep.c | 1 | ||||
| -rw-r--r-- | net/sched/act_mirred.c | 43 | ||||
| -rw-r--r-- | net/sched/act_nat.c | 5 | ||||
| -rw-r--r-- | net/sunrpc/auth.c | 2 | ||||
| -rw-r--r-- | net/xfrm/xfrm_policy.c | 15 |
20 files changed, 124 insertions, 61 deletions
diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c index b10e3cdb08f8..800b6b9fbbae 100644 --- a/net/bluetooth/hci_conn.c +++ b/net/bluetooth/hci_conn.c | |||
| @@ -358,6 +358,11 @@ struct hci_conn *hci_connect(struct hci_dev *hdev, int type, bdaddr_t *dst, __u8 | |||
| 358 | acl->sec_level = sec_level; | 358 | acl->sec_level = sec_level; |
| 359 | acl->auth_type = auth_type; | 359 | acl->auth_type = auth_type; |
| 360 | hci_acl_connect(acl); | 360 | hci_acl_connect(acl); |
| 361 | } else { | ||
| 362 | if (acl->sec_level < sec_level) | ||
| 363 | acl->sec_level = sec_level; | ||
| 364 | if (acl->auth_type < auth_type) | ||
| 365 | acl->auth_type = auth_type; | ||
| 361 | } | 366 | } |
| 362 | 367 | ||
| 363 | if (type == ACL_LINK) | 368 | if (type == ACL_LINK) |
diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c index 6c57fc71c7e2..786b5de0bac4 100644 --- a/net/bluetooth/hci_event.c +++ b/net/bluetooth/hci_event.c | |||
| @@ -1049,6 +1049,8 @@ static inline void hci_auth_complete_evt(struct hci_dev *hdev, struct sk_buff *s | |||
| 1049 | if (conn) { | 1049 | if (conn) { |
| 1050 | if (!ev->status) | 1050 | if (!ev->status) |
| 1051 | conn->link_mode |= HCI_LM_AUTH; | 1051 | conn->link_mode |= HCI_LM_AUTH; |
| 1052 | else | ||
| 1053 | conn->sec_level = BT_SECURITY_LOW; | ||
| 1052 | 1054 | ||
| 1053 | clear_bit(HCI_CONN_AUTH_PEND, &conn->pend); | 1055 | clear_bit(HCI_CONN_AUTH_PEND, &conn->pend); |
| 1054 | 1056 | ||
diff --git a/net/bluetooth/l2cap.c b/net/bluetooth/l2cap.c index 1b682a5aa061..cf3c4073a8a6 100644 --- a/net/bluetooth/l2cap.c +++ b/net/bluetooth/l2cap.c | |||
| @@ -401,6 +401,11 @@ static inline void l2cap_send_rr_or_rnr(struct l2cap_pinfo *pi, u16 control) | |||
| 401 | l2cap_send_sframe(pi, control); | 401 | l2cap_send_sframe(pi, control); |
| 402 | } | 402 | } |
| 403 | 403 | ||
| 404 | static inline int __l2cap_no_conn_pending(struct sock *sk) | ||
| 405 | { | ||
| 406 | return !(l2cap_pi(sk)->conf_state & L2CAP_CONF_CONNECT_PEND); | ||
| 407 | } | ||
| 408 | |||
| 404 | static void l2cap_do_start(struct sock *sk) | 409 | static void l2cap_do_start(struct sock *sk) |
| 405 | { | 410 | { |
| 406 | struct l2cap_conn *conn = l2cap_pi(sk)->conn; | 411 | struct l2cap_conn *conn = l2cap_pi(sk)->conn; |
| @@ -409,12 +414,13 @@ static void l2cap_do_start(struct sock *sk) | |||
| 409 | if (!(conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE)) | 414 | if (!(conn->info_state & L2CAP_INFO_FEAT_MASK_REQ_DONE)) |
| 410 | return; | 415 | return; |
| 411 | 416 | ||
| 412 | if (l2cap_check_security(sk)) { | 417 | if (l2cap_check_security(sk) && __l2cap_no_conn_pending(sk)) { |
| 413 | struct l2cap_conn_req req; | 418 | struct l2cap_conn_req req; |
| 414 | req.scid = cpu_to_le16(l2cap_pi(sk)->scid); | 419 | req.scid = cpu_to_le16(l2cap_pi(sk)->scid); |
| 415 | req.psm = l2cap_pi(sk)->psm; | 420 | req.psm = l2cap_pi(sk)->psm; |
| 416 | 421 | ||
| 417 | l2cap_pi(sk)->ident = l2cap_get_ident(conn); | 422 | l2cap_pi(sk)->ident = l2cap_get_ident(conn); |
| 423 | l2cap_pi(sk)->conf_state |= L2CAP_CONF_CONNECT_PEND; | ||
| 418 | 424 | ||
| 419 | l2cap_send_cmd(conn, l2cap_pi(sk)->ident, | 425 | l2cap_send_cmd(conn, l2cap_pi(sk)->ident, |
| 420 | L2CAP_CONN_REQ, sizeof(req), &req); | 426 | L2CAP_CONN_REQ, sizeof(req), &req); |
| @@ -464,12 +470,14 @@ static void l2cap_conn_start(struct l2cap_conn *conn) | |||
| 464 | } | 470 | } |
| 465 | 471 | ||
| 466 | if (sk->sk_state == BT_CONNECT) { | 472 | if (sk->sk_state == BT_CONNECT) { |
| 467 | if (l2cap_check_security(sk)) { | 473 | if (l2cap_check_security(sk) && |
| 474 | __l2cap_no_conn_pending(sk)) { | ||
| 468 | struct l2cap_conn_req req; | 475 | struct l2cap_conn_req req; |
| 469 | req.scid = cpu_to_le16(l2cap_pi(sk)->scid); | 476 | req.scid = cpu_to_le16(l2cap_pi(sk)->scid); |
| 470 | req.psm = l2cap_pi(sk)->psm; | 477 | req.psm = l2cap_pi(sk)->psm; |
| 471 | 478 | ||
| 472 | l2cap_pi(sk)->ident = l2cap_get_ident(conn); | 479 | l2cap_pi(sk)->ident = l2cap_get_ident(conn); |
| 480 | l2cap_pi(sk)->conf_state |= L2CAP_CONF_CONNECT_PEND; | ||
| 473 | 481 | ||
| 474 | l2cap_send_cmd(conn, l2cap_pi(sk)->ident, | 482 | l2cap_send_cmd(conn, l2cap_pi(sk)->ident, |
| 475 | L2CAP_CONN_REQ, sizeof(req), &req); | 483 | L2CAP_CONN_REQ, sizeof(req), &req); |
| @@ -2912,7 +2920,6 @@ static inline int l2cap_connect_rsp(struct l2cap_conn *conn, struct l2cap_cmd_hd | |||
| 2912 | l2cap_pi(sk)->ident = 0; | 2920 | l2cap_pi(sk)->ident = 0; |
| 2913 | l2cap_pi(sk)->dcid = dcid; | 2921 | l2cap_pi(sk)->dcid = dcid; |
| 2914 | l2cap_pi(sk)->conf_state |= L2CAP_CONF_REQ_SENT; | 2922 | l2cap_pi(sk)->conf_state |= L2CAP_CONF_REQ_SENT; |
| 2915 | |||
| 2916 | l2cap_pi(sk)->conf_state &= ~L2CAP_CONF_CONNECT_PEND; | 2923 | l2cap_pi(sk)->conf_state &= ~L2CAP_CONF_CONNECT_PEND; |
| 2917 | 2924 | ||
| 2918 | l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ, | 2925 | l2cap_send_cmd(conn, l2cap_get_ident(conn), L2CAP_CONF_REQ, |
| @@ -4404,6 +4411,7 @@ static int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt) | |||
| 4404 | req.psm = l2cap_pi(sk)->psm; | 4411 | req.psm = l2cap_pi(sk)->psm; |
| 4405 | 4412 | ||
| 4406 | l2cap_pi(sk)->ident = l2cap_get_ident(conn); | 4413 | l2cap_pi(sk)->ident = l2cap_get_ident(conn); |
| 4414 | l2cap_pi(sk)->conf_state |= L2CAP_CONF_CONNECT_PEND; | ||
| 4407 | 4415 | ||
| 4408 | l2cap_send_cmd(conn, l2cap_pi(sk)->ident, | 4416 | l2cap_send_cmd(conn, l2cap_pi(sk)->ident, |
| 4409 | L2CAP_CONN_REQ, sizeof(req), &req); | 4417 | L2CAP_CONN_REQ, sizeof(req), &req); |
diff --git a/net/bridge/br_device.c b/net/bridge/br_device.c index eedf2c94820e..753fc4221f3c 100644 --- a/net/bridge/br_device.c +++ b/net/bridge/br_device.c | |||
| @@ -217,14 +217,6 @@ static bool br_devices_support_netpoll(struct net_bridge *br) | |||
| 217 | return count != 0 && ret; | 217 | return count != 0 && ret; |
| 218 | } | 218 | } |
| 219 | 219 | ||
| 220 | static void br_poll_controller(struct net_device *br_dev) | ||
| 221 | { | ||
| 222 | struct netpoll *np = br_dev->npinfo->netpoll; | ||
| 223 | |||
| 224 | if (np->real_dev != br_dev) | ||
| 225 | netpoll_poll_dev(np->real_dev); | ||
| 226 | } | ||
| 227 | |||
| 228 | void br_netpoll_cleanup(struct net_device *dev) | 220 | void br_netpoll_cleanup(struct net_device *dev) |
| 229 | { | 221 | { |
| 230 | struct net_bridge *br = netdev_priv(dev); | 222 | struct net_bridge *br = netdev_priv(dev); |
| @@ -295,7 +287,6 @@ static const struct net_device_ops br_netdev_ops = { | |||
| 295 | .ndo_do_ioctl = br_dev_ioctl, | 287 | .ndo_do_ioctl = br_dev_ioctl, |
| 296 | #ifdef CONFIG_NET_POLL_CONTROLLER | 288 | #ifdef CONFIG_NET_POLL_CONTROLLER |
| 297 | .ndo_netpoll_cleanup = br_netpoll_cleanup, | 289 | .ndo_netpoll_cleanup = br_netpoll_cleanup, |
| 298 | .ndo_poll_controller = br_poll_controller, | ||
| 299 | #endif | 290 | #endif |
| 300 | }; | 291 | }; |
| 301 | 292 | ||
diff --git a/net/bridge/br_forward.c b/net/bridge/br_forward.c index a4e72a89e4ff..595da45f9088 100644 --- a/net/bridge/br_forward.c +++ b/net/bridge/br_forward.c | |||
| @@ -50,14 +50,7 @@ int br_dev_queue_push_xmit(struct sk_buff *skb) | |||
| 50 | kfree_skb(skb); | 50 | kfree_skb(skb); |
| 51 | else { | 51 | else { |
| 52 | skb_push(skb, ETH_HLEN); | 52 | skb_push(skb, ETH_HLEN); |
| 53 | 53 | dev_queue_xmit(skb); | |
| 54 | #ifdef CONFIG_NET_POLL_CONTROLLER | ||
| 55 | if (unlikely(skb->dev->priv_flags & IFF_IN_NETPOLL)) { | ||
| 56 | netpoll_send_skb(skb->dev->npinfo->netpoll, skb); | ||
| 57 | skb->dev->priv_flags &= ~IFF_IN_NETPOLL; | ||
| 58 | } else | ||
| 59 | #endif | ||
| 60 | dev_queue_xmit(skb); | ||
| 61 | } | 54 | } |
| 62 | } | 55 | } |
| 63 | 56 | ||
| @@ -73,23 +66,9 @@ int br_forward_finish(struct sk_buff *skb) | |||
| 73 | 66 | ||
| 74 | static void __br_deliver(const struct net_bridge_port *to, struct sk_buff *skb) | 67 | static void __br_deliver(const struct net_bridge_port *to, struct sk_buff *skb) |
| 75 | { | 68 | { |
| 76 | #ifdef CONFIG_NET_POLL_CONTROLLER | ||
| 77 | struct net_bridge *br = to->br; | ||
| 78 | if (unlikely(br->dev->priv_flags & IFF_IN_NETPOLL)) { | ||
| 79 | struct netpoll *np; | ||
| 80 | to->dev->npinfo = skb->dev->npinfo; | ||
| 81 | np = skb->dev->npinfo->netpoll; | ||
| 82 | np->real_dev = np->dev = to->dev; | ||
| 83 | to->dev->priv_flags |= IFF_IN_NETPOLL; | ||
| 84 | } | ||
| 85 | #endif | ||
| 86 | skb->dev = to->dev; | 69 | skb->dev = to->dev; |
| 87 | NF_HOOK(NFPROTO_BRIDGE, NF_BR_LOCAL_OUT, skb, NULL, skb->dev, | 70 | NF_HOOK(NFPROTO_BRIDGE, NF_BR_LOCAL_OUT, skb, NULL, skb->dev, |
| 88 | br_forward_finish); | 71 | br_forward_finish); |
| 89 | #ifdef CONFIG_NET_POLL_CONTROLLER | ||
| 90 | if (skb->dev->npinfo) | ||
| 91 | skb->dev->npinfo->netpoll->dev = br->dev; | ||
| 92 | #endif | ||
| 93 | } | 72 | } |
| 94 | 73 | ||
| 95 | static void __br_forward(const struct net_bridge_port *to, struct sk_buff *skb) | 74 | static void __br_forward(const struct net_bridge_port *to, struct sk_buff *skb) |
diff --git a/net/core/dev.c b/net/core/dev.c index 723a34710ad4..1f466e82ac33 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
| @@ -1488,6 +1488,7 @@ static inline void net_timestamp_check(struct sk_buff *skb) | |||
| 1488 | int dev_forward_skb(struct net_device *dev, struct sk_buff *skb) | 1488 | int dev_forward_skb(struct net_device *dev, struct sk_buff *skb) |
| 1489 | { | 1489 | { |
| 1490 | skb_orphan(skb); | 1490 | skb_orphan(skb); |
| 1491 | nf_reset(skb); | ||
| 1491 | 1492 | ||
| 1492 | if (!(dev->flags & IFF_UP) || | 1493 | if (!(dev->flags & IFF_UP) || |
| 1493 | (skb->len > (dev->mtu + dev->hard_header_len))) { | 1494 | (skb->len > (dev->mtu + dev->hard_header_len))) { |
| @@ -1911,8 +1912,16 @@ static int dev_gso_segment(struct sk_buff *skb) | |||
| 1911 | */ | 1912 | */ |
| 1912 | static inline void skb_orphan_try(struct sk_buff *skb) | 1913 | static inline void skb_orphan_try(struct sk_buff *skb) |
| 1913 | { | 1914 | { |
| 1914 | if (!skb_tx(skb)->flags) | 1915 | struct sock *sk = skb->sk; |
| 1916 | |||
| 1917 | if (sk && !skb_tx(skb)->flags) { | ||
| 1918 | /* skb_tx_hash() wont be able to get sk. | ||
| 1919 | * We copy sk_hash into skb->rxhash | ||
| 1920 | */ | ||
| 1921 | if (!skb->rxhash) | ||
| 1922 | skb->rxhash = sk->sk_hash; | ||
| 1915 | skb_orphan(skb); | 1923 | skb_orphan(skb); |
| 1924 | } | ||
| 1916 | } | 1925 | } |
| 1917 | 1926 | ||
| 1918 | int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev, | 1927 | int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev, |
| @@ -1998,8 +2007,7 @@ u16 skb_tx_hash(const struct net_device *dev, const struct sk_buff *skb) | |||
| 1998 | if (skb->sk && skb->sk->sk_hash) | 2007 | if (skb->sk && skb->sk->sk_hash) |
| 1999 | hash = skb->sk->sk_hash; | 2008 | hash = skb->sk->sk_hash; |
| 2000 | else | 2009 | else |
| 2001 | hash = (__force u16) skb->protocol; | 2010 | hash = (__force u16) skb->protocol ^ skb->rxhash; |
| 2002 | |||
| 2003 | hash = jhash_1word(hash, hashrnd); | 2011 | hash = jhash_1word(hash, hashrnd); |
| 2004 | 2012 | ||
| 2005 | return (u16) (((u64) hash * dev->real_num_tx_queues) >> 32); | 2013 | return (u16) (((u64) hash * dev->real_num_tx_queues) >> 32); |
| @@ -2022,12 +2030,11 @@ static inline u16 dev_cap_txqueue(struct net_device *dev, u16 queue_index) | |||
| 2022 | static struct netdev_queue *dev_pick_tx(struct net_device *dev, | 2030 | static struct netdev_queue *dev_pick_tx(struct net_device *dev, |
| 2023 | struct sk_buff *skb) | 2031 | struct sk_buff *skb) |
| 2024 | { | 2032 | { |
| 2025 | u16 queue_index; | 2033 | int queue_index; |
| 2026 | struct sock *sk = skb->sk; | 2034 | struct sock *sk = skb->sk; |
| 2027 | 2035 | ||
| 2028 | if (sk_tx_queue_recorded(sk)) { | 2036 | queue_index = sk_tx_queue_get(sk); |
| 2029 | queue_index = sk_tx_queue_get(sk); | 2037 | if (queue_index < 0) { |
| 2030 | } else { | ||
| 2031 | const struct net_device_ops *ops = dev->netdev_ops; | 2038 | const struct net_device_ops *ops = dev->netdev_ops; |
| 2032 | 2039 | ||
| 2033 | if (ops->ndo_select_queue) { | 2040 | if (ops->ndo_select_queue) { |
diff --git a/net/core/neighbour.c b/net/core/neighbour.c index 6ba1c0eece03..a4e0a7482c2b 100644 --- a/net/core/neighbour.c +++ b/net/core/neighbour.c | |||
| @@ -949,7 +949,10 @@ static void neigh_update_hhs(struct neighbour *neigh) | |||
| 949 | { | 949 | { |
| 950 | struct hh_cache *hh; | 950 | struct hh_cache *hh; |
| 951 | void (*update)(struct hh_cache*, const struct net_device*, const unsigned char *) | 951 | void (*update)(struct hh_cache*, const struct net_device*, const unsigned char *) |
| 952 | = neigh->dev->header_ops->cache_update; | 952 | = NULL; |
| 953 | |||
| 954 | if (neigh->dev->header_ops) | ||
| 955 | update = neigh->dev->header_ops->cache_update; | ||
| 953 | 956 | ||
| 954 | if (update) { | 957 | if (update) { |
| 955 | for (hh = neigh->hh; hh; hh = hh->hh_next) { | 958 | for (hh = neigh->hh; hh; hh = hh->hh_next) { |
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 34432b4e96bb..ce88293a34e2 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c | |||
| @@ -843,7 +843,9 @@ int pskb_expand_head(struct sk_buff *skb, int nhead, int ntail, | |||
| 843 | skb->network_header += off; | 843 | skb->network_header += off; |
| 844 | if (skb_mac_header_was_set(skb)) | 844 | if (skb_mac_header_was_set(skb)) |
| 845 | skb->mac_header += off; | 845 | skb->mac_header += off; |
| 846 | skb->csum_start += nhead; | 846 | /* Only adjust this if it actually is csum_start rather than csum */ |
| 847 | if (skb->ip_summed == CHECKSUM_PARTIAL) | ||
| 848 | skb->csum_start += nhead; | ||
| 847 | skb->cloned = 0; | 849 | skb->cloned = 0; |
| 848 | skb->hdr_len = 0; | 850 | skb->hdr_len = 0; |
| 849 | skb->nohdr = 0; | 851 | skb->nohdr = 0; |
| @@ -930,7 +932,8 @@ struct sk_buff *skb_copy_expand(const struct sk_buff *skb, | |||
| 930 | copy_skb_header(n, skb); | 932 | copy_skb_header(n, skb); |
| 931 | 933 | ||
| 932 | off = newheadroom - oldheadroom; | 934 | off = newheadroom - oldheadroom; |
| 933 | n->csum_start += off; | 935 | if (n->ip_summed == CHECKSUM_PARTIAL) |
| 936 | n->csum_start += off; | ||
| 934 | #ifdef NET_SKBUFF_DATA_USES_OFFSET | 937 | #ifdef NET_SKBUFF_DATA_USES_OFFSET |
| 935 | n->transport_header += off; | 938 | n->transport_header += off; |
| 936 | n->network_header += off; | 939 | n->network_header += off; |
diff --git a/net/dsa/Kconfig b/net/dsa/Kconfig index c51b55400dc5..11201784d29a 100644 --- a/net/dsa/Kconfig +++ b/net/dsa/Kconfig | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | menuconfig NET_DSA | 1 | menuconfig NET_DSA |
| 2 | bool "Distributed Switch Architecture support" | 2 | bool "Distributed Switch Architecture support" |
| 3 | default n | 3 | default n |
| 4 | depends on EXPERIMENTAL && !S390 | 4 | depends on EXPERIMENTAL && NET_ETHERNET && !S390 |
| 5 | select PHYLIB | 5 | select PHYLIB |
| 6 | ---help--- | 6 | ---help--- |
| 7 | This allows you to use hardware switch chips that use | 7 | This allows you to use hardware switch chips that use |
diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c index 757f25eb9b4b..7f6273506eea 100644 --- a/net/ipv4/ipmr.c +++ b/net/ipv4/ipmr.c | |||
| @@ -442,8 +442,10 @@ static netdev_tx_t reg_vif_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 442 | int err; | 442 | int err; |
| 443 | 443 | ||
| 444 | err = ipmr_fib_lookup(net, &fl, &mrt); | 444 | err = ipmr_fib_lookup(net, &fl, &mrt); |
| 445 | if (err < 0) | 445 | if (err < 0) { |
| 446 | kfree_skb(skb); | ||
| 446 | return err; | 447 | return err; |
| 448 | } | ||
| 447 | 449 | ||
| 448 | read_lock(&mrt_lock); | 450 | read_lock(&mrt_lock); |
| 449 | dev->stats.tx_bytes += skb->len; | 451 | dev->stats.tx_bytes += skb->len; |
| @@ -1728,8 +1730,10 @@ int ip_mr_input(struct sk_buff *skb) | |||
| 1728 | goto dont_forward; | 1730 | goto dont_forward; |
| 1729 | 1731 | ||
| 1730 | err = ipmr_fib_lookup(net, &skb_rtable(skb)->fl, &mrt); | 1732 | err = ipmr_fib_lookup(net, &skb_rtable(skb)->fl, &mrt); |
| 1731 | if (err < 0) | 1733 | if (err < 0) { |
| 1734 | kfree_skb(skb); | ||
| 1732 | return err; | 1735 | return err; |
| 1736 | } | ||
| 1733 | 1737 | ||
| 1734 | if (!local) { | 1738 | if (!local) { |
| 1735 | if (IPCB(skb)->opt.router_alert) { | 1739 | if (IPCB(skb)->opt.router_alert) { |
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 6596b4feeddc..65afeaec15b7 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
| @@ -608,6 +608,7 @@ ssize_t tcp_splice_read(struct socket *sock, loff_t *ppos, | |||
| 608 | ssize_t spliced; | 608 | ssize_t spliced; |
| 609 | int ret; | 609 | int ret; |
| 610 | 610 | ||
| 611 | sock_rps_record_flow(sk); | ||
| 611 | /* | 612 | /* |
| 612 | * We can't seek on a socket input | 613 | * We can't seek on a socket input |
| 613 | */ | 614 | */ |
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index b4ed957f201a..7ed9dc1042d1 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c | |||
| @@ -2208,6 +2208,9 @@ void tcp_xmit_retransmit_queue(struct sock *sk) | |||
| 2208 | int mib_idx; | 2208 | int mib_idx; |
| 2209 | int fwd_rexmitting = 0; | 2209 | int fwd_rexmitting = 0; |
| 2210 | 2210 | ||
| 2211 | if (!tp->packets_out) | ||
| 2212 | return; | ||
| 2213 | |||
| 2211 | if (!tp->lost_out) | 2214 | if (!tp->lost_out) |
| 2212 | tp->retransmit_high = tp->snd_una; | 2215 | tp->retransmit_high = tp->snd_una; |
| 2213 | 2216 | ||
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index e1a698df5706..784f34d11fdd 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
| @@ -1760,7 +1760,10 @@ static struct inet6_dev *addrconf_add_dev(struct net_device *dev) | |||
| 1760 | 1760 | ||
| 1761 | idev = ipv6_find_idev(dev); | 1761 | idev = ipv6_find_idev(dev); |
| 1762 | if (!idev) | 1762 | if (!idev) |
| 1763 | return NULL; | 1763 | return ERR_PTR(-ENOBUFS); |
| 1764 | |||
| 1765 | if (idev->cnf.disable_ipv6) | ||
| 1766 | return ERR_PTR(-EACCES); | ||
| 1764 | 1767 | ||
| 1765 | /* Add default multicast route */ | 1768 | /* Add default multicast route */ |
| 1766 | addrconf_add_mroute(dev); | 1769 | addrconf_add_mroute(dev); |
| @@ -2129,8 +2132,9 @@ static int inet6_addr_add(struct net *net, int ifindex, struct in6_addr *pfx, | |||
| 2129 | if (!dev) | 2132 | if (!dev) |
| 2130 | return -ENODEV; | 2133 | return -ENODEV; |
| 2131 | 2134 | ||
| 2132 | if ((idev = addrconf_add_dev(dev)) == NULL) | 2135 | idev = addrconf_add_dev(dev); |
| 2133 | return -ENOBUFS; | 2136 | if (IS_ERR(idev)) |
| 2137 | return PTR_ERR(idev); | ||
| 2134 | 2138 | ||
| 2135 | scope = ipv6_addr_scope(pfx); | 2139 | scope = ipv6_addr_scope(pfx); |
| 2136 | 2140 | ||
| @@ -2377,7 +2381,7 @@ static void addrconf_dev_config(struct net_device *dev) | |||
| 2377 | } | 2381 | } |
| 2378 | 2382 | ||
| 2379 | idev = addrconf_add_dev(dev); | 2383 | idev = addrconf_add_dev(dev); |
| 2380 | if (idev == NULL) | 2384 | if (IS_ERR(idev)) |
| 2381 | return; | 2385 | return; |
| 2382 | 2386 | ||
| 2383 | memset(&addr, 0, sizeof(struct in6_addr)); | 2387 | memset(&addr, 0, sizeof(struct in6_addr)); |
| @@ -2468,7 +2472,7 @@ static void addrconf_ip6_tnl_config(struct net_device *dev) | |||
| 2468 | ASSERT_RTNL(); | 2472 | ASSERT_RTNL(); |
| 2469 | 2473 | ||
| 2470 | idev = addrconf_add_dev(dev); | 2474 | idev = addrconf_add_dev(dev); |
| 2471 | if (!idev) { | 2475 | if (IS_ERR(idev)) { |
| 2472 | printk(KERN_DEBUG "init ip6-ip6: add_dev failed\n"); | 2476 | printk(KERN_DEBUG "init ip6-ip6: add_dev failed\n"); |
| 2473 | return; | 2477 | return; |
| 2474 | } | 2478 | } |
diff --git a/net/ipv6/mip6.c b/net/ipv6/mip6.c index 2794b6002836..d6e9599d0705 100644 --- a/net/ipv6/mip6.c +++ b/net/ipv6/mip6.c | |||
| @@ -347,11 +347,12 @@ static const struct xfrm_type mip6_destopt_type = | |||
| 347 | 347 | ||
| 348 | static int mip6_rthdr_input(struct xfrm_state *x, struct sk_buff *skb) | 348 | static int mip6_rthdr_input(struct xfrm_state *x, struct sk_buff *skb) |
| 349 | { | 349 | { |
| 350 | struct ipv6hdr *iph = ipv6_hdr(skb); | ||
| 350 | struct rt2_hdr *rt2 = (struct rt2_hdr *)skb->data; | 351 | struct rt2_hdr *rt2 = (struct rt2_hdr *)skb->data; |
| 351 | int err = rt2->rt_hdr.nexthdr; | 352 | int err = rt2->rt_hdr.nexthdr; |
| 352 | 353 | ||
| 353 | spin_lock(&x->lock); | 354 | spin_lock(&x->lock); |
| 354 | if (!ipv6_addr_equal(&rt2->addr, (struct in6_addr *)x->coaddr) && | 355 | if (!ipv6_addr_equal(&iph->daddr, (struct in6_addr *)x->coaddr) && |
| 355 | !ipv6_addr_any((struct in6_addr *)x->coaddr)) | 356 | !ipv6_addr_any((struct in6_addr *)x->coaddr)) |
| 356 | err = -ENOENT; | 357 | err = -ENOENT; |
| 357 | spin_unlock(&x->lock); | 358 | spin_unlock(&x->lock); |
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c index c7000a6ca379..67ee34f57df7 100644 --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c | |||
| @@ -632,7 +632,7 @@ static void ieee80211_send_layer2_update(struct sta_info *sta) | |||
| 632 | skb->dev = sta->sdata->dev; | 632 | skb->dev = sta->sdata->dev; |
| 633 | skb->protocol = eth_type_trans(skb, sta->sdata->dev); | 633 | skb->protocol = eth_type_trans(skb, sta->sdata->dev); |
| 634 | memset(skb->cb, 0, sizeof(skb->cb)); | 634 | memset(skb->cb, 0, sizeof(skb->cb)); |
| 635 | netif_rx(skb); | 635 | netif_rx_ni(skb); |
| 636 | } | 636 | } |
| 637 | 637 | ||
| 638 | static void sta_apply_parameters(struct ieee80211_local *local, | 638 | static void sta_apply_parameters(struct ieee80211_local *local, |
diff --git a/net/phonet/pep.c b/net/phonet/pep.c index 94d72e85a475..b2a3ae6cad78 100644 --- a/net/phonet/pep.c +++ b/net/phonet/pep.c | |||
| @@ -698,6 +698,7 @@ static struct sock *pep_sock_accept(struct sock *sk, int flags, int *errp) | |||
| 698 | newsk = NULL; | 698 | newsk = NULL; |
| 699 | goto out; | 699 | goto out; |
| 700 | } | 700 | } |
| 701 | kfree_skb(oskb); | ||
| 701 | 702 | ||
| 702 | sock_hold(sk); | 703 | sock_hold(sk); |
| 703 | pep_sk(newsk)->listener = sk; | 704 | pep_sk(newsk)->listener = sk; |
diff --git a/net/sched/act_mirred.c b/net/sched/act_mirred.c index c0b6863e3b87..1980b71c283f 100644 --- a/net/sched/act_mirred.c +++ b/net/sched/act_mirred.c | |||
| @@ -33,6 +33,7 @@ | |||
| 33 | static struct tcf_common *tcf_mirred_ht[MIRRED_TAB_MASK + 1]; | 33 | static struct tcf_common *tcf_mirred_ht[MIRRED_TAB_MASK + 1]; |
| 34 | static u32 mirred_idx_gen; | 34 | static u32 mirred_idx_gen; |
| 35 | static DEFINE_RWLOCK(mirred_lock); | 35 | static DEFINE_RWLOCK(mirred_lock); |
| 36 | static LIST_HEAD(mirred_list); | ||
| 36 | 37 | ||
| 37 | static struct tcf_hashinfo mirred_hash_info = { | 38 | static struct tcf_hashinfo mirred_hash_info = { |
| 38 | .htab = tcf_mirred_ht, | 39 | .htab = tcf_mirred_ht, |
| @@ -47,7 +48,9 @@ static inline int tcf_mirred_release(struct tcf_mirred *m, int bind) | |||
| 47 | m->tcf_bindcnt--; | 48 | m->tcf_bindcnt--; |
| 48 | m->tcf_refcnt--; | 49 | m->tcf_refcnt--; |
| 49 | if(!m->tcf_bindcnt && m->tcf_refcnt <= 0) { | 50 | if(!m->tcf_bindcnt && m->tcf_refcnt <= 0) { |
| 50 | dev_put(m->tcfm_dev); | 51 | list_del(&m->tcfm_list); |
| 52 | if (m->tcfm_dev) | ||
| 53 | dev_put(m->tcfm_dev); | ||
| 51 | tcf_hash_destroy(&m->common, &mirred_hash_info); | 54 | tcf_hash_destroy(&m->common, &mirred_hash_info); |
| 52 | return 1; | 55 | return 1; |
| 53 | } | 56 | } |
| @@ -134,8 +137,10 @@ static int tcf_mirred_init(struct nlattr *nla, struct nlattr *est, | |||
| 134 | m->tcfm_ok_push = ok_push; | 137 | m->tcfm_ok_push = ok_push; |
| 135 | } | 138 | } |
| 136 | spin_unlock_bh(&m->tcf_lock); | 139 | spin_unlock_bh(&m->tcf_lock); |
| 137 | if (ret == ACT_P_CREATED) | 140 | if (ret == ACT_P_CREATED) { |
| 141 | list_add(&m->tcfm_list, &mirred_list); | ||
| 138 | tcf_hash_insert(pc, &mirred_hash_info); | 142 | tcf_hash_insert(pc, &mirred_hash_info); |
| 143 | } | ||
| 139 | 144 | ||
| 140 | return ret; | 145 | return ret; |
| 141 | } | 146 | } |
| @@ -162,9 +167,14 @@ static int tcf_mirred(struct sk_buff *skb, struct tc_action *a, | |||
| 162 | m->tcf_tm.lastuse = jiffies; | 167 | m->tcf_tm.lastuse = jiffies; |
| 163 | 168 | ||
| 164 | dev = m->tcfm_dev; | 169 | dev = m->tcfm_dev; |
| 170 | if (!dev) { | ||
| 171 | printk_once(KERN_NOTICE "tc mirred: target device is gone\n"); | ||
| 172 | goto out; | ||
| 173 | } | ||
| 174 | |||
| 165 | if (!(dev->flags & IFF_UP)) { | 175 | if (!(dev->flags & IFF_UP)) { |
| 166 | if (net_ratelimit()) | 176 | if (net_ratelimit()) |
| 167 | pr_notice("tc mirred to Houston: device %s is gone!\n", | 177 | pr_notice("tc mirred to Houston: device %s is down\n", |
| 168 | dev->name); | 178 | dev->name); |
| 169 | goto out; | 179 | goto out; |
| 170 | } | 180 | } |
| @@ -232,6 +242,28 @@ nla_put_failure: | |||
| 232 | return -1; | 242 | return -1; |
| 233 | } | 243 | } |
| 234 | 244 | ||
| 245 | static int mirred_device_event(struct notifier_block *unused, | ||
| 246 | unsigned long event, void *ptr) | ||
| 247 | { | ||
| 248 | struct net_device *dev = ptr; | ||
| 249 | struct tcf_mirred *m; | ||
| 250 | |||
| 251 | if (event == NETDEV_UNREGISTER) | ||
| 252 | list_for_each_entry(m, &mirred_list, tcfm_list) { | ||
| 253 | if (m->tcfm_dev == dev) { | ||
| 254 | dev_put(dev); | ||
| 255 | m->tcfm_dev = NULL; | ||
| 256 | } | ||
| 257 | } | ||
| 258 | |||
| 259 | return NOTIFY_DONE; | ||
| 260 | } | ||
| 261 | |||
| 262 | static struct notifier_block mirred_device_notifier = { | ||
| 263 | .notifier_call = mirred_device_event, | ||
| 264 | }; | ||
| 265 | |||
| 266 | |||
| 235 | static struct tc_action_ops act_mirred_ops = { | 267 | static struct tc_action_ops act_mirred_ops = { |
| 236 | .kind = "mirred", | 268 | .kind = "mirred", |
| 237 | .hinfo = &mirred_hash_info, | 269 | .hinfo = &mirred_hash_info, |
| @@ -252,12 +284,17 @@ MODULE_LICENSE("GPL"); | |||
| 252 | 284 | ||
| 253 | static int __init mirred_init_module(void) | 285 | static int __init mirred_init_module(void) |
| 254 | { | 286 | { |
| 287 | int err = register_netdevice_notifier(&mirred_device_notifier); | ||
| 288 | if (err) | ||
| 289 | return err; | ||
| 290 | |||
| 255 | pr_info("Mirror/redirect action on\n"); | 291 | pr_info("Mirror/redirect action on\n"); |
| 256 | return tcf_register_action(&act_mirred_ops); | 292 | return tcf_register_action(&act_mirred_ops); |
| 257 | } | 293 | } |
| 258 | 294 | ||
| 259 | static void __exit mirred_cleanup_module(void) | 295 | static void __exit mirred_cleanup_module(void) |
| 260 | { | 296 | { |
| 297 | unregister_netdevice_notifier(&mirred_device_notifier); | ||
| 261 | tcf_unregister_action(&act_mirred_ops); | 298 | tcf_unregister_action(&act_mirred_ops); |
| 262 | } | 299 | } |
| 263 | 300 | ||
diff --git a/net/sched/act_nat.c b/net/sched/act_nat.c index 570949417f38..724553e8ed7b 100644 --- a/net/sched/act_nat.c +++ b/net/sched/act_nat.c | |||
| @@ -205,7 +205,7 @@ static int tcf_nat(struct sk_buff *skb, struct tc_action *a, | |||
| 205 | { | 205 | { |
| 206 | struct icmphdr *icmph; | 206 | struct icmphdr *icmph; |
| 207 | 207 | ||
| 208 | if (!pskb_may_pull(skb, ihl + sizeof(*icmph) + sizeof(*iph))) | 208 | if (!pskb_may_pull(skb, ihl + sizeof(*icmph))) |
| 209 | goto drop; | 209 | goto drop; |
| 210 | 210 | ||
| 211 | icmph = (void *)(skb_network_header(skb) + ihl); | 211 | icmph = (void *)(skb_network_header(skb) + ihl); |
| @@ -215,6 +215,9 @@ static int tcf_nat(struct sk_buff *skb, struct tc_action *a, | |||
| 215 | (icmph->type != ICMP_PARAMETERPROB)) | 215 | (icmph->type != ICMP_PARAMETERPROB)) |
| 216 | break; | 216 | break; |
| 217 | 217 | ||
| 218 | if (!pskb_may_pull(skb, ihl + sizeof(*icmph) + sizeof(*iph))) | ||
| 219 | goto drop; | ||
| 220 | |||
| 218 | iph = (void *)(icmph + 1); | 221 | iph = (void *)(icmph + 1); |
| 219 | if (egress) | 222 | if (egress) |
| 220 | addr = iph->daddr; | 223 | addr = iph->daddr; |
diff --git a/net/sunrpc/auth.c b/net/sunrpc/auth.c index 73affb8624fa..8dc47f1d0001 100644 --- a/net/sunrpc/auth.c +++ b/net/sunrpc/auth.c | |||
| @@ -267,7 +267,7 @@ rpcauth_prune_expired(struct list_head *free, int nr_to_scan) | |||
| 267 | * Run memory cache shrinker. | 267 | * Run memory cache shrinker. |
| 268 | */ | 268 | */ |
| 269 | static int | 269 | static int |
| 270 | rpcauth_cache_shrinker(int nr_to_scan, gfp_t gfp_mask) | 270 | rpcauth_cache_shrinker(struct shrinker *shrink, int nr_to_scan, gfp_t gfp_mask) |
| 271 | { | 271 | { |
| 272 | LIST_HEAD(free); | 272 | LIST_HEAD(free); |
| 273 | int res; | 273 | int res; |
diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c index af1c173be4ad..a7ec5a8a2380 100644 --- a/net/xfrm/xfrm_policy.c +++ b/net/xfrm/xfrm_policy.c | |||
| @@ -1594,8 +1594,8 @@ xfrm_resolve_and_create_bundle(struct xfrm_policy **pols, int num_pols, | |||
| 1594 | 1594 | ||
| 1595 | /* Try to instantiate a bundle */ | 1595 | /* Try to instantiate a bundle */ |
| 1596 | err = xfrm_tmpl_resolve(pols, num_pols, fl, xfrm, family); | 1596 | err = xfrm_tmpl_resolve(pols, num_pols, fl, xfrm, family); |
| 1597 | if (err < 0) { | 1597 | if (err <= 0) { |
| 1598 | if (err != -EAGAIN) | 1598 | if (err != 0 && err != -EAGAIN) |
| 1599 | XFRM_INC_STATS(net, LINUX_MIB_XFRMOUTPOLERROR); | 1599 | XFRM_INC_STATS(net, LINUX_MIB_XFRMOUTPOLERROR); |
| 1600 | return ERR_PTR(err); | 1600 | return ERR_PTR(err); |
| 1601 | } | 1601 | } |
| @@ -1678,6 +1678,13 @@ xfrm_bundle_lookup(struct net *net, struct flowi *fl, u16 family, u8 dir, | |||
| 1678 | goto make_dummy_bundle; | 1678 | goto make_dummy_bundle; |
| 1679 | dst_hold(&xdst->u.dst); | 1679 | dst_hold(&xdst->u.dst); |
| 1680 | return oldflo; | 1680 | return oldflo; |
| 1681 | } else if (new_xdst == NULL) { | ||
| 1682 | num_xfrms = 0; | ||
| 1683 | if (oldflo == NULL) | ||
| 1684 | goto make_dummy_bundle; | ||
| 1685 | xdst->num_xfrms = 0; | ||
| 1686 | dst_hold(&xdst->u.dst); | ||
| 1687 | return oldflo; | ||
| 1681 | } | 1688 | } |
| 1682 | 1689 | ||
| 1683 | /* Kill the previous bundle */ | 1690 | /* Kill the previous bundle */ |
| @@ -1760,6 +1767,10 @@ restart: | |||
| 1760 | xfrm_pols_put(pols, num_pols); | 1767 | xfrm_pols_put(pols, num_pols); |
| 1761 | err = PTR_ERR(xdst); | 1768 | err = PTR_ERR(xdst); |
| 1762 | goto dropdst; | 1769 | goto dropdst; |
| 1770 | } else if (xdst == NULL) { | ||
| 1771 | num_xfrms = 0; | ||
| 1772 | drop_pols = num_pols; | ||
| 1773 | goto no_transform; | ||
| 1763 | } | 1774 | } |
| 1764 | 1775 | ||
| 1765 | spin_lock_bh(&xfrm_policy_sk_bundle_lock); | 1776 | spin_lock_bh(&xfrm_policy_sk_bundle_lock); |
