diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2017-06-21 03:07:52 -0400 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2017-06-21 03:07:52 -0400 |
commit | f0cd9ae5d0df8668e76359a3e0e99856aa9c53b9 (patch) | |
tree | 84d3297b16fa7e373f2eabef56cd12ae5a9b8a29 /net | |
parent | 098b0e01a91c42aaaf0425605cd126b03fcb0bcf (diff) | |
parent | 8e6cec1c7c5afa489687c90be15d6ed82c742975 (diff) |
Merge branch 'timers/urgent' into timers/core
Pick up dependent changes.
Diffstat (limited to 'net')
76 files changed, 409 insertions, 338 deletions
diff --git a/net/8021q/vlan_dev.c b/net/8021q/vlan_dev.c index 953b6728bd00..abc5f400fc71 100644 --- a/net/8021q/vlan_dev.c +++ b/net/8021q/vlan_dev.c | |||
@@ -813,7 +813,6 @@ static void vlan_dev_free(struct net_device *dev) | |||
813 | 813 | ||
814 | free_percpu(vlan->vlan_pcpu_stats); | 814 | free_percpu(vlan->vlan_pcpu_stats); |
815 | vlan->vlan_pcpu_stats = NULL; | 815 | vlan->vlan_pcpu_stats = NULL; |
816 | free_netdev(dev); | ||
817 | } | 816 | } |
818 | 817 | ||
819 | void vlan_setup(struct net_device *dev) | 818 | void vlan_setup(struct net_device *dev) |
@@ -826,7 +825,8 @@ void vlan_setup(struct net_device *dev) | |||
826 | netif_keep_dst(dev); | 825 | netif_keep_dst(dev); |
827 | 826 | ||
828 | dev->netdev_ops = &vlan_netdev_ops; | 827 | dev->netdev_ops = &vlan_netdev_ops; |
829 | dev->destructor = vlan_dev_free; | 828 | dev->needs_free_netdev = true; |
829 | dev->priv_destructor = vlan_dev_free; | ||
830 | dev->ethtool_ops = &vlan_ethtool_ops; | 830 | dev->ethtool_ops = &vlan_ethtool_ops; |
831 | 831 | ||
832 | dev->min_mtu = 0; | 832 | dev->min_mtu = 0; |
diff --git a/net/batman-adv/distributed-arp-table.c b/net/batman-adv/distributed-arp-table.c index 013e970eff39..000ca2f113ab 100644 --- a/net/batman-adv/distributed-arp-table.c +++ b/net/batman-adv/distributed-arp-table.c | |||
@@ -1064,8 +1064,9 @@ bool batadv_dat_snoop_outgoing_arp_request(struct batadv_priv *bat_priv, | |||
1064 | 1064 | ||
1065 | skb_new->protocol = eth_type_trans(skb_new, soft_iface); | 1065 | skb_new->protocol = eth_type_trans(skb_new, soft_iface); |
1066 | 1066 | ||
1067 | soft_iface->stats.rx_packets++; | 1067 | batadv_inc_counter(bat_priv, BATADV_CNT_RX); |
1068 | soft_iface->stats.rx_bytes += skb->len + ETH_HLEN + hdr_size; | 1068 | batadv_add_counter(bat_priv, BATADV_CNT_RX_BYTES, |
1069 | skb->len + ETH_HLEN + hdr_size); | ||
1069 | 1070 | ||
1070 | netif_rx(skb_new); | 1071 | netif_rx(skb_new); |
1071 | batadv_dbg(BATADV_DBG_DAT, bat_priv, "ARP request replied locally\n"); | 1072 | batadv_dbg(BATADV_DBG_DAT, bat_priv, "ARP request replied locally\n"); |
diff --git a/net/batman-adv/routing.c b/net/batman-adv/routing.c index e1ebe14ee2a6..ae9f4d37d34f 100644 --- a/net/batman-adv/routing.c +++ b/net/batman-adv/routing.c | |||
@@ -987,7 +987,7 @@ int batadv_recv_unicast_packet(struct sk_buff *skb, | |||
987 | batadv_dbg(BATADV_DBG_BLA, bat_priv, | 987 | batadv_dbg(BATADV_DBG_BLA, bat_priv, |
988 | "recv_unicast_packet(): Dropped unicast pkt received from another backbone gw %pM.\n", | 988 | "recv_unicast_packet(): Dropped unicast pkt received from another backbone gw %pM.\n", |
989 | orig_addr_gw); | 989 | orig_addr_gw); |
990 | return NET_RX_DROP; | 990 | goto free_skb; |
991 | } | 991 | } |
992 | } | 992 | } |
993 | 993 | ||
diff --git a/net/batman-adv/soft-interface.c b/net/batman-adv/soft-interface.c index b25789abf7b9..10f7edfb176e 100644 --- a/net/batman-adv/soft-interface.c +++ b/net/batman-adv/soft-interface.c | |||
@@ -1034,8 +1034,6 @@ static void batadv_softif_free(struct net_device *dev) | |||
1034 | * netdev and its private data (bat_priv) | 1034 | * netdev and its private data (bat_priv) |
1035 | */ | 1035 | */ |
1036 | rcu_barrier(); | 1036 | rcu_barrier(); |
1037 | |||
1038 | free_netdev(dev); | ||
1039 | } | 1037 | } |
1040 | 1038 | ||
1041 | /** | 1039 | /** |
@@ -1047,7 +1045,8 @@ static void batadv_softif_init_early(struct net_device *dev) | |||
1047 | ether_setup(dev); | 1045 | ether_setup(dev); |
1048 | 1046 | ||
1049 | dev->netdev_ops = &batadv_netdev_ops; | 1047 | dev->netdev_ops = &batadv_netdev_ops; |
1050 | dev->destructor = batadv_softif_free; | 1048 | dev->needs_free_netdev = true; |
1049 | dev->priv_destructor = batadv_softif_free; | ||
1051 | dev->features |= NETIF_F_HW_VLAN_CTAG_FILTER | NETIF_F_NETNS_LOCAL; | 1050 | dev->features |= NETIF_F_HW_VLAN_CTAG_FILTER | NETIF_F_NETNS_LOCAL; |
1052 | dev->priv_flags |= IFF_NO_QUEUE; | 1051 | dev->priv_flags |= IFF_NO_QUEUE; |
1053 | 1052 | ||
diff --git a/net/bluetooth/6lowpan.c b/net/bluetooth/6lowpan.c index 608959989f8e..ab3b654b05cc 100644 --- a/net/bluetooth/6lowpan.c +++ b/net/bluetooth/6lowpan.c | |||
@@ -598,7 +598,7 @@ static void netdev_setup(struct net_device *dev) | |||
598 | 598 | ||
599 | dev->netdev_ops = &netdev_ops; | 599 | dev->netdev_ops = &netdev_ops; |
600 | dev->header_ops = &header_ops; | 600 | dev->header_ops = &header_ops; |
601 | dev->destructor = free_netdev; | 601 | dev->needs_free_netdev = true; |
602 | } | 602 | } |
603 | 603 | ||
604 | static struct device_type bt_type = { | 604 | static struct device_type bt_type = { |
diff --git a/net/bridge/br_device.c b/net/bridge/br_device.c index 430b53e7d941..f0f3447e8aa4 100644 --- a/net/bridge/br_device.c +++ b/net/bridge/br_device.c | |||
@@ -379,7 +379,7 @@ void br_dev_setup(struct net_device *dev) | |||
379 | ether_setup(dev); | 379 | ether_setup(dev); |
380 | 380 | ||
381 | dev->netdev_ops = &br_netdev_ops; | 381 | dev->netdev_ops = &br_netdev_ops; |
382 | dev->destructor = free_netdev; | 382 | dev->needs_free_netdev = true; |
383 | dev->ethtool_ops = &br_ethtool_ops; | 383 | dev->ethtool_ops = &br_ethtool_ops; |
384 | SET_NETDEV_DEVTYPE(dev, &br_type); | 384 | SET_NETDEV_DEVTYPE(dev, &br_type); |
385 | dev->priv_flags = IFF_EBRIDGE | IFF_NO_QUEUE; | 385 | dev->priv_flags = IFF_EBRIDGE | IFF_NO_QUEUE; |
diff --git a/net/bridge/br_netlink.c b/net/bridge/br_netlink.c index 574f78824d8a..32bd3ead9ba1 100644 --- a/net/bridge/br_netlink.c +++ b/net/bridge/br_netlink.c | |||
@@ -595,7 +595,7 @@ static int br_afspec(struct net_bridge *br, | |||
595 | err = 0; | 595 | err = 0; |
596 | switch (nla_type(attr)) { | 596 | switch (nla_type(attr)) { |
597 | case IFLA_BRIDGE_VLAN_TUNNEL_INFO: | 597 | case IFLA_BRIDGE_VLAN_TUNNEL_INFO: |
598 | if (!(p->flags & BR_VLAN_TUNNEL)) | 598 | if (!p || !(p->flags & BR_VLAN_TUNNEL)) |
599 | return -EINVAL; | 599 | return -EINVAL; |
600 | err = br_parse_vlan_tunnel_info(attr, &tinfo_curr); | 600 | err = br_parse_vlan_tunnel_info(attr, &tinfo_curr); |
601 | if (err) | 601 | if (err) |
diff --git a/net/bridge/br_stp_if.c b/net/bridge/br_stp_if.c index 0db8102995a5..6f12a5271219 100644 --- a/net/bridge/br_stp_if.c +++ b/net/bridge/br_stp_if.c | |||
@@ -179,7 +179,8 @@ static void br_stp_start(struct net_bridge *br) | |||
179 | br_debug(br, "using kernel STP\n"); | 179 | br_debug(br, "using kernel STP\n"); |
180 | 180 | ||
181 | /* To start timers on any ports left in blocking */ | 181 | /* To start timers on any ports left in blocking */ |
182 | mod_timer(&br->hello_timer, jiffies + br->hello_time); | 182 | if (br->dev->flags & IFF_UP) |
183 | mod_timer(&br->hello_timer, jiffies + br->hello_time); | ||
183 | br_port_state_selection(br); | 184 | br_port_state_selection(br); |
184 | } | 185 | } |
185 | 186 | ||
diff --git a/net/caif/caif_socket.c b/net/caif/caif_socket.c index adcad344c843..21f18ea2fce4 100644 --- a/net/caif/caif_socket.c +++ b/net/caif/caif_socket.c | |||
@@ -754,6 +754,10 @@ static int caif_connect(struct socket *sock, struct sockaddr *uaddr, | |||
754 | 754 | ||
755 | lock_sock(sk); | 755 | lock_sock(sk); |
756 | 756 | ||
757 | err = -EINVAL; | ||
758 | if (addr_len < offsetofend(struct sockaddr, sa_family)) | ||
759 | goto out; | ||
760 | |||
757 | err = -EAFNOSUPPORT; | 761 | err = -EAFNOSUPPORT; |
758 | if (uaddr->sa_family != AF_CAIF) | 762 | if (uaddr->sa_family != AF_CAIF) |
759 | goto out; | 763 | goto out; |
diff --git a/net/caif/cfpkt_skbuff.c b/net/caif/cfpkt_skbuff.c index 59ce1fcc220c..71b6ab240dea 100644 --- a/net/caif/cfpkt_skbuff.c +++ b/net/caif/cfpkt_skbuff.c | |||
@@ -81,11 +81,7 @@ static struct cfpkt *cfpkt_create_pfx(u16 len, u16 pfx) | |||
81 | { | 81 | { |
82 | struct sk_buff *skb; | 82 | struct sk_buff *skb; |
83 | 83 | ||
84 | if (likely(in_interrupt())) | 84 | skb = alloc_skb(len + pfx, GFP_ATOMIC); |
85 | skb = alloc_skb(len + pfx, GFP_ATOMIC); | ||
86 | else | ||
87 | skb = alloc_skb(len + pfx, GFP_KERNEL); | ||
88 | |||
89 | if (unlikely(skb == NULL)) | 85 | if (unlikely(skb == NULL)) |
90 | return NULL; | 86 | return NULL; |
91 | 87 | ||
diff --git a/net/caif/chnl_net.c b/net/caif/chnl_net.c index 1816fc9f1ee7..fe3c53efb949 100644 --- a/net/caif/chnl_net.c +++ b/net/caif/chnl_net.c | |||
@@ -392,14 +392,14 @@ static void chnl_net_destructor(struct net_device *dev) | |||
392 | { | 392 | { |
393 | struct chnl_net *priv = netdev_priv(dev); | 393 | struct chnl_net *priv = netdev_priv(dev); |
394 | caif_free_client(&priv->chnl); | 394 | caif_free_client(&priv->chnl); |
395 | free_netdev(dev); | ||
396 | } | 395 | } |
397 | 396 | ||
398 | static void ipcaif_net_setup(struct net_device *dev) | 397 | static void ipcaif_net_setup(struct net_device *dev) |
399 | { | 398 | { |
400 | struct chnl_net *priv; | 399 | struct chnl_net *priv; |
401 | dev->netdev_ops = &netdev_ops; | 400 | dev->netdev_ops = &netdev_ops; |
402 | dev->destructor = chnl_net_destructor; | 401 | dev->needs_free_netdev = true; |
402 | dev->priv_destructor = chnl_net_destructor; | ||
403 | dev->flags |= IFF_NOARP; | 403 | dev->flags |= IFF_NOARP; |
404 | dev->flags |= IFF_POINTOPOINT; | 404 | dev->flags |= IFF_POINTOPOINT; |
405 | dev->mtu = GPRS_PDP_MTU; | 405 | dev->mtu = GPRS_PDP_MTU; |
diff --git a/net/can/af_can.c b/net/can/af_can.c index b6406fe33c76..88edac0f3e36 100644 --- a/net/can/af_can.c +++ b/net/can/af_can.c | |||
@@ -872,8 +872,7 @@ static int can_notifier(struct notifier_block *nb, unsigned long msg, | |||
872 | 872 | ||
873 | static int can_pernet_init(struct net *net) | 873 | static int can_pernet_init(struct net *net) |
874 | { | 874 | { |
875 | net->can.can_rcvlists_lock = | 875 | spin_lock_init(&net->can.can_rcvlists_lock); |
876 | __SPIN_LOCK_UNLOCKED(net->can.can_rcvlists_lock); | ||
877 | net->can.can_rx_alldev_list = | 876 | net->can.can_rx_alldev_list = |
878 | kzalloc(sizeof(struct dev_rcv_lists), GFP_KERNEL); | 877 | kzalloc(sizeof(struct dev_rcv_lists), GFP_KERNEL); |
879 | 878 | ||
diff --git a/net/core/dev.c b/net/core/dev.c index fca407b4a6ea..6d60149287a1 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -1253,8 +1253,9 @@ int dev_set_alias(struct net_device *dev, const char *alias, size_t len) | |||
1253 | if (!new_ifalias) | 1253 | if (!new_ifalias) |
1254 | return -ENOMEM; | 1254 | return -ENOMEM; |
1255 | dev->ifalias = new_ifalias; | 1255 | dev->ifalias = new_ifalias; |
1256 | memcpy(dev->ifalias, alias, len); | ||
1257 | dev->ifalias[len] = 0; | ||
1256 | 1258 | ||
1257 | strlcpy(dev->ifalias, alias, len+1); | ||
1258 | return len; | 1259 | return len; |
1259 | } | 1260 | } |
1260 | 1261 | ||
@@ -4948,6 +4949,19 @@ __sum16 __skb_gro_checksum_complete(struct sk_buff *skb) | |||
4948 | } | 4949 | } |
4949 | EXPORT_SYMBOL(__skb_gro_checksum_complete); | 4950 | EXPORT_SYMBOL(__skb_gro_checksum_complete); |
4950 | 4951 | ||
4952 | static void net_rps_send_ipi(struct softnet_data *remsd) | ||
4953 | { | ||
4954 | #ifdef CONFIG_RPS | ||
4955 | while (remsd) { | ||
4956 | struct softnet_data *next = remsd->rps_ipi_next; | ||
4957 | |||
4958 | if (cpu_online(remsd->cpu)) | ||
4959 | smp_call_function_single_async(remsd->cpu, &remsd->csd); | ||
4960 | remsd = next; | ||
4961 | } | ||
4962 | #endif | ||
4963 | } | ||
4964 | |||
4951 | /* | 4965 | /* |
4952 | * net_rps_action_and_irq_enable sends any pending IPI's for rps. | 4966 | * net_rps_action_and_irq_enable sends any pending IPI's for rps. |
4953 | * Note: called with local irq disabled, but exits with local irq enabled. | 4967 | * Note: called with local irq disabled, but exits with local irq enabled. |
@@ -4963,14 +4977,7 @@ static void net_rps_action_and_irq_enable(struct softnet_data *sd) | |||
4963 | local_irq_enable(); | 4977 | local_irq_enable(); |
4964 | 4978 | ||
4965 | /* Send pending IPI's to kick RPS processing on remote cpus. */ | 4979 | /* Send pending IPI's to kick RPS processing on remote cpus. */ |
4966 | while (remsd) { | 4980 | net_rps_send_ipi(remsd); |
4967 | struct softnet_data *next = remsd->rps_ipi_next; | ||
4968 | |||
4969 | if (cpu_online(remsd->cpu)) | ||
4970 | smp_call_function_single_async(remsd->cpu, | ||
4971 | &remsd->csd); | ||
4972 | remsd = next; | ||
4973 | } | ||
4974 | } else | 4981 | } else |
4975 | #endif | 4982 | #endif |
4976 | local_irq_enable(); | 4983 | local_irq_enable(); |
@@ -7501,6 +7508,8 @@ out: | |||
7501 | err_uninit: | 7508 | err_uninit: |
7502 | if (dev->netdev_ops->ndo_uninit) | 7509 | if (dev->netdev_ops->ndo_uninit) |
7503 | dev->netdev_ops->ndo_uninit(dev); | 7510 | dev->netdev_ops->ndo_uninit(dev); |
7511 | if (dev->priv_destructor) | ||
7512 | dev->priv_destructor(dev); | ||
7504 | goto out; | 7513 | goto out; |
7505 | } | 7514 | } |
7506 | EXPORT_SYMBOL(register_netdevice); | 7515 | EXPORT_SYMBOL(register_netdevice); |
@@ -7708,8 +7717,10 @@ void netdev_run_todo(void) | |||
7708 | WARN_ON(rcu_access_pointer(dev->ip6_ptr)); | 7717 | WARN_ON(rcu_access_pointer(dev->ip6_ptr)); |
7709 | WARN_ON(dev->dn_ptr); | 7718 | WARN_ON(dev->dn_ptr); |
7710 | 7719 | ||
7711 | if (dev->destructor) | 7720 | if (dev->priv_destructor) |
7712 | dev->destructor(dev); | 7721 | dev->priv_destructor(dev); |
7722 | if (dev->needs_free_netdev) | ||
7723 | free_netdev(dev); | ||
7713 | 7724 | ||
7714 | /* Report a network device has been unregistered */ | 7725 | /* Report a network device has been unregistered */ |
7715 | rtnl_lock(); | 7726 | rtnl_lock(); |
@@ -8192,7 +8203,7 @@ static int dev_cpu_dead(unsigned int oldcpu) | |||
8192 | struct sk_buff **list_skb; | 8203 | struct sk_buff **list_skb; |
8193 | struct sk_buff *skb; | 8204 | struct sk_buff *skb; |
8194 | unsigned int cpu; | 8205 | unsigned int cpu; |
8195 | struct softnet_data *sd, *oldsd; | 8206 | struct softnet_data *sd, *oldsd, *remsd = NULL; |
8196 | 8207 | ||
8197 | local_irq_disable(); | 8208 | local_irq_disable(); |
8198 | cpu = smp_processor_id(); | 8209 | cpu = smp_processor_id(); |
@@ -8233,6 +8244,13 @@ static int dev_cpu_dead(unsigned int oldcpu) | |||
8233 | raise_softirq_irqoff(NET_TX_SOFTIRQ); | 8244 | raise_softirq_irqoff(NET_TX_SOFTIRQ); |
8234 | local_irq_enable(); | 8245 | local_irq_enable(); |
8235 | 8246 | ||
8247 | #ifdef CONFIG_RPS | ||
8248 | remsd = oldsd->rps_ipi_list; | ||
8249 | oldsd->rps_ipi_list = NULL; | ||
8250 | #endif | ||
8251 | /* send out pending IPI's on offline CPU */ | ||
8252 | net_rps_send_ipi(remsd); | ||
8253 | |||
8236 | /* Process offline CPU's input_pkt_queue */ | 8254 | /* Process offline CPU's input_pkt_queue */ |
8237 | while ((skb = __skb_dequeue(&oldsd->process_queue))) { | 8255 | while ((skb = __skb_dequeue(&oldsd->process_queue))) { |
8238 | netif_rx_ni(skb); | 8256 | netif_rx_ni(skb); |
diff --git a/net/core/devlink.c b/net/core/devlink.c index b0b87a292e7c..a0adfc31a3fe 100644 --- a/net/core/devlink.c +++ b/net/core/devlink.c | |||
@@ -1680,8 +1680,10 @@ start_again: | |||
1680 | 1680 | ||
1681 | hdr = genlmsg_put(skb, info->snd_portid, info->snd_seq, | 1681 | hdr = genlmsg_put(skb, info->snd_portid, info->snd_seq, |
1682 | &devlink_nl_family, NLM_F_MULTI, cmd); | 1682 | &devlink_nl_family, NLM_F_MULTI, cmd); |
1683 | if (!hdr) | 1683 | if (!hdr) { |
1684 | nlmsg_free(skb); | ||
1684 | return -EMSGSIZE; | 1685 | return -EMSGSIZE; |
1686 | } | ||
1685 | 1687 | ||
1686 | if (devlink_nl_put_handle(skb, devlink)) | 1688 | if (devlink_nl_put_handle(skb, devlink)) |
1687 | goto nla_put_failure; | 1689 | goto nla_put_failure; |
@@ -2098,8 +2100,10 @@ start_again: | |||
2098 | 2100 | ||
2099 | hdr = genlmsg_put(skb, info->snd_portid, info->snd_seq, | 2101 | hdr = genlmsg_put(skb, info->snd_portid, info->snd_seq, |
2100 | &devlink_nl_family, NLM_F_MULTI, cmd); | 2102 | &devlink_nl_family, NLM_F_MULTI, cmd); |
2101 | if (!hdr) | 2103 | if (!hdr) { |
2104 | nlmsg_free(skb); | ||
2102 | return -EMSGSIZE; | 2105 | return -EMSGSIZE; |
2106 | } | ||
2103 | 2107 | ||
2104 | if (devlink_nl_put_handle(skb, devlink)) | 2108 | if (devlink_nl_put_handle(skb, devlink)) |
2105 | goto nla_put_failure; | 2109 | goto nla_put_failure; |
diff --git a/net/core/dst.c b/net/core/dst.c index 6192f11beec9..13ba4a090c41 100644 --- a/net/core/dst.c +++ b/net/core/dst.c | |||
@@ -469,6 +469,20 @@ static int dst_dev_event(struct notifier_block *this, unsigned long event, | |||
469 | spin_lock_bh(&dst_garbage.lock); | 469 | spin_lock_bh(&dst_garbage.lock); |
470 | dst = dst_garbage.list; | 470 | dst = dst_garbage.list; |
471 | dst_garbage.list = NULL; | 471 | dst_garbage.list = NULL; |
472 | /* The code in dst_ifdown places a hold on the loopback device. | ||
473 | * If the gc entry processing is set to expire after a lengthy | ||
474 | * interval, this hold can cause netdev_wait_allrefs() to hang | ||
475 | * out and wait for a long time -- until the the loopback | ||
476 | * interface is released. If we're really unlucky, it'll emit | ||
477 | * pr_emerg messages to console too. Reset the interval here, | ||
478 | * so dst cleanups occur in a more timely fashion. | ||
479 | */ | ||
480 | if (dst_garbage.timer_inc > DST_GC_INC) { | ||
481 | dst_garbage.timer_inc = DST_GC_INC; | ||
482 | dst_garbage.timer_expires = DST_GC_MIN; | ||
483 | mod_delayed_work(system_wq, &dst_gc_work, | ||
484 | dst_garbage.timer_expires); | ||
485 | } | ||
472 | spin_unlock_bh(&dst_garbage.lock); | 486 | spin_unlock_bh(&dst_garbage.lock); |
473 | 487 | ||
474 | if (last) | 488 | if (last) |
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 9e2c0a7cb325..5e61456f6bc7 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c | |||
@@ -1124,6 +1124,8 @@ static noinline_for_stack int rtnl_fill_vfinfo(struct sk_buff *skb, | |||
1124 | struct ifla_vf_mac vf_mac; | 1124 | struct ifla_vf_mac vf_mac; |
1125 | struct ifla_vf_info ivi; | 1125 | struct ifla_vf_info ivi; |
1126 | 1126 | ||
1127 | memset(&ivi, 0, sizeof(ivi)); | ||
1128 | |||
1127 | /* Not all SR-IOV capable drivers support the | 1129 | /* Not all SR-IOV capable drivers support the |
1128 | * spoofcheck and "RSS query enable" query. Preset to | 1130 | * spoofcheck and "RSS query enable" query. Preset to |
1129 | * -1 so the user space tool can detect that the driver | 1131 | * -1 so the user space tool can detect that the driver |
@@ -1132,7 +1134,6 @@ static noinline_for_stack int rtnl_fill_vfinfo(struct sk_buff *skb, | |||
1132 | ivi.spoofchk = -1; | 1134 | ivi.spoofchk = -1; |
1133 | ivi.rss_query_en = -1; | 1135 | ivi.rss_query_en = -1; |
1134 | ivi.trusted = -1; | 1136 | ivi.trusted = -1; |
1135 | memset(ivi.mac, 0, sizeof(ivi.mac)); | ||
1136 | /* The default value for VF link state is "auto" | 1137 | /* The default value for VF link state is "auto" |
1137 | * IFLA_VF_LINK_STATE_AUTO which equals zero | 1138 | * IFLA_VF_LINK_STATE_AUTO which equals zero |
1138 | */ | 1139 | */ |
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 346d3e85dfbc..b1be7c01efe2 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c | |||
@@ -3754,8 +3754,11 @@ struct sk_buff *sock_dequeue_err_skb(struct sock *sk) | |||
3754 | 3754 | ||
3755 | spin_lock_irqsave(&q->lock, flags); | 3755 | spin_lock_irqsave(&q->lock, flags); |
3756 | skb = __skb_dequeue(q); | 3756 | skb = __skb_dequeue(q); |
3757 | if (skb && (skb_next = skb_peek(q))) | 3757 | if (skb && (skb_next = skb_peek(q))) { |
3758 | icmp_next = is_icmp_err_skb(skb_next); | 3758 | icmp_next = is_icmp_err_skb(skb_next); |
3759 | if (icmp_next) | ||
3760 | sk->sk_err = SKB_EXT_ERR(skb_next)->ee.ee_origin; | ||
3761 | } | ||
3759 | spin_unlock_irqrestore(&q->lock, flags); | 3762 | spin_unlock_irqrestore(&q->lock, flags); |
3760 | 3763 | ||
3761 | if (is_icmp_err_skb(skb) && !icmp_next) | 3764 | if (is_icmp_err_skb(skb) && !icmp_next) |
diff --git a/net/decnet/netfilter/dn_rtmsg.c b/net/decnet/netfilter/dn_rtmsg.c index 1ed81ac6dd1a..aa8ffecc46a4 100644 --- a/net/decnet/netfilter/dn_rtmsg.c +++ b/net/decnet/netfilter/dn_rtmsg.c | |||
@@ -102,7 +102,9 @@ static inline void dnrmg_receive_user_skb(struct sk_buff *skb) | |||
102 | { | 102 | { |
103 | struct nlmsghdr *nlh = nlmsg_hdr(skb); | 103 | struct nlmsghdr *nlh = nlmsg_hdr(skb); |
104 | 104 | ||
105 | if (nlh->nlmsg_len < sizeof(*nlh) || skb->len < nlh->nlmsg_len) | 105 | if (skb->len < sizeof(*nlh) || |
106 | nlh->nlmsg_len < sizeof(*nlh) || | ||
107 | skb->len < nlh->nlmsg_len) | ||
106 | return; | 108 | return; |
107 | 109 | ||
108 | if (!netlink_capable(skb, CAP_NET_ADMIN)) | 110 | if (!netlink_capable(skb, CAP_NET_ADMIN)) |
diff --git a/net/dsa/dsa.c b/net/dsa/dsa.c index 26130ae438da..90038d45a547 100644 --- a/net/dsa/dsa.c +++ b/net/dsa/dsa.c | |||
@@ -223,6 +223,53 @@ static int dsa_switch_rcv(struct sk_buff *skb, struct net_device *dev, | |||
223 | return 0; | 223 | return 0; |
224 | } | 224 | } |
225 | 225 | ||
226 | #ifdef CONFIG_PM_SLEEP | ||
227 | int dsa_switch_suspend(struct dsa_switch *ds) | ||
228 | { | ||
229 | int i, ret = 0; | ||
230 | |||
231 | /* Suspend slave network devices */ | ||
232 | for (i = 0; i < ds->num_ports; i++) { | ||
233 | if (!dsa_is_port_initialized(ds, i)) | ||
234 | continue; | ||
235 | |||
236 | ret = dsa_slave_suspend(ds->ports[i].netdev); | ||
237 | if (ret) | ||
238 | return ret; | ||
239 | } | ||
240 | |||
241 | if (ds->ops->suspend) | ||
242 | ret = ds->ops->suspend(ds); | ||
243 | |||
244 | return ret; | ||
245 | } | ||
246 | EXPORT_SYMBOL_GPL(dsa_switch_suspend); | ||
247 | |||
248 | int dsa_switch_resume(struct dsa_switch *ds) | ||
249 | { | ||
250 | int i, ret = 0; | ||
251 | |||
252 | if (ds->ops->resume) | ||
253 | ret = ds->ops->resume(ds); | ||
254 | |||
255 | if (ret) | ||
256 | return ret; | ||
257 | |||
258 | /* Resume slave network devices */ | ||
259 | for (i = 0; i < ds->num_ports; i++) { | ||
260 | if (!dsa_is_port_initialized(ds, i)) | ||
261 | continue; | ||
262 | |||
263 | ret = dsa_slave_resume(ds->ports[i].netdev); | ||
264 | if (ret) | ||
265 | return ret; | ||
266 | } | ||
267 | |||
268 | return 0; | ||
269 | } | ||
270 | EXPORT_SYMBOL_GPL(dsa_switch_resume); | ||
271 | #endif | ||
272 | |||
226 | static struct packet_type dsa_pack_type __read_mostly = { | 273 | static struct packet_type dsa_pack_type __read_mostly = { |
227 | .type = cpu_to_be16(ETH_P_XDSA), | 274 | .type = cpu_to_be16(ETH_P_XDSA), |
228 | .func = dsa_switch_rcv, | 275 | .func = dsa_switch_rcv, |
diff --git a/net/dsa/dsa2.c b/net/dsa/dsa2.c index 033b3bfb63dc..7796580e99ee 100644 --- a/net/dsa/dsa2.c +++ b/net/dsa/dsa2.c | |||
@@ -484,8 +484,10 @@ static void dsa_dst_unapply(struct dsa_switch_tree *dst) | |||
484 | dsa_ds_unapply(dst, ds); | 484 | dsa_ds_unapply(dst, ds); |
485 | } | 485 | } |
486 | 486 | ||
487 | if (dst->cpu_switch) | 487 | if (dst->cpu_switch) { |
488 | dsa_cpu_port_ethtool_restore(dst->cpu_switch); | 488 | dsa_cpu_port_ethtool_restore(dst->cpu_switch); |
489 | dst->cpu_switch = NULL; | ||
490 | } | ||
489 | 491 | ||
490 | pr_info("DSA: tree %d unapplied\n", dst->tree); | 492 | pr_info("DSA: tree %d unapplied\n", dst->tree); |
491 | dst->applied = false; | 493 | dst->applied = false; |
diff --git a/net/dsa/legacy.c b/net/dsa/legacy.c index ad345c8b0b06..7281098df04e 100644 --- a/net/dsa/legacy.c +++ b/net/dsa/legacy.c | |||
@@ -289,53 +289,6 @@ static void dsa_switch_destroy(struct dsa_switch *ds) | |||
289 | dsa_switch_unregister_notifier(ds); | 289 | dsa_switch_unregister_notifier(ds); |
290 | } | 290 | } |
291 | 291 | ||
292 | #ifdef CONFIG_PM_SLEEP | ||
293 | int dsa_switch_suspend(struct dsa_switch *ds) | ||
294 | { | ||
295 | int i, ret = 0; | ||
296 | |||
297 | /* Suspend slave network devices */ | ||
298 | for (i = 0; i < ds->num_ports; i++) { | ||
299 | if (!dsa_is_port_initialized(ds, i)) | ||
300 | continue; | ||
301 | |||
302 | ret = dsa_slave_suspend(ds->ports[i].netdev); | ||
303 | if (ret) | ||
304 | return ret; | ||
305 | } | ||
306 | |||
307 | if (ds->ops->suspend) | ||
308 | ret = ds->ops->suspend(ds); | ||
309 | |||
310 | return ret; | ||
311 | } | ||
312 | EXPORT_SYMBOL_GPL(dsa_switch_suspend); | ||
313 | |||
314 | int dsa_switch_resume(struct dsa_switch *ds) | ||
315 | { | ||
316 | int i, ret = 0; | ||
317 | |||
318 | if (ds->ops->resume) | ||
319 | ret = ds->ops->resume(ds); | ||
320 | |||
321 | if (ret) | ||
322 | return ret; | ||
323 | |||
324 | /* Resume slave network devices */ | ||
325 | for (i = 0; i < ds->num_ports; i++) { | ||
326 | if (!dsa_is_port_initialized(ds, i)) | ||
327 | continue; | ||
328 | |||
329 | ret = dsa_slave_resume(ds->ports[i].netdev); | ||
330 | if (ret) | ||
331 | return ret; | ||
332 | } | ||
333 | |||
334 | return 0; | ||
335 | } | ||
336 | EXPORT_SYMBOL_GPL(dsa_switch_resume); | ||
337 | #endif | ||
338 | |||
339 | /* platform driver init and cleanup *****************************************/ | 292 | /* platform driver init and cleanup *****************************************/ |
340 | static int dev_is_class(struct device *dev, void *class) | 293 | static int dev_is_class(struct device *dev, void *class) |
341 | { | 294 | { |
diff --git a/net/hsr/hsr_device.c b/net/hsr/hsr_device.c index c73160fb11e7..0a0a392dc2bd 100644 --- a/net/hsr/hsr_device.c +++ b/net/hsr/hsr_device.c | |||
@@ -378,7 +378,6 @@ static void hsr_dev_destroy(struct net_device *hsr_dev) | |||
378 | del_timer_sync(&hsr->announce_timer); | 378 | del_timer_sync(&hsr->announce_timer); |
379 | 379 | ||
380 | synchronize_rcu(); | 380 | synchronize_rcu(); |
381 | free_netdev(hsr_dev); | ||
382 | } | 381 | } |
383 | 382 | ||
384 | static const struct net_device_ops hsr_device_ops = { | 383 | static const struct net_device_ops hsr_device_ops = { |
@@ -404,7 +403,8 @@ void hsr_dev_setup(struct net_device *dev) | |||
404 | SET_NETDEV_DEVTYPE(dev, &hsr_type); | 403 | SET_NETDEV_DEVTYPE(dev, &hsr_type); |
405 | dev->priv_flags |= IFF_NO_QUEUE; | 404 | dev->priv_flags |= IFF_NO_QUEUE; |
406 | 405 | ||
407 | dev->destructor = hsr_dev_destroy; | 406 | dev->needs_free_netdev = true; |
407 | dev->priv_destructor = hsr_dev_destroy; | ||
408 | 408 | ||
409 | dev->hw_features = NETIF_F_SG | NETIF_F_FRAGLIST | NETIF_F_HIGHDMA | | 409 | dev->hw_features = NETIF_F_SG | NETIF_F_FRAGLIST | NETIF_F_HIGHDMA | |
410 | NETIF_F_GSO_MASK | NETIF_F_HW_CSUM | | 410 | NETIF_F_GSO_MASK | NETIF_F_HW_CSUM | |
diff --git a/net/hsr/hsr_forward.c b/net/hsr/hsr_forward.c index 4ebe2aa3e7d3..04b5450c5a55 100644 --- a/net/hsr/hsr_forward.c +++ b/net/hsr/hsr_forward.c | |||
@@ -324,8 +324,7 @@ static int hsr_fill_frame_info(struct hsr_frame_info *frame, | |||
324 | unsigned long irqflags; | 324 | unsigned long irqflags; |
325 | 325 | ||
326 | frame->is_supervision = is_supervision_frame(port->hsr, skb); | 326 | frame->is_supervision = is_supervision_frame(port->hsr, skb); |
327 | frame->node_src = hsr_get_node(&port->hsr->node_db, skb, | 327 | frame->node_src = hsr_get_node(port, skb, frame->is_supervision); |
328 | frame->is_supervision); | ||
329 | if (frame->node_src == NULL) | 328 | if (frame->node_src == NULL) |
330 | return -1; /* Unknown node and !is_supervision, or no mem */ | 329 | return -1; /* Unknown node and !is_supervision, or no mem */ |
331 | 330 | ||
diff --git a/net/hsr/hsr_framereg.c b/net/hsr/hsr_framereg.c index 7ea925816f79..284a9b820df8 100644 --- a/net/hsr/hsr_framereg.c +++ b/net/hsr/hsr_framereg.c | |||
@@ -158,9 +158,10 @@ struct hsr_node *hsr_add_node(struct list_head *node_db, unsigned char addr[], | |||
158 | 158 | ||
159 | /* Get the hsr_node from which 'skb' was sent. | 159 | /* Get the hsr_node from which 'skb' was sent. |
160 | */ | 160 | */ |
161 | struct hsr_node *hsr_get_node(struct list_head *node_db, struct sk_buff *skb, | 161 | struct hsr_node *hsr_get_node(struct hsr_port *port, struct sk_buff *skb, |
162 | bool is_sup) | 162 | bool is_sup) |
163 | { | 163 | { |
164 | struct list_head *node_db = &port->hsr->node_db; | ||
164 | struct hsr_node *node; | 165 | struct hsr_node *node; |
165 | struct ethhdr *ethhdr; | 166 | struct ethhdr *ethhdr; |
166 | u16 seq_out; | 167 | u16 seq_out; |
@@ -186,7 +187,11 @@ struct hsr_node *hsr_get_node(struct list_head *node_db, struct sk_buff *skb, | |||
186 | */ | 187 | */ |
187 | seq_out = hsr_get_skb_sequence_nr(skb) - 1; | 188 | seq_out = hsr_get_skb_sequence_nr(skb) - 1; |
188 | } else { | 189 | } else { |
189 | WARN_ONCE(1, "%s: Non-HSR frame\n", __func__); | 190 | /* this is called also for frames from master port and |
191 | * so warn only for non master ports | ||
192 | */ | ||
193 | if (port->type != HSR_PT_MASTER) | ||
194 | WARN_ONCE(1, "%s: Non-HSR frame\n", __func__); | ||
190 | seq_out = HSR_SEQNR_START; | 195 | seq_out = HSR_SEQNR_START; |
191 | } | 196 | } |
192 | 197 | ||
diff --git a/net/hsr/hsr_framereg.h b/net/hsr/hsr_framereg.h index 438b40f98f5a..4e04f0e868e9 100644 --- a/net/hsr/hsr_framereg.h +++ b/net/hsr/hsr_framereg.h | |||
@@ -18,7 +18,7 @@ struct hsr_node; | |||
18 | 18 | ||
19 | struct hsr_node *hsr_add_node(struct list_head *node_db, unsigned char addr[], | 19 | struct hsr_node *hsr_add_node(struct list_head *node_db, unsigned char addr[], |
20 | u16 seq_out); | 20 | u16 seq_out); |
21 | struct hsr_node *hsr_get_node(struct list_head *node_db, struct sk_buff *skb, | 21 | struct hsr_node *hsr_get_node(struct hsr_port *port, struct sk_buff *skb, |
22 | bool is_sup); | 22 | bool is_sup); |
23 | void hsr_handle_sup_frame(struct sk_buff *skb, struct hsr_node *node_curr, | 23 | void hsr_handle_sup_frame(struct sk_buff *skb, struct hsr_node *node_curr, |
24 | struct hsr_port *port); | 24 | struct hsr_port *port); |
diff --git a/net/ieee802154/6lowpan/core.c b/net/ieee802154/6lowpan/core.c index d7efbf0dad20..0a866f332290 100644 --- a/net/ieee802154/6lowpan/core.c +++ b/net/ieee802154/6lowpan/core.c | |||
@@ -107,7 +107,7 @@ static void lowpan_setup(struct net_device *ldev) | |||
107 | 107 | ||
108 | ldev->netdev_ops = &lowpan_netdev_ops; | 108 | ldev->netdev_ops = &lowpan_netdev_ops; |
109 | ldev->header_ops = &lowpan_header_ops; | 109 | ldev->header_ops = &lowpan_header_ops; |
110 | ldev->destructor = free_netdev; | 110 | ldev->needs_free_netdev = true; |
111 | ldev->features |= NETIF_F_NETNS_LOCAL; | 111 | ldev->features |= NETIF_F_NETNS_LOCAL; |
112 | } | 112 | } |
113 | 113 | ||
diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c index f3dad1661343..58925b6597de 100644 --- a/net/ipv4/af_inet.c +++ b/net/ipv4/af_inet.c | |||
@@ -1043,7 +1043,7 @@ static struct inet_protosw inetsw_array[] = | |||
1043 | .type = SOCK_DGRAM, | 1043 | .type = SOCK_DGRAM, |
1044 | .protocol = IPPROTO_ICMP, | 1044 | .protocol = IPPROTO_ICMP, |
1045 | .prot = &ping_prot, | 1045 | .prot = &ping_prot, |
1046 | .ops = &inet_dgram_ops, | 1046 | .ops = &inet_sockraw_ops, |
1047 | .flags = INET_PROTOSW_REUSE, | 1047 | .flags = INET_PROTOSW_REUSE, |
1048 | }, | 1048 | }, |
1049 | 1049 | ||
diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c index 43318b5f5647..9144fa7df2ad 100644 --- a/net/ipv4/icmp.c +++ b/net/ipv4/icmp.c | |||
@@ -657,8 +657,12 @@ void icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info) | |||
657 | /* Needed by both icmp_global_allow and icmp_xmit_lock */ | 657 | /* Needed by both icmp_global_allow and icmp_xmit_lock */ |
658 | local_bh_disable(); | 658 | local_bh_disable(); |
659 | 659 | ||
660 | /* Check global sysctl_icmp_msgs_per_sec ratelimit */ | 660 | /* Check global sysctl_icmp_msgs_per_sec ratelimit, unless |
661 | if (!icmpv4_global_allow(net, type, code)) | 661 | * incoming dev is loopback. If outgoing dev change to not be |
662 | * loopback, then peer ratelimit still work (in icmpv4_xrlim_allow) | ||
663 | */ | ||
664 | if (!(skb_in->dev && (skb_in->dev->flags&IFF_LOOPBACK)) && | ||
665 | !icmpv4_global_allow(net, type, code)) | ||
662 | goto out_bh_enable; | 666 | goto out_bh_enable; |
663 | 667 | ||
664 | sk = icmp_xmit_lock(net); | 668 | sk = icmp_xmit_lock(net); |
diff --git a/net/ipv4/igmp.c b/net/ipv4/igmp.c index 44fd86de2823..8f6b5bbcbf69 100644 --- a/net/ipv4/igmp.c +++ b/net/ipv4/igmp.c | |||
@@ -2071,21 +2071,26 @@ static int ip_mc_add_src(struct in_device *in_dev, __be32 *pmca, int sfmode, | |||
2071 | 2071 | ||
2072 | static void ip_mc_clear_src(struct ip_mc_list *pmc) | 2072 | static void ip_mc_clear_src(struct ip_mc_list *pmc) |
2073 | { | 2073 | { |
2074 | struct ip_sf_list *psf, *nextpsf; | 2074 | struct ip_sf_list *psf, *nextpsf, *tomb, *sources; |
2075 | 2075 | ||
2076 | for (psf = pmc->tomb; psf; psf = nextpsf) { | 2076 | spin_lock_bh(&pmc->lock); |
2077 | tomb = pmc->tomb; | ||
2078 | pmc->tomb = NULL; | ||
2079 | sources = pmc->sources; | ||
2080 | pmc->sources = NULL; | ||
2081 | pmc->sfmode = MCAST_EXCLUDE; | ||
2082 | pmc->sfcount[MCAST_INCLUDE] = 0; | ||
2083 | pmc->sfcount[MCAST_EXCLUDE] = 1; | ||
2084 | spin_unlock_bh(&pmc->lock); | ||
2085 | |||
2086 | for (psf = tomb; psf; psf = nextpsf) { | ||
2077 | nextpsf = psf->sf_next; | 2087 | nextpsf = psf->sf_next; |
2078 | kfree(psf); | 2088 | kfree(psf); |
2079 | } | 2089 | } |
2080 | pmc->tomb = NULL; | 2090 | for (psf = sources; psf; psf = nextpsf) { |
2081 | for (psf = pmc->sources; psf; psf = nextpsf) { | ||
2082 | nextpsf = psf->sf_next; | 2091 | nextpsf = psf->sf_next; |
2083 | kfree(psf); | 2092 | kfree(psf); |
2084 | } | 2093 | } |
2085 | pmc->sources = NULL; | ||
2086 | pmc->sfmode = MCAST_EXCLUDE; | ||
2087 | pmc->sfcount[MCAST_INCLUDE] = 0; | ||
2088 | pmc->sfcount[MCAST_EXCLUDE] = 1; | ||
2089 | } | 2094 | } |
2090 | 2095 | ||
2091 | /* Join a multicast group | 2096 | /* Join a multicast group |
diff --git a/net/ipv4/ip_tunnel.c b/net/ipv4/ip_tunnel.c index b878ecbc0608..b436d0775631 100644 --- a/net/ipv4/ip_tunnel.c +++ b/net/ipv4/ip_tunnel.c | |||
@@ -967,7 +967,6 @@ static void ip_tunnel_dev_free(struct net_device *dev) | |||
967 | gro_cells_destroy(&tunnel->gro_cells); | 967 | gro_cells_destroy(&tunnel->gro_cells); |
968 | dst_cache_destroy(&tunnel->dst_cache); | 968 | dst_cache_destroy(&tunnel->dst_cache); |
969 | free_percpu(dev->tstats); | 969 | free_percpu(dev->tstats); |
970 | free_netdev(dev); | ||
971 | } | 970 | } |
972 | 971 | ||
973 | void ip_tunnel_dellink(struct net_device *dev, struct list_head *head) | 972 | void ip_tunnel_dellink(struct net_device *dev, struct list_head *head) |
@@ -1155,7 +1154,8 @@ int ip_tunnel_init(struct net_device *dev) | |||
1155 | struct iphdr *iph = &tunnel->parms.iph; | 1154 | struct iphdr *iph = &tunnel->parms.iph; |
1156 | int err; | 1155 | int err; |
1157 | 1156 | ||
1158 | dev->destructor = ip_tunnel_dev_free; | 1157 | dev->needs_free_netdev = true; |
1158 | dev->priv_destructor = ip_tunnel_dev_free; | ||
1159 | dev->tstats = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats); | 1159 | dev->tstats = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats); |
1160 | if (!dev->tstats) | 1160 | if (!dev->tstats) |
1161 | return -ENOMEM; | 1161 | return -ENOMEM; |
diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c index 551de4d023a8..8ae425cad818 100644 --- a/net/ipv4/ipmr.c +++ b/net/ipv4/ipmr.c | |||
@@ -101,8 +101,8 @@ static struct mr_table *ipmr_new_table(struct net *net, u32 id); | |||
101 | static void ipmr_free_table(struct mr_table *mrt); | 101 | static void ipmr_free_table(struct mr_table *mrt); |
102 | 102 | ||
103 | static void ip_mr_forward(struct net *net, struct mr_table *mrt, | 103 | static void ip_mr_forward(struct net *net, struct mr_table *mrt, |
104 | struct sk_buff *skb, struct mfc_cache *cache, | 104 | struct net_device *dev, struct sk_buff *skb, |
105 | int local); | 105 | struct mfc_cache *cache, int local); |
106 | static int ipmr_cache_report(struct mr_table *mrt, | 106 | static int ipmr_cache_report(struct mr_table *mrt, |
107 | struct sk_buff *pkt, vifi_t vifi, int assert); | 107 | struct sk_buff *pkt, vifi_t vifi, int assert); |
108 | static int __ipmr_fill_mroute(struct mr_table *mrt, struct sk_buff *skb, | 108 | static int __ipmr_fill_mroute(struct mr_table *mrt, struct sk_buff *skb, |
@@ -501,7 +501,7 @@ static void reg_vif_setup(struct net_device *dev) | |||
501 | dev->mtu = ETH_DATA_LEN - sizeof(struct iphdr) - 8; | 501 | dev->mtu = ETH_DATA_LEN - sizeof(struct iphdr) - 8; |
502 | dev->flags = IFF_NOARP; | 502 | dev->flags = IFF_NOARP; |
503 | dev->netdev_ops = ®_vif_netdev_ops; | 503 | dev->netdev_ops = ®_vif_netdev_ops; |
504 | dev->destructor = free_netdev; | 504 | dev->needs_free_netdev = true; |
505 | dev->features |= NETIF_F_NETNS_LOCAL; | 505 | dev->features |= NETIF_F_NETNS_LOCAL; |
506 | } | 506 | } |
507 | 507 | ||
@@ -988,7 +988,7 @@ static void ipmr_cache_resolve(struct net *net, struct mr_table *mrt, | |||
988 | 988 | ||
989 | rtnl_unicast(skb, net, NETLINK_CB(skb).portid); | 989 | rtnl_unicast(skb, net, NETLINK_CB(skb).portid); |
990 | } else { | 990 | } else { |
991 | ip_mr_forward(net, mrt, skb, c, 0); | 991 | ip_mr_forward(net, mrt, skb->dev, skb, c, 0); |
992 | } | 992 | } |
993 | } | 993 | } |
994 | } | 994 | } |
@@ -1073,7 +1073,7 @@ static int ipmr_cache_report(struct mr_table *mrt, | |||
1073 | 1073 | ||
1074 | /* Queue a packet for resolution. It gets locked cache entry! */ | 1074 | /* Queue a packet for resolution. It gets locked cache entry! */ |
1075 | static int ipmr_cache_unresolved(struct mr_table *mrt, vifi_t vifi, | 1075 | static int ipmr_cache_unresolved(struct mr_table *mrt, vifi_t vifi, |
1076 | struct sk_buff *skb) | 1076 | struct sk_buff *skb, struct net_device *dev) |
1077 | { | 1077 | { |
1078 | const struct iphdr *iph = ip_hdr(skb); | 1078 | const struct iphdr *iph = ip_hdr(skb); |
1079 | struct mfc_cache *c; | 1079 | struct mfc_cache *c; |
@@ -1130,6 +1130,10 @@ static int ipmr_cache_unresolved(struct mr_table *mrt, vifi_t vifi, | |||
1130 | kfree_skb(skb); | 1130 | kfree_skb(skb); |
1131 | err = -ENOBUFS; | 1131 | err = -ENOBUFS; |
1132 | } else { | 1132 | } else { |
1133 | if (dev) { | ||
1134 | skb->dev = dev; | ||
1135 | skb->skb_iif = dev->ifindex; | ||
1136 | } | ||
1133 | skb_queue_tail(&c->mfc_un.unres.unresolved, skb); | 1137 | skb_queue_tail(&c->mfc_un.unres.unresolved, skb); |
1134 | err = 0; | 1138 | err = 0; |
1135 | } | 1139 | } |
@@ -1828,10 +1832,10 @@ static int ipmr_find_vif(struct mr_table *mrt, struct net_device *dev) | |||
1828 | 1832 | ||
1829 | /* "local" means that we should preserve one skb (for local delivery) */ | 1833 | /* "local" means that we should preserve one skb (for local delivery) */ |
1830 | static void ip_mr_forward(struct net *net, struct mr_table *mrt, | 1834 | static void ip_mr_forward(struct net *net, struct mr_table *mrt, |
1831 | struct sk_buff *skb, struct mfc_cache *cache, | 1835 | struct net_device *dev, struct sk_buff *skb, |
1832 | int local) | 1836 | struct mfc_cache *cache, int local) |
1833 | { | 1837 | { |
1834 | int true_vifi = ipmr_find_vif(mrt, skb->dev); | 1838 | int true_vifi = ipmr_find_vif(mrt, dev); |
1835 | int psend = -1; | 1839 | int psend = -1; |
1836 | int vif, ct; | 1840 | int vif, ct; |
1837 | 1841 | ||
@@ -1853,13 +1857,7 @@ static void ip_mr_forward(struct net *net, struct mr_table *mrt, | |||
1853 | } | 1857 | } |
1854 | 1858 | ||
1855 | /* Wrong interface: drop packet and (maybe) send PIM assert. */ | 1859 | /* Wrong interface: drop packet and (maybe) send PIM assert. */ |
1856 | if (mrt->vif_table[vif].dev != skb->dev) { | 1860 | if (mrt->vif_table[vif].dev != dev) { |
1857 | struct net_device *mdev; | ||
1858 | |||
1859 | mdev = l3mdev_master_dev_rcu(mrt->vif_table[vif].dev); | ||
1860 | if (mdev == skb->dev) | ||
1861 | goto forward; | ||
1862 | |||
1863 | if (rt_is_output_route(skb_rtable(skb))) { | 1861 | if (rt_is_output_route(skb_rtable(skb))) { |
1864 | /* It is our own packet, looped back. | 1862 | /* It is our own packet, looped back. |
1865 | * Very complicated situation... | 1863 | * Very complicated situation... |
@@ -2053,7 +2051,7 @@ int ip_mr_input(struct sk_buff *skb) | |||
2053 | read_lock(&mrt_lock); | 2051 | read_lock(&mrt_lock); |
2054 | vif = ipmr_find_vif(mrt, dev); | 2052 | vif = ipmr_find_vif(mrt, dev); |
2055 | if (vif >= 0) { | 2053 | if (vif >= 0) { |
2056 | int err2 = ipmr_cache_unresolved(mrt, vif, skb); | 2054 | int err2 = ipmr_cache_unresolved(mrt, vif, skb, dev); |
2057 | read_unlock(&mrt_lock); | 2055 | read_unlock(&mrt_lock); |
2058 | 2056 | ||
2059 | return err2; | 2057 | return err2; |
@@ -2064,7 +2062,7 @@ int ip_mr_input(struct sk_buff *skb) | |||
2064 | } | 2062 | } |
2065 | 2063 | ||
2066 | read_lock(&mrt_lock); | 2064 | read_lock(&mrt_lock); |
2067 | ip_mr_forward(net, mrt, skb, cache, local); | 2065 | ip_mr_forward(net, mrt, dev, skb, cache, local); |
2068 | read_unlock(&mrt_lock); | 2066 | read_unlock(&mrt_lock); |
2069 | 2067 | ||
2070 | if (local) | 2068 | if (local) |
@@ -2238,7 +2236,7 @@ int ipmr_get_route(struct net *net, struct sk_buff *skb, | |||
2238 | iph->saddr = saddr; | 2236 | iph->saddr = saddr; |
2239 | iph->daddr = daddr; | 2237 | iph->daddr = daddr; |
2240 | iph->version = 0; | 2238 | iph->version = 0; |
2241 | err = ipmr_cache_unresolved(mrt, vif, skb2); | 2239 | err = ipmr_cache_unresolved(mrt, vif, skb2, dev); |
2242 | read_unlock(&mrt_lock); | 2240 | read_unlock(&mrt_lock); |
2243 | rcu_read_unlock(); | 2241 | rcu_read_unlock(); |
2244 | return err; | 2242 | return err; |
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 59792d283ff8..b5ea036ca781 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
@@ -2381,9 +2381,10 @@ static int tcp_repair_set_window(struct tcp_sock *tp, char __user *optbuf, int l | |||
2381 | return 0; | 2381 | return 0; |
2382 | } | 2382 | } |
2383 | 2383 | ||
2384 | static int tcp_repair_options_est(struct tcp_sock *tp, | 2384 | static int tcp_repair_options_est(struct sock *sk, |
2385 | struct tcp_repair_opt __user *optbuf, unsigned int len) | 2385 | struct tcp_repair_opt __user *optbuf, unsigned int len) |
2386 | { | 2386 | { |
2387 | struct tcp_sock *tp = tcp_sk(sk); | ||
2387 | struct tcp_repair_opt opt; | 2388 | struct tcp_repair_opt opt; |
2388 | 2389 | ||
2389 | while (len >= sizeof(opt)) { | 2390 | while (len >= sizeof(opt)) { |
@@ -2396,6 +2397,7 @@ static int tcp_repair_options_est(struct tcp_sock *tp, | |||
2396 | switch (opt.opt_code) { | 2397 | switch (opt.opt_code) { |
2397 | case TCPOPT_MSS: | 2398 | case TCPOPT_MSS: |
2398 | tp->rx_opt.mss_clamp = opt.opt_val; | 2399 | tp->rx_opt.mss_clamp = opt.opt_val; |
2400 | tcp_mtup_init(sk); | ||
2399 | break; | 2401 | break; |
2400 | case TCPOPT_WINDOW: | 2402 | case TCPOPT_WINDOW: |
2401 | { | 2403 | { |
@@ -2555,7 +2557,7 @@ static int do_tcp_setsockopt(struct sock *sk, int level, | |||
2555 | if (!tp->repair) | 2557 | if (!tp->repair) |
2556 | err = -EINVAL; | 2558 | err = -EINVAL; |
2557 | else if (sk->sk_state == TCP_ESTABLISHED) | 2559 | else if (sk->sk_state == TCP_ESTABLISHED) |
2558 | err = tcp_repair_options_est(tp, | 2560 | err = tcp_repair_options_est(sk, |
2559 | (struct tcp_repair_opt __user *)optval, | 2561 | (struct tcp_repair_opt __user *)optval, |
2560 | optlen); | 2562 | optlen); |
2561 | else | 2563 | else |
diff --git a/net/ipv4/tcp_cong.c b/net/ipv4/tcp_cong.c index 6e3c512054a6..324c9bcc5456 100644 --- a/net/ipv4/tcp_cong.c +++ b/net/ipv4/tcp_cong.c | |||
@@ -180,6 +180,7 @@ void tcp_init_congestion_control(struct sock *sk) | |||
180 | { | 180 | { |
181 | const struct inet_connection_sock *icsk = inet_csk(sk); | 181 | const struct inet_connection_sock *icsk = inet_csk(sk); |
182 | 182 | ||
183 | tcp_sk(sk)->prior_ssthresh = 0; | ||
183 | if (icsk->icsk_ca_ops->init) | 184 | if (icsk->icsk_ca_ops->init) |
184 | icsk->icsk_ca_ops->init(sk); | 185 | icsk->icsk_ca_ops->init(sk); |
185 | if (tcp_ca_needs_ecn(sk)) | 186 | if (tcp_ca_needs_ecn(sk)) |
diff --git a/net/ipv6/calipso.c b/net/ipv6/calipso.c index 37ac9de713c6..8d772fea1dde 100644 --- a/net/ipv6/calipso.c +++ b/net/ipv6/calipso.c | |||
@@ -1319,7 +1319,7 @@ static int calipso_skbuff_setattr(struct sk_buff *skb, | |||
1319 | struct ipv6hdr *ip6_hdr; | 1319 | struct ipv6hdr *ip6_hdr; |
1320 | struct ipv6_opt_hdr *hop; | 1320 | struct ipv6_opt_hdr *hop; |
1321 | unsigned char buf[CALIPSO_MAX_BUFFER]; | 1321 | unsigned char buf[CALIPSO_MAX_BUFFER]; |
1322 | int len_delta, new_end, pad; | 1322 | int len_delta, new_end, pad, payload; |
1323 | unsigned int start, end; | 1323 | unsigned int start, end; |
1324 | 1324 | ||
1325 | ip6_hdr = ipv6_hdr(skb); | 1325 | ip6_hdr = ipv6_hdr(skb); |
@@ -1346,6 +1346,8 @@ static int calipso_skbuff_setattr(struct sk_buff *skb, | |||
1346 | if (ret_val < 0) | 1346 | if (ret_val < 0) |
1347 | return ret_val; | 1347 | return ret_val; |
1348 | 1348 | ||
1349 | ip6_hdr = ipv6_hdr(skb); /* Reset as skb_cow() may have moved it */ | ||
1350 | |||
1349 | if (len_delta) { | 1351 | if (len_delta) { |
1350 | if (len_delta > 0) | 1352 | if (len_delta > 0) |
1351 | skb_push(skb, len_delta); | 1353 | skb_push(skb, len_delta); |
@@ -1355,6 +1357,8 @@ static int calipso_skbuff_setattr(struct sk_buff *skb, | |||
1355 | sizeof(*ip6_hdr) + start); | 1357 | sizeof(*ip6_hdr) + start); |
1356 | skb_reset_network_header(skb); | 1358 | skb_reset_network_header(skb); |
1357 | ip6_hdr = ipv6_hdr(skb); | 1359 | ip6_hdr = ipv6_hdr(skb); |
1360 | payload = ntohs(ip6_hdr->payload_len); | ||
1361 | ip6_hdr->payload_len = htons(payload + len_delta); | ||
1358 | } | 1362 | } |
1359 | 1363 | ||
1360 | hop = (struct ipv6_opt_hdr *)(ip6_hdr + 1); | 1364 | hop = (struct ipv6_opt_hdr *)(ip6_hdr + 1); |
diff --git a/net/ipv6/icmp.c b/net/ipv6/icmp.c index 230b5aac9f03..8d7b113958b1 100644 --- a/net/ipv6/icmp.c +++ b/net/ipv6/icmp.c | |||
@@ -491,7 +491,7 @@ static void icmp6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info, | |||
491 | local_bh_disable(); | 491 | local_bh_disable(); |
492 | 492 | ||
493 | /* Check global sysctl_icmp_msgs_per_sec ratelimit */ | 493 | /* Check global sysctl_icmp_msgs_per_sec ratelimit */ |
494 | if (!icmpv6_global_allow(type)) | 494 | if (!(skb->dev->flags&IFF_LOOPBACK) && !icmpv6_global_allow(type)) |
495 | goto out_bh_enable; | 495 | goto out_bh_enable; |
496 | 496 | ||
497 | mip6_addr_swap(skb); | 497 | mip6_addr_swap(skb); |
diff --git a/net/ipv6/ila/ila_xlat.c b/net/ipv6/ila/ila_xlat.c index 2fd5ca151dcf..77f7f8c7d93d 100644 --- a/net/ipv6/ila/ila_xlat.c +++ b/net/ipv6/ila/ila_xlat.c | |||
@@ -62,6 +62,7 @@ static inline u32 ila_locator_hash(struct ila_locator loc) | |||
62 | { | 62 | { |
63 | u32 *v = (u32 *)loc.v32; | 63 | u32 *v = (u32 *)loc.v32; |
64 | 64 | ||
65 | __ila_hash_secret_init(); | ||
65 | return jhash_2words(v[0], v[1], hashrnd); | 66 | return jhash_2words(v[0], v[1], hashrnd); |
66 | } | 67 | } |
67 | 68 | ||
diff --git a/net/ipv6/ip6_gre.c b/net/ipv6/ip6_gre.c index 0c5b4caa1949..64eea3962733 100644 --- a/net/ipv6/ip6_gre.c +++ b/net/ipv6/ip6_gre.c | |||
@@ -991,13 +991,13 @@ static void ip6gre_dev_free(struct net_device *dev) | |||
991 | 991 | ||
992 | dst_cache_destroy(&t->dst_cache); | 992 | dst_cache_destroy(&t->dst_cache); |
993 | free_percpu(dev->tstats); | 993 | free_percpu(dev->tstats); |
994 | free_netdev(dev); | ||
995 | } | 994 | } |
996 | 995 | ||
997 | static void ip6gre_tunnel_setup(struct net_device *dev) | 996 | static void ip6gre_tunnel_setup(struct net_device *dev) |
998 | { | 997 | { |
999 | dev->netdev_ops = &ip6gre_netdev_ops; | 998 | dev->netdev_ops = &ip6gre_netdev_ops; |
1000 | dev->destructor = ip6gre_dev_free; | 999 | dev->needs_free_netdev = true; |
1000 | dev->priv_destructor = ip6gre_dev_free; | ||
1001 | 1001 | ||
1002 | dev->type = ARPHRD_IP6GRE; | 1002 | dev->type = ARPHRD_IP6GRE; |
1003 | 1003 | ||
@@ -1148,7 +1148,7 @@ static int __net_init ip6gre_init_net(struct net *net) | |||
1148 | return 0; | 1148 | return 0; |
1149 | 1149 | ||
1150 | err_reg_dev: | 1150 | err_reg_dev: |
1151 | ip6gre_dev_free(ign->fb_tunnel_dev); | 1151 | free_netdev(ign->fb_tunnel_dev); |
1152 | err_alloc_dev: | 1152 | err_alloc_dev: |
1153 | return err; | 1153 | return err; |
1154 | } | 1154 | } |
@@ -1300,7 +1300,8 @@ static void ip6gre_tap_setup(struct net_device *dev) | |||
1300 | ether_setup(dev); | 1300 | ether_setup(dev); |
1301 | 1301 | ||
1302 | dev->netdev_ops = &ip6gre_tap_netdev_ops; | 1302 | dev->netdev_ops = &ip6gre_tap_netdev_ops; |
1303 | dev->destructor = ip6gre_dev_free; | 1303 | dev->needs_free_netdev = true; |
1304 | dev->priv_destructor = ip6gre_dev_free; | ||
1304 | 1305 | ||
1305 | dev->features |= NETIF_F_NETNS_LOCAL; | 1306 | dev->features |= NETIF_F_NETNS_LOCAL; |
1306 | dev->priv_flags &= ~IFF_TX_SKB_SHARING; | 1307 | dev->priv_flags &= ~IFF_TX_SKB_SHARING; |
diff --git a/net/ipv6/ip6_offload.c b/net/ipv6/ip6_offload.c index 280268f1dd7b..cdb3728faca7 100644 --- a/net/ipv6/ip6_offload.c +++ b/net/ipv6/ip6_offload.c | |||
@@ -116,8 +116,10 @@ static struct sk_buff *ipv6_gso_segment(struct sk_buff *skb, | |||
116 | 116 | ||
117 | if (udpfrag) { | 117 | if (udpfrag) { |
118 | int err = ip6_find_1stfragopt(skb, &prevhdr); | 118 | int err = ip6_find_1stfragopt(skb, &prevhdr); |
119 | if (err < 0) | 119 | if (err < 0) { |
120 | kfree_skb_list(segs); | ||
120 | return ERR_PTR(err); | 121 | return ERR_PTR(err); |
122 | } | ||
121 | fptr = (struct frag_hdr *)((u8 *)ipv6h + err); | 123 | fptr = (struct frag_hdr *)((u8 *)ipv6h + err); |
122 | fptr->frag_off = htons(offset); | 124 | fptr->frag_off = htons(offset); |
123 | if (skb->next) | 125 | if (skb->next) |
diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c index 7ae6c503f1ca..c3581973f5d7 100644 --- a/net/ipv6/ip6_tunnel.c +++ b/net/ipv6/ip6_tunnel.c | |||
@@ -254,7 +254,6 @@ static void ip6_dev_free(struct net_device *dev) | |||
254 | gro_cells_destroy(&t->gro_cells); | 254 | gro_cells_destroy(&t->gro_cells); |
255 | dst_cache_destroy(&t->dst_cache); | 255 | dst_cache_destroy(&t->dst_cache); |
256 | free_percpu(dev->tstats); | 256 | free_percpu(dev->tstats); |
257 | free_netdev(dev); | ||
258 | } | 257 | } |
259 | 258 | ||
260 | static int ip6_tnl_create2(struct net_device *dev) | 259 | static int ip6_tnl_create2(struct net_device *dev) |
@@ -322,7 +321,7 @@ static struct ip6_tnl *ip6_tnl_create(struct net *net, struct __ip6_tnl_parm *p) | |||
322 | return t; | 321 | return t; |
323 | 322 | ||
324 | failed_free: | 323 | failed_free: |
325 | ip6_dev_free(dev); | 324 | free_netdev(dev); |
326 | failed: | 325 | failed: |
327 | return ERR_PTR(err); | 326 | return ERR_PTR(err); |
328 | } | 327 | } |
@@ -1095,6 +1094,9 @@ int ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev, __u8 dsfield, | |||
1095 | 1094 | ||
1096 | if (!dst) { | 1095 | if (!dst) { |
1097 | route_lookup: | 1096 | route_lookup: |
1097 | /* add dsfield to flowlabel for route lookup */ | ||
1098 | fl6->flowlabel = ip6_make_flowinfo(dsfield, fl6->flowlabel); | ||
1099 | |||
1098 | dst = ip6_route_output(net, NULL, fl6); | 1100 | dst = ip6_route_output(net, NULL, fl6); |
1099 | 1101 | ||
1100 | if (dst->error) | 1102 | if (dst->error) |
@@ -1774,7 +1776,8 @@ static const struct net_device_ops ip6_tnl_netdev_ops = { | |||
1774 | static void ip6_tnl_dev_setup(struct net_device *dev) | 1776 | static void ip6_tnl_dev_setup(struct net_device *dev) |
1775 | { | 1777 | { |
1776 | dev->netdev_ops = &ip6_tnl_netdev_ops; | 1778 | dev->netdev_ops = &ip6_tnl_netdev_ops; |
1777 | dev->destructor = ip6_dev_free; | 1779 | dev->needs_free_netdev = true; |
1780 | dev->priv_destructor = ip6_dev_free; | ||
1778 | 1781 | ||
1779 | dev->type = ARPHRD_TUNNEL6; | 1782 | dev->type = ARPHRD_TUNNEL6; |
1780 | dev->flags |= IFF_NOARP; | 1783 | dev->flags |= IFF_NOARP; |
@@ -2221,7 +2224,7 @@ static int __net_init ip6_tnl_init_net(struct net *net) | |||
2221 | return 0; | 2224 | return 0; |
2222 | 2225 | ||
2223 | err_register: | 2226 | err_register: |
2224 | ip6_dev_free(ip6n->fb_tnl_dev); | 2227 | free_netdev(ip6n->fb_tnl_dev); |
2225 | err_alloc_dev: | 2228 | err_alloc_dev: |
2226 | return err; | 2229 | return err; |
2227 | } | 2230 | } |
diff --git a/net/ipv6/ip6_vti.c b/net/ipv6/ip6_vti.c index d67ef56454b2..837ea1eefe7f 100644 --- a/net/ipv6/ip6_vti.c +++ b/net/ipv6/ip6_vti.c | |||
@@ -180,7 +180,6 @@ vti6_tnl_unlink(struct vti6_net *ip6n, struct ip6_tnl *t) | |||
180 | static void vti6_dev_free(struct net_device *dev) | 180 | static void vti6_dev_free(struct net_device *dev) |
181 | { | 181 | { |
182 | free_percpu(dev->tstats); | 182 | free_percpu(dev->tstats); |
183 | free_netdev(dev); | ||
184 | } | 183 | } |
185 | 184 | ||
186 | static int vti6_tnl_create2(struct net_device *dev) | 185 | static int vti6_tnl_create2(struct net_device *dev) |
@@ -235,7 +234,7 @@ static struct ip6_tnl *vti6_tnl_create(struct net *net, struct __ip6_tnl_parm *p | |||
235 | return t; | 234 | return t; |
236 | 235 | ||
237 | failed_free: | 236 | failed_free: |
238 | vti6_dev_free(dev); | 237 | free_netdev(dev); |
239 | failed: | 238 | failed: |
240 | return NULL; | 239 | return NULL; |
241 | } | 240 | } |
@@ -842,7 +841,8 @@ static const struct net_device_ops vti6_netdev_ops = { | |||
842 | static void vti6_dev_setup(struct net_device *dev) | 841 | static void vti6_dev_setup(struct net_device *dev) |
843 | { | 842 | { |
844 | dev->netdev_ops = &vti6_netdev_ops; | 843 | dev->netdev_ops = &vti6_netdev_ops; |
845 | dev->destructor = vti6_dev_free; | 844 | dev->needs_free_netdev = true; |
845 | dev->priv_destructor = vti6_dev_free; | ||
846 | 846 | ||
847 | dev->type = ARPHRD_TUNNEL6; | 847 | dev->type = ARPHRD_TUNNEL6; |
848 | dev->hard_header_len = LL_MAX_HEADER + sizeof(struct ipv6hdr); | 848 | dev->hard_header_len = LL_MAX_HEADER + sizeof(struct ipv6hdr); |
@@ -1100,7 +1100,7 @@ static int __net_init vti6_init_net(struct net *net) | |||
1100 | return 0; | 1100 | return 0; |
1101 | 1101 | ||
1102 | err_register: | 1102 | err_register: |
1103 | vti6_dev_free(ip6n->fb_tnl_dev); | 1103 | free_netdev(ip6n->fb_tnl_dev); |
1104 | err_alloc_dev: | 1104 | err_alloc_dev: |
1105 | return err; | 1105 | return err; |
1106 | } | 1106 | } |
diff --git a/net/ipv6/ip6mr.c b/net/ipv6/ip6mr.c index 374997d26488..2ecb39b943b5 100644 --- a/net/ipv6/ip6mr.c +++ b/net/ipv6/ip6mr.c | |||
@@ -733,7 +733,7 @@ static void reg_vif_setup(struct net_device *dev) | |||
733 | dev->mtu = 1500 - sizeof(struct ipv6hdr) - 8; | 733 | dev->mtu = 1500 - sizeof(struct ipv6hdr) - 8; |
734 | dev->flags = IFF_NOARP; | 734 | dev->flags = IFF_NOARP; |
735 | dev->netdev_ops = ®_vif_netdev_ops; | 735 | dev->netdev_ops = ®_vif_netdev_ops; |
736 | dev->destructor = free_netdev; | 736 | dev->needs_free_netdev = true; |
737 | dev->features |= NETIF_F_NETNS_LOCAL; | 737 | dev->features |= NETIF_F_NETNS_LOCAL; |
738 | } | 738 | } |
739 | 739 | ||
diff --git a/net/ipv6/ping.c b/net/ipv6/ping.c index 9b522fa90e6d..ac826dd338ff 100644 --- a/net/ipv6/ping.c +++ b/net/ipv6/ping.c | |||
@@ -192,7 +192,7 @@ static struct inet_protosw pingv6_protosw = { | |||
192 | .type = SOCK_DGRAM, | 192 | .type = SOCK_DGRAM, |
193 | .protocol = IPPROTO_ICMPV6, | 193 | .protocol = IPPROTO_ICMPV6, |
194 | .prot = &pingv6_prot, | 194 | .prot = &pingv6_prot, |
195 | .ops = &inet6_dgram_ops, | 195 | .ops = &inet6_sockraw_ops, |
196 | .flags = INET_PROTOSW_REUSE, | 196 | .flags = INET_PROTOSW_REUSE, |
197 | }; | 197 | }; |
198 | 198 | ||
diff --git a/net/ipv6/proc.c b/net/ipv6/proc.c index cc8e3ae9ca73..e88bcb8ff0fd 100644 --- a/net/ipv6/proc.c +++ b/net/ipv6/proc.c | |||
@@ -219,7 +219,7 @@ static void snmp6_seq_show_item64(struct seq_file *seq, void __percpu *mib, | |||
219 | u64 buff64[SNMP_MIB_MAX]; | 219 | u64 buff64[SNMP_MIB_MAX]; |
220 | int i; | 220 | int i; |
221 | 221 | ||
222 | memset(buff64, 0, sizeof(unsigned long) * SNMP_MIB_MAX); | 222 | memset(buff64, 0, sizeof(u64) * SNMP_MIB_MAX); |
223 | 223 | ||
224 | snmp_get_cpu_field64_batch(buff64, itemlist, mib, syncpoff); | 224 | snmp_get_cpu_field64_batch(buff64, itemlist, mib, syncpoff); |
225 | for (i = 0; itemlist[i].name; i++) | 225 | for (i = 0; itemlist[i].name; i++) |
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c index 1f992d9e261d..60be012fe708 100644 --- a/net/ipv6/raw.c +++ b/net/ipv6/raw.c | |||
@@ -1338,7 +1338,7 @@ void raw6_proc_exit(void) | |||
1338 | #endif /* CONFIG_PROC_FS */ | 1338 | #endif /* CONFIG_PROC_FS */ |
1339 | 1339 | ||
1340 | /* Same as inet6_dgram_ops, sans udp_poll. */ | 1340 | /* Same as inet6_dgram_ops, sans udp_poll. */ |
1341 | static const struct proto_ops inet6_sockraw_ops = { | 1341 | const struct proto_ops inet6_sockraw_ops = { |
1342 | .family = PF_INET6, | 1342 | .family = PF_INET6, |
1343 | .owner = THIS_MODULE, | 1343 | .owner = THIS_MODULE, |
1344 | .release = inet6_release, | 1344 | .release = inet6_release, |
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index dc61b0b5e64e..7cebd954d5bb 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
@@ -2804,6 +2804,7 @@ static int fib6_ifdown(struct rt6_info *rt, void *arg) | |||
2804 | if ((rt->dst.dev == dev || !dev) && | 2804 | if ((rt->dst.dev == dev || !dev) && |
2805 | rt != adn->net->ipv6.ip6_null_entry && | 2805 | rt != adn->net->ipv6.ip6_null_entry && |
2806 | (rt->rt6i_nsiblings == 0 || | 2806 | (rt->rt6i_nsiblings == 0 || |
2807 | (dev && netdev_unregistering(dev)) || | ||
2807 | !rt->rt6i_idev->cnf.ignore_routes_with_linkdown)) | 2808 | !rt->rt6i_idev->cnf.ignore_routes_with_linkdown)) |
2808 | return -1; | 2809 | return -1; |
2809 | 2810 | ||
diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c index 61e5902f0687..2378503577b0 100644 --- a/net/ipv6/sit.c +++ b/net/ipv6/sit.c | |||
@@ -265,7 +265,7 @@ static struct ip_tunnel *ipip6_tunnel_locate(struct net *net, | |||
265 | return nt; | 265 | return nt; |
266 | 266 | ||
267 | failed_free: | 267 | failed_free: |
268 | ipip6_dev_free(dev); | 268 | free_netdev(dev); |
269 | failed: | 269 | failed: |
270 | return NULL; | 270 | return NULL; |
271 | } | 271 | } |
@@ -1336,7 +1336,6 @@ static void ipip6_dev_free(struct net_device *dev) | |||
1336 | 1336 | ||
1337 | dst_cache_destroy(&tunnel->dst_cache); | 1337 | dst_cache_destroy(&tunnel->dst_cache); |
1338 | free_percpu(dev->tstats); | 1338 | free_percpu(dev->tstats); |
1339 | free_netdev(dev); | ||
1340 | } | 1339 | } |
1341 | 1340 | ||
1342 | #define SIT_FEATURES (NETIF_F_SG | \ | 1341 | #define SIT_FEATURES (NETIF_F_SG | \ |
@@ -1351,7 +1350,8 @@ static void ipip6_tunnel_setup(struct net_device *dev) | |||
1351 | int t_hlen = tunnel->hlen + sizeof(struct iphdr); | 1350 | int t_hlen = tunnel->hlen + sizeof(struct iphdr); |
1352 | 1351 | ||
1353 | dev->netdev_ops = &ipip6_netdev_ops; | 1352 | dev->netdev_ops = &ipip6_netdev_ops; |
1354 | dev->destructor = ipip6_dev_free; | 1353 | dev->needs_free_netdev = true; |
1354 | dev->priv_destructor = ipip6_dev_free; | ||
1355 | 1355 | ||
1356 | dev->type = ARPHRD_SIT; | 1356 | dev->type = ARPHRD_SIT; |
1357 | dev->hard_header_len = LL_MAX_HEADER + t_hlen; | 1357 | dev->hard_header_len = LL_MAX_HEADER + t_hlen; |
diff --git a/net/ipv6/xfrm6_mode_ro.c b/net/ipv6/xfrm6_mode_ro.c index 0e015906f9ca..07d36573f50b 100644 --- a/net/ipv6/xfrm6_mode_ro.c +++ b/net/ipv6/xfrm6_mode_ro.c | |||
@@ -47,6 +47,8 @@ static int xfrm6_ro_output(struct xfrm_state *x, struct sk_buff *skb) | |||
47 | iph = ipv6_hdr(skb); | 47 | iph = ipv6_hdr(skb); |
48 | 48 | ||
49 | hdr_len = x->type->hdr_offset(x, skb, &prevhdr); | 49 | hdr_len = x->type->hdr_offset(x, skb, &prevhdr); |
50 | if (hdr_len < 0) | ||
51 | return hdr_len; | ||
50 | skb_set_mac_header(skb, (prevhdr - x->props.header_len) - skb->data); | 52 | skb_set_mac_header(skb, (prevhdr - x->props.header_len) - skb->data); |
51 | skb_set_network_header(skb, -x->props.header_len); | 53 | skb_set_network_header(skb, -x->props.header_len); |
52 | skb->transport_header = skb->network_header + hdr_len; | 54 | skb->transport_header = skb->network_header + hdr_len; |
diff --git a/net/ipv6/xfrm6_mode_transport.c b/net/ipv6/xfrm6_mode_transport.c index 7a92c0f31912..9ad07a91708e 100644 --- a/net/ipv6/xfrm6_mode_transport.c +++ b/net/ipv6/xfrm6_mode_transport.c | |||
@@ -30,6 +30,8 @@ static int xfrm6_transport_output(struct xfrm_state *x, struct sk_buff *skb) | |||
30 | skb_set_inner_transport_header(skb, skb_transport_offset(skb)); | 30 | skb_set_inner_transport_header(skb, skb_transport_offset(skb)); |
31 | 31 | ||
32 | hdr_len = x->type->hdr_offset(x, skb, &prevhdr); | 32 | hdr_len = x->type->hdr_offset(x, skb, &prevhdr); |
33 | if (hdr_len < 0) | ||
34 | return hdr_len; | ||
33 | skb_set_mac_header(skb, (prevhdr - x->props.header_len) - skb->data); | 35 | skb_set_mac_header(skb, (prevhdr - x->props.header_len) - skb->data); |
34 | skb_set_network_header(skb, -x->props.header_len); | 36 | skb_set_network_header(skb, -x->props.header_len); |
35 | skb->transport_header = skb->network_header + hdr_len; | 37 | skb->transport_header = skb->network_header + hdr_len; |
diff --git a/net/irda/irlan/irlan_eth.c b/net/irda/irlan/irlan_eth.c index 74d09f91709e..3be852808a9d 100644 --- a/net/irda/irlan/irlan_eth.c +++ b/net/irda/irlan/irlan_eth.c | |||
@@ -65,7 +65,7 @@ static void irlan_eth_setup(struct net_device *dev) | |||
65 | ether_setup(dev); | 65 | ether_setup(dev); |
66 | 66 | ||
67 | dev->netdev_ops = &irlan_eth_netdev_ops; | 67 | dev->netdev_ops = &irlan_eth_netdev_ops; |
68 | dev->destructor = free_netdev; | 68 | dev->needs_free_netdev = true; |
69 | dev->min_mtu = 0; | 69 | dev->min_mtu = 0; |
70 | dev->max_mtu = ETH_MAX_MTU; | 70 | dev->max_mtu = ETH_MAX_MTU; |
71 | 71 | ||
diff --git a/net/l2tp/l2tp_eth.c b/net/l2tp/l2tp_eth.c index 8b21af7321b9..4de2ec94b08c 100644 --- a/net/l2tp/l2tp_eth.c +++ b/net/l2tp/l2tp_eth.c | |||
@@ -114,12 +114,13 @@ static void l2tp_eth_get_stats64(struct net_device *dev, | |||
114 | { | 114 | { |
115 | struct l2tp_eth *priv = netdev_priv(dev); | 115 | struct l2tp_eth *priv = netdev_priv(dev); |
116 | 116 | ||
117 | stats->tx_bytes = atomic_long_read(&priv->tx_bytes); | 117 | stats->tx_bytes = (unsigned long) atomic_long_read(&priv->tx_bytes); |
118 | stats->tx_packets = atomic_long_read(&priv->tx_packets); | 118 | stats->tx_packets = (unsigned long) atomic_long_read(&priv->tx_packets); |
119 | stats->tx_dropped = atomic_long_read(&priv->tx_dropped); | 119 | stats->tx_dropped = (unsigned long) atomic_long_read(&priv->tx_dropped); |
120 | stats->rx_bytes = atomic_long_read(&priv->rx_bytes); | 120 | stats->rx_bytes = (unsigned long) atomic_long_read(&priv->rx_bytes); |
121 | stats->rx_packets = atomic_long_read(&priv->rx_packets); | 121 | stats->rx_packets = (unsigned long) atomic_long_read(&priv->rx_packets); |
122 | stats->rx_errors = atomic_long_read(&priv->rx_errors); | 122 | stats->rx_errors = (unsigned long) atomic_long_read(&priv->rx_errors); |
123 | |||
123 | } | 124 | } |
124 | 125 | ||
125 | static const struct net_device_ops l2tp_eth_netdev_ops = { | 126 | static const struct net_device_ops l2tp_eth_netdev_ops = { |
@@ -141,7 +142,7 @@ static void l2tp_eth_dev_setup(struct net_device *dev) | |||
141 | dev->priv_flags &= ~IFF_TX_SKB_SHARING; | 142 | dev->priv_flags &= ~IFF_TX_SKB_SHARING; |
142 | dev->features |= NETIF_F_LLTX; | 143 | dev->features |= NETIF_F_LLTX; |
143 | dev->netdev_ops = &l2tp_eth_netdev_ops; | 144 | dev->netdev_ops = &l2tp_eth_netdev_ops; |
144 | dev->destructor = free_netdev; | 145 | dev->needs_free_netdev = true; |
145 | } | 146 | } |
146 | 147 | ||
147 | static void l2tp_eth_dev_recv(struct l2tp_session *session, struct sk_buff *skb, int data_len) | 148 | static void l2tp_eth_dev_recv(struct l2tp_session *session, struct sk_buff *skb, int data_len) |
diff --git a/net/mac80211/agg-tx.c b/net/mac80211/agg-tx.c index 60e2a62f7bef..cf2392b2ac71 100644 --- a/net/mac80211/agg-tx.c +++ b/net/mac80211/agg-tx.c | |||
@@ -7,7 +7,7 @@ | |||
7 | * Copyright 2006-2007 Jiri Benc <jbenc@suse.cz> | 7 | * Copyright 2006-2007 Jiri Benc <jbenc@suse.cz> |
8 | * Copyright 2007, Michael Wu <flamingice@sourmilk.net> | 8 | * Copyright 2007, Michael Wu <flamingice@sourmilk.net> |
9 | * Copyright 2007-2010, Intel Corporation | 9 | * Copyright 2007-2010, Intel Corporation |
10 | * Copyright(c) 2015 Intel Deutschland GmbH | 10 | * Copyright(c) 2015-2017 Intel Deutschland GmbH |
11 | * | 11 | * |
12 | * This program is free software; you can redistribute it and/or modify | 12 | * This program is free software; you can redistribute it and/or modify |
13 | * it under the terms of the GNU General Public License version 2 as | 13 | * it under the terms of the GNU General Public License version 2 as |
@@ -741,46 +741,43 @@ static void ieee80211_agg_tx_operational(struct ieee80211_local *local, | |||
741 | ieee80211_agg_start_txq(sta, tid, true); | 741 | ieee80211_agg_start_txq(sta, tid, true); |
742 | } | 742 | } |
743 | 743 | ||
744 | void ieee80211_start_tx_ba_cb(struct ieee80211_vif *vif, u8 *ra, u16 tid) | 744 | void ieee80211_start_tx_ba_cb(struct sta_info *sta, int tid, |
745 | struct tid_ampdu_tx *tid_tx) | ||
745 | { | 746 | { |
746 | struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); | 747 | struct ieee80211_sub_if_data *sdata = sta->sdata; |
747 | struct ieee80211_local *local = sdata->local; | 748 | struct ieee80211_local *local = sdata->local; |
748 | struct sta_info *sta; | ||
749 | struct tid_ampdu_tx *tid_tx; | ||
750 | 749 | ||
751 | trace_api_start_tx_ba_cb(sdata, ra, tid); | 750 | if (WARN_ON(test_and_set_bit(HT_AGG_STATE_DRV_READY, &tid_tx->state))) |
751 | return; | ||
752 | |||
753 | if (test_bit(HT_AGG_STATE_RESPONSE_RECEIVED, &tid_tx->state)) | ||
754 | ieee80211_agg_tx_operational(local, sta, tid); | ||
755 | } | ||
756 | |||
757 | static struct tid_ampdu_tx * | ||
758 | ieee80211_lookup_tid_tx(struct ieee80211_sub_if_data *sdata, | ||
759 | const u8 *ra, u16 tid, struct sta_info **sta) | ||
760 | { | ||
761 | struct tid_ampdu_tx *tid_tx; | ||
752 | 762 | ||
753 | if (tid >= IEEE80211_NUM_TIDS) { | 763 | if (tid >= IEEE80211_NUM_TIDS) { |
754 | ht_dbg(sdata, "Bad TID value: tid = %d (>= %d)\n", | 764 | ht_dbg(sdata, "Bad TID value: tid = %d (>= %d)\n", |
755 | tid, IEEE80211_NUM_TIDS); | 765 | tid, IEEE80211_NUM_TIDS); |
756 | return; | 766 | return NULL; |
757 | } | 767 | } |
758 | 768 | ||
759 | mutex_lock(&local->sta_mtx); | 769 | *sta = sta_info_get_bss(sdata, ra); |
760 | sta = sta_info_get_bss(sdata, ra); | 770 | if (!*sta) { |
761 | if (!sta) { | ||
762 | mutex_unlock(&local->sta_mtx); | ||
763 | ht_dbg(sdata, "Could not find station: %pM\n", ra); | 771 | ht_dbg(sdata, "Could not find station: %pM\n", ra); |
764 | return; | 772 | return NULL; |
765 | } | 773 | } |
766 | 774 | ||
767 | mutex_lock(&sta->ampdu_mlme.mtx); | 775 | tid_tx = rcu_dereference((*sta)->ampdu_mlme.tid_tx[tid]); |
768 | tid_tx = rcu_dereference_protected_tid_tx(sta, tid); | ||
769 | 776 | ||
770 | if (WARN_ON(!tid_tx)) { | 777 | if (WARN_ON(!tid_tx)) |
771 | ht_dbg(sdata, "addBA was not requested!\n"); | 778 | ht_dbg(sdata, "addBA was not requested!\n"); |
772 | goto unlock; | ||
773 | } | ||
774 | 779 | ||
775 | if (WARN_ON(test_and_set_bit(HT_AGG_STATE_DRV_READY, &tid_tx->state))) | 780 | return tid_tx; |
776 | goto unlock; | ||
777 | |||
778 | if (test_bit(HT_AGG_STATE_RESPONSE_RECEIVED, &tid_tx->state)) | ||
779 | ieee80211_agg_tx_operational(local, sta, tid); | ||
780 | |||
781 | unlock: | ||
782 | mutex_unlock(&sta->ampdu_mlme.mtx); | ||
783 | mutex_unlock(&local->sta_mtx); | ||
784 | } | 781 | } |
785 | 782 | ||
786 | void ieee80211_start_tx_ba_cb_irqsafe(struct ieee80211_vif *vif, | 783 | void ieee80211_start_tx_ba_cb_irqsafe(struct ieee80211_vif *vif, |
@@ -788,19 +785,20 @@ void ieee80211_start_tx_ba_cb_irqsafe(struct ieee80211_vif *vif, | |||
788 | { | 785 | { |
789 | struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); | 786 | struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); |
790 | struct ieee80211_local *local = sdata->local; | 787 | struct ieee80211_local *local = sdata->local; |
791 | struct ieee80211_ra_tid *ra_tid; | 788 | struct sta_info *sta; |
792 | struct sk_buff *skb = dev_alloc_skb(0); | 789 | struct tid_ampdu_tx *tid_tx; |
793 | 790 | ||
794 | if (unlikely(!skb)) | 791 | trace_api_start_tx_ba_cb(sdata, ra, tid); |
795 | return; | ||
796 | 792 | ||
797 | ra_tid = (struct ieee80211_ra_tid *) &skb->cb; | 793 | rcu_read_lock(); |
798 | memcpy(&ra_tid->ra, ra, ETH_ALEN); | 794 | tid_tx = ieee80211_lookup_tid_tx(sdata, ra, tid, &sta); |
799 | ra_tid->tid = tid; | 795 | if (!tid_tx) |
796 | goto out; | ||
800 | 797 | ||
801 | skb->pkt_type = IEEE80211_SDATA_QUEUE_AGG_START; | 798 | set_bit(HT_AGG_STATE_START_CB, &tid_tx->state); |
802 | skb_queue_tail(&sdata->skb_queue, skb); | 799 | ieee80211_queue_work(&local->hw, &sta->ampdu_mlme.work); |
803 | ieee80211_queue_work(&local->hw, &sdata->work); | 800 | out: |
801 | rcu_read_unlock(); | ||
804 | } | 802 | } |
805 | EXPORT_SYMBOL(ieee80211_start_tx_ba_cb_irqsafe); | 803 | EXPORT_SYMBOL(ieee80211_start_tx_ba_cb_irqsafe); |
806 | 804 | ||
@@ -860,37 +858,18 @@ int ieee80211_stop_tx_ba_session(struct ieee80211_sta *pubsta, u16 tid) | |||
860 | } | 858 | } |
861 | EXPORT_SYMBOL(ieee80211_stop_tx_ba_session); | 859 | EXPORT_SYMBOL(ieee80211_stop_tx_ba_session); |
862 | 860 | ||
863 | void ieee80211_stop_tx_ba_cb(struct ieee80211_vif *vif, u8 *ra, u8 tid) | 861 | void ieee80211_stop_tx_ba_cb(struct sta_info *sta, int tid, |
862 | struct tid_ampdu_tx *tid_tx) | ||
864 | { | 863 | { |
865 | struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); | 864 | struct ieee80211_sub_if_data *sdata = sta->sdata; |
866 | struct ieee80211_local *local = sdata->local; | ||
867 | struct sta_info *sta; | ||
868 | struct tid_ampdu_tx *tid_tx; | ||
869 | bool send_delba = false; | 865 | bool send_delba = false; |
870 | 866 | ||
871 | trace_api_stop_tx_ba_cb(sdata, ra, tid); | 867 | ht_dbg(sdata, "Stopping Tx BA session for %pM tid %d\n", |
872 | 868 | sta->sta.addr, tid); | |
873 | if (tid >= IEEE80211_NUM_TIDS) { | ||
874 | ht_dbg(sdata, "Bad TID value: tid = %d (>= %d)\n", | ||
875 | tid, IEEE80211_NUM_TIDS); | ||
876 | return; | ||
877 | } | ||
878 | |||
879 | ht_dbg(sdata, "Stopping Tx BA session for %pM tid %d\n", ra, tid); | ||
880 | |||
881 | mutex_lock(&local->sta_mtx); | ||
882 | |||
883 | sta = sta_info_get_bss(sdata, ra); | ||
884 | if (!sta) { | ||
885 | ht_dbg(sdata, "Could not find station: %pM\n", ra); | ||
886 | goto unlock; | ||
887 | } | ||
888 | 869 | ||
889 | mutex_lock(&sta->ampdu_mlme.mtx); | ||
890 | spin_lock_bh(&sta->lock); | 870 | spin_lock_bh(&sta->lock); |
891 | tid_tx = rcu_dereference_protected_tid_tx(sta, tid); | ||
892 | 871 | ||
893 | if (!tid_tx || !test_bit(HT_AGG_STATE_STOPPING, &tid_tx->state)) { | 872 | if (!test_bit(HT_AGG_STATE_STOPPING, &tid_tx->state)) { |
894 | ht_dbg(sdata, | 873 | ht_dbg(sdata, |
895 | "unexpected callback to A-MPDU stop for %pM tid %d\n", | 874 | "unexpected callback to A-MPDU stop for %pM tid %d\n", |
896 | sta->sta.addr, tid); | 875 | sta->sta.addr, tid); |
@@ -906,12 +885,8 @@ void ieee80211_stop_tx_ba_cb(struct ieee80211_vif *vif, u8 *ra, u8 tid) | |||
906 | spin_unlock_bh(&sta->lock); | 885 | spin_unlock_bh(&sta->lock); |
907 | 886 | ||
908 | if (send_delba) | 887 | if (send_delba) |
909 | ieee80211_send_delba(sdata, ra, tid, | 888 | ieee80211_send_delba(sdata, sta->sta.addr, tid, |
910 | WLAN_BACK_INITIATOR, WLAN_REASON_QSTA_NOT_USE); | 889 | WLAN_BACK_INITIATOR, WLAN_REASON_QSTA_NOT_USE); |
911 | |||
912 | mutex_unlock(&sta->ampdu_mlme.mtx); | ||
913 | unlock: | ||
914 | mutex_unlock(&local->sta_mtx); | ||
915 | } | 890 | } |
916 | 891 | ||
917 | void ieee80211_stop_tx_ba_cb_irqsafe(struct ieee80211_vif *vif, | 892 | void ieee80211_stop_tx_ba_cb_irqsafe(struct ieee80211_vif *vif, |
@@ -919,19 +894,20 @@ void ieee80211_stop_tx_ba_cb_irqsafe(struct ieee80211_vif *vif, | |||
919 | { | 894 | { |
920 | struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); | 895 | struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); |
921 | struct ieee80211_local *local = sdata->local; | 896 | struct ieee80211_local *local = sdata->local; |
922 | struct ieee80211_ra_tid *ra_tid; | 897 | struct sta_info *sta; |
923 | struct sk_buff *skb = dev_alloc_skb(0); | 898 | struct tid_ampdu_tx *tid_tx; |
924 | 899 | ||
925 | if (unlikely(!skb)) | 900 | trace_api_stop_tx_ba_cb(sdata, ra, tid); |
926 | return; | ||
927 | 901 | ||
928 | ra_tid = (struct ieee80211_ra_tid *) &skb->cb; | 902 | rcu_read_lock(); |
929 | memcpy(&ra_tid->ra, ra, ETH_ALEN); | 903 | tid_tx = ieee80211_lookup_tid_tx(sdata, ra, tid, &sta); |
930 | ra_tid->tid = tid; | 904 | if (!tid_tx) |
905 | goto out; | ||
931 | 906 | ||
932 | skb->pkt_type = IEEE80211_SDATA_QUEUE_AGG_STOP; | 907 | set_bit(HT_AGG_STATE_STOP_CB, &tid_tx->state); |
933 | skb_queue_tail(&sdata->skb_queue, skb); | 908 | ieee80211_queue_work(&local->hw, &sta->ampdu_mlme.work); |
934 | ieee80211_queue_work(&local->hw, &sdata->work); | 909 | out: |
910 | rcu_read_unlock(); | ||
935 | } | 911 | } |
936 | EXPORT_SYMBOL(ieee80211_stop_tx_ba_cb_irqsafe); | 912 | EXPORT_SYMBOL(ieee80211_stop_tx_ba_cb_irqsafe); |
937 | 913 | ||
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c index 6c2e6060cd54..4a388fe8c2d1 100644 --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c | |||
@@ -902,6 +902,8 @@ static int ieee80211_start_ap(struct wiphy *wiphy, struct net_device *dev, | |||
902 | default: | 902 | default: |
903 | return -EINVAL; | 903 | return -EINVAL; |
904 | } | 904 | } |
905 | sdata->u.ap.req_smps = sdata->smps_mode; | ||
906 | |||
905 | sdata->needed_rx_chains = sdata->local->rx_chains; | 907 | sdata->needed_rx_chains = sdata->local->rx_chains; |
906 | 908 | ||
907 | sdata->vif.bss_conf.beacon_int = params->beacon_interval; | 909 | sdata->vif.bss_conf.beacon_int = params->beacon_interval; |
diff --git a/net/mac80211/ht.c b/net/mac80211/ht.c index f4a528773563..6ca5442b1e03 100644 --- a/net/mac80211/ht.c +++ b/net/mac80211/ht.c | |||
@@ -7,6 +7,7 @@ | |||
7 | * Copyright 2006-2007 Jiri Benc <jbenc@suse.cz> | 7 | * Copyright 2006-2007 Jiri Benc <jbenc@suse.cz> |
8 | * Copyright 2007, Michael Wu <flamingice@sourmilk.net> | 8 | * Copyright 2007, Michael Wu <flamingice@sourmilk.net> |
9 | * Copyright 2007-2010, Intel Corporation | 9 | * Copyright 2007-2010, Intel Corporation |
10 | * Copyright 2017 Intel Deutschland GmbH | ||
10 | * | 11 | * |
11 | * This program is free software; you can redistribute it and/or modify | 12 | * This program is free software; you can redistribute it and/or modify |
12 | * it under the terms of the GNU General Public License version 2 as | 13 | * it under the terms of the GNU General Public License version 2 as |
@@ -289,8 +290,6 @@ void ieee80211_sta_tear_down_BA_sessions(struct sta_info *sta, | |||
289 | { | 290 | { |
290 | int i; | 291 | int i; |
291 | 292 | ||
292 | cancel_work_sync(&sta->ampdu_mlme.work); | ||
293 | |||
294 | for (i = 0; i < IEEE80211_NUM_TIDS; i++) { | 293 | for (i = 0; i < IEEE80211_NUM_TIDS; i++) { |
295 | __ieee80211_stop_tx_ba_session(sta, i, reason); | 294 | __ieee80211_stop_tx_ba_session(sta, i, reason); |
296 | __ieee80211_stop_rx_ba_session(sta, i, WLAN_BACK_RECIPIENT, | 295 | __ieee80211_stop_rx_ba_session(sta, i, WLAN_BACK_RECIPIENT, |
@@ -298,6 +297,9 @@ void ieee80211_sta_tear_down_BA_sessions(struct sta_info *sta, | |||
298 | reason != AGG_STOP_DESTROY_STA && | 297 | reason != AGG_STOP_DESTROY_STA && |
299 | reason != AGG_STOP_PEER_REQUEST); | 298 | reason != AGG_STOP_PEER_REQUEST); |
300 | } | 299 | } |
300 | |||
301 | /* stopping might queue the work again - so cancel only afterwards */ | ||
302 | cancel_work_sync(&sta->ampdu_mlme.work); | ||
301 | } | 303 | } |
302 | 304 | ||
303 | void ieee80211_ba_session_work(struct work_struct *work) | 305 | void ieee80211_ba_session_work(struct work_struct *work) |
@@ -352,10 +354,16 @@ void ieee80211_ba_session_work(struct work_struct *work) | |||
352 | spin_unlock_bh(&sta->lock); | 354 | spin_unlock_bh(&sta->lock); |
353 | 355 | ||
354 | tid_tx = rcu_dereference_protected_tid_tx(sta, tid); | 356 | tid_tx = rcu_dereference_protected_tid_tx(sta, tid); |
355 | if (tid_tx && test_and_clear_bit(HT_AGG_STATE_WANT_STOP, | 357 | if (!tid_tx) |
356 | &tid_tx->state)) | 358 | continue; |
359 | |||
360 | if (test_and_clear_bit(HT_AGG_STATE_START_CB, &tid_tx->state)) | ||
361 | ieee80211_start_tx_ba_cb(sta, tid, tid_tx); | ||
362 | if (test_and_clear_bit(HT_AGG_STATE_WANT_STOP, &tid_tx->state)) | ||
357 | ___ieee80211_stop_tx_ba_session(sta, tid, | 363 | ___ieee80211_stop_tx_ba_session(sta, tid, |
358 | AGG_STOP_LOCAL_REQUEST); | 364 | AGG_STOP_LOCAL_REQUEST); |
365 | if (test_and_clear_bit(HT_AGG_STATE_STOP_CB, &tid_tx->state)) | ||
366 | ieee80211_stop_tx_ba_cb(sta, tid, tid_tx); | ||
359 | } | 367 | } |
360 | mutex_unlock(&sta->ampdu_mlme.mtx); | 368 | mutex_unlock(&sta->ampdu_mlme.mtx); |
361 | } | 369 | } |
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h index f8f6c148f554..5e002f62c235 100644 --- a/net/mac80211/ieee80211_i.h +++ b/net/mac80211/ieee80211_i.h | |||
@@ -1036,8 +1036,6 @@ struct ieee80211_rx_agg { | |||
1036 | 1036 | ||
1037 | enum sdata_queue_type { | 1037 | enum sdata_queue_type { |
1038 | IEEE80211_SDATA_QUEUE_TYPE_FRAME = 0, | 1038 | IEEE80211_SDATA_QUEUE_TYPE_FRAME = 0, |
1039 | IEEE80211_SDATA_QUEUE_AGG_START = 1, | ||
1040 | IEEE80211_SDATA_QUEUE_AGG_STOP = 2, | ||
1041 | IEEE80211_SDATA_QUEUE_RX_AGG_START = 3, | 1039 | IEEE80211_SDATA_QUEUE_RX_AGG_START = 3, |
1042 | IEEE80211_SDATA_QUEUE_RX_AGG_STOP = 4, | 1040 | IEEE80211_SDATA_QUEUE_RX_AGG_STOP = 4, |
1043 | }; | 1041 | }; |
@@ -1427,12 +1425,6 @@ ieee80211_get_sband(struct ieee80211_sub_if_data *sdata) | |||
1427 | return local->hw.wiphy->bands[band]; | 1425 | return local->hw.wiphy->bands[band]; |
1428 | } | 1426 | } |
1429 | 1427 | ||
1430 | /* this struct represents 802.11n's RA/TID combination */ | ||
1431 | struct ieee80211_ra_tid { | ||
1432 | u8 ra[ETH_ALEN]; | ||
1433 | u16 tid; | ||
1434 | }; | ||
1435 | |||
1436 | /* this struct holds the value parsing from channel switch IE */ | 1428 | /* this struct holds the value parsing from channel switch IE */ |
1437 | struct ieee80211_csa_ie { | 1429 | struct ieee80211_csa_ie { |
1438 | struct cfg80211_chan_def chandef; | 1430 | struct cfg80211_chan_def chandef; |
@@ -1539,7 +1531,7 @@ ieee80211_have_rx_timestamp(struct ieee80211_rx_status *status) | |||
1539 | return true; | 1531 | return true; |
1540 | /* can't handle non-legacy preamble yet */ | 1532 | /* can't handle non-legacy preamble yet */ |
1541 | if (status->flag & RX_FLAG_MACTIME_PLCP_START && | 1533 | if (status->flag & RX_FLAG_MACTIME_PLCP_START && |
1542 | status->encoding != RX_ENC_LEGACY) | 1534 | status->encoding == RX_ENC_LEGACY) |
1543 | return true; | 1535 | return true; |
1544 | return false; | 1536 | return false; |
1545 | } | 1537 | } |
@@ -1794,8 +1786,10 @@ int __ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid, | |||
1794 | enum ieee80211_agg_stop_reason reason); | 1786 | enum ieee80211_agg_stop_reason reason); |
1795 | int ___ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid, | 1787 | int ___ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid, |
1796 | enum ieee80211_agg_stop_reason reason); | 1788 | enum ieee80211_agg_stop_reason reason); |
1797 | void ieee80211_start_tx_ba_cb(struct ieee80211_vif *vif, u8 *ra, u16 tid); | 1789 | void ieee80211_start_tx_ba_cb(struct sta_info *sta, int tid, |
1798 | void ieee80211_stop_tx_ba_cb(struct ieee80211_vif *vif, u8 *ra, u8 tid); | 1790 | struct tid_ampdu_tx *tid_tx); |
1791 | void ieee80211_stop_tx_ba_cb(struct sta_info *sta, int tid, | ||
1792 | struct tid_ampdu_tx *tid_tx); | ||
1799 | void ieee80211_ba_session_work(struct work_struct *work); | 1793 | void ieee80211_ba_session_work(struct work_struct *work); |
1800 | void ieee80211_tx_ba_session_handle_start(struct sta_info *sta, int tid); | 1794 | void ieee80211_tx_ba_session_handle_start(struct sta_info *sta, int tid); |
1801 | void ieee80211_release_reorder_timeout(struct sta_info *sta, int tid); | 1795 | void ieee80211_release_reorder_timeout(struct sta_info *sta, int tid); |
diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c index 3bd5b81f5d81..f5f50150ba1c 100644 --- a/net/mac80211/iface.c +++ b/net/mac80211/iface.c | |||
@@ -1213,7 +1213,6 @@ static const struct net_device_ops ieee80211_monitorif_ops = { | |||
1213 | static void ieee80211_if_free(struct net_device *dev) | 1213 | static void ieee80211_if_free(struct net_device *dev) |
1214 | { | 1214 | { |
1215 | free_percpu(dev->tstats); | 1215 | free_percpu(dev->tstats); |
1216 | free_netdev(dev); | ||
1217 | } | 1216 | } |
1218 | 1217 | ||
1219 | static void ieee80211_if_setup(struct net_device *dev) | 1218 | static void ieee80211_if_setup(struct net_device *dev) |
@@ -1221,7 +1220,8 @@ static void ieee80211_if_setup(struct net_device *dev) | |||
1221 | ether_setup(dev); | 1220 | ether_setup(dev); |
1222 | dev->priv_flags &= ~IFF_TX_SKB_SHARING; | 1221 | dev->priv_flags &= ~IFF_TX_SKB_SHARING; |
1223 | dev->netdev_ops = &ieee80211_dataif_ops; | 1222 | dev->netdev_ops = &ieee80211_dataif_ops; |
1224 | dev->destructor = ieee80211_if_free; | 1223 | dev->needs_free_netdev = true; |
1224 | dev->priv_destructor = ieee80211_if_free; | ||
1225 | } | 1225 | } |
1226 | 1226 | ||
1227 | static void ieee80211_if_setup_no_queue(struct net_device *dev) | 1227 | static void ieee80211_if_setup_no_queue(struct net_device *dev) |
@@ -1237,7 +1237,6 @@ static void ieee80211_iface_work(struct work_struct *work) | |||
1237 | struct ieee80211_local *local = sdata->local; | 1237 | struct ieee80211_local *local = sdata->local; |
1238 | struct sk_buff *skb; | 1238 | struct sk_buff *skb; |
1239 | struct sta_info *sta; | 1239 | struct sta_info *sta; |
1240 | struct ieee80211_ra_tid *ra_tid; | ||
1241 | struct ieee80211_rx_agg *rx_agg; | 1240 | struct ieee80211_rx_agg *rx_agg; |
1242 | 1241 | ||
1243 | if (!ieee80211_sdata_running(sdata)) | 1242 | if (!ieee80211_sdata_running(sdata)) |
@@ -1253,15 +1252,7 @@ static void ieee80211_iface_work(struct work_struct *work) | |||
1253 | while ((skb = skb_dequeue(&sdata->skb_queue))) { | 1252 | while ((skb = skb_dequeue(&sdata->skb_queue))) { |
1254 | struct ieee80211_mgmt *mgmt = (void *)skb->data; | 1253 | struct ieee80211_mgmt *mgmt = (void *)skb->data; |
1255 | 1254 | ||
1256 | if (skb->pkt_type == IEEE80211_SDATA_QUEUE_AGG_START) { | 1255 | if (skb->pkt_type == IEEE80211_SDATA_QUEUE_RX_AGG_START) { |
1257 | ra_tid = (void *)&skb->cb; | ||
1258 | ieee80211_start_tx_ba_cb(&sdata->vif, ra_tid->ra, | ||
1259 | ra_tid->tid); | ||
1260 | } else if (skb->pkt_type == IEEE80211_SDATA_QUEUE_AGG_STOP) { | ||
1261 | ra_tid = (void *)&skb->cb; | ||
1262 | ieee80211_stop_tx_ba_cb(&sdata->vif, ra_tid->ra, | ||
1263 | ra_tid->tid); | ||
1264 | } else if (skb->pkt_type == IEEE80211_SDATA_QUEUE_RX_AGG_START) { | ||
1265 | rx_agg = (void *)&skb->cb; | 1256 | rx_agg = (void *)&skb->cb; |
1266 | mutex_lock(&local->sta_mtx); | 1257 | mutex_lock(&local->sta_mtx); |
1267 | sta = sta_info_get_bss(sdata, rx_agg->addr); | 1258 | sta = sta_info_get_bss(sdata, rx_agg->addr); |
@@ -1825,6 +1816,7 @@ int ieee80211_if_add(struct ieee80211_local *local, const char *name, | |||
1825 | ret = dev_alloc_name(ndev, ndev->name); | 1816 | ret = dev_alloc_name(ndev, ndev->name); |
1826 | if (ret < 0) { | 1817 | if (ret < 0) { |
1827 | ieee80211_if_free(ndev); | 1818 | ieee80211_if_free(ndev); |
1819 | free_netdev(ndev); | ||
1828 | return ret; | 1820 | return ret; |
1829 | } | 1821 | } |
1830 | 1822 | ||
@@ -1914,7 +1906,7 @@ int ieee80211_if_add(struct ieee80211_local *local, const char *name, | |||
1914 | 1906 | ||
1915 | ret = register_netdevice(ndev); | 1907 | ret = register_netdevice(ndev); |
1916 | if (ret) { | 1908 | if (ret) { |
1917 | ieee80211_if_free(ndev); | 1909 | free_netdev(ndev); |
1918 | return ret; | 1910 | return ret; |
1919 | } | 1911 | } |
1920 | } | 1912 | } |
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index 0ea9712bd99e..cc8e6ea1b27e 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c | |||
@@ -601,7 +601,7 @@ static void ieee80211_send_assoc(struct ieee80211_sub_if_data *sdata) | |||
601 | struct ieee80211_supported_band *sband; | 601 | struct ieee80211_supported_band *sband; |
602 | struct ieee80211_chanctx_conf *chanctx_conf; | 602 | struct ieee80211_chanctx_conf *chanctx_conf; |
603 | struct ieee80211_channel *chan; | 603 | struct ieee80211_channel *chan; |
604 | u32 rate_flags, rates = 0; | 604 | u32 rates = 0; |
605 | 605 | ||
606 | sdata_assert_lock(sdata); | 606 | sdata_assert_lock(sdata); |
607 | 607 | ||
@@ -612,7 +612,6 @@ static void ieee80211_send_assoc(struct ieee80211_sub_if_data *sdata) | |||
612 | return; | 612 | return; |
613 | } | 613 | } |
614 | chan = chanctx_conf->def.chan; | 614 | chan = chanctx_conf->def.chan; |
615 | rate_flags = ieee80211_chandef_rate_flags(&chanctx_conf->def); | ||
616 | rcu_read_unlock(); | 615 | rcu_read_unlock(); |
617 | sband = local->hw.wiphy->bands[chan->band]; | 616 | sband = local->hw.wiphy->bands[chan->band]; |
618 | shift = ieee80211_vif_get_shift(&sdata->vif); | 617 | shift = ieee80211_vif_get_shift(&sdata->vif); |
@@ -636,9 +635,6 @@ static void ieee80211_send_assoc(struct ieee80211_sub_if_data *sdata) | |||
636 | */ | 635 | */ |
637 | rates_len = 0; | 636 | rates_len = 0; |
638 | for (i = 0; i < sband->n_bitrates; i++) { | 637 | for (i = 0; i < sband->n_bitrates; i++) { |
639 | if ((rate_flags & sband->bitrates[i].flags) | ||
640 | != rate_flags) | ||
641 | continue; | ||
642 | rates |= BIT(i); | 638 | rates |= BIT(i); |
643 | rates_len++; | 639 | rates_len++; |
644 | } | 640 | } |
@@ -2818,7 +2814,7 @@ static void ieee80211_get_rates(struct ieee80211_supported_band *sband, | |||
2818 | u32 *rates, u32 *basic_rates, | 2814 | u32 *rates, u32 *basic_rates, |
2819 | bool *have_higher_than_11mbit, | 2815 | bool *have_higher_than_11mbit, |
2820 | int *min_rate, int *min_rate_index, | 2816 | int *min_rate, int *min_rate_index, |
2821 | int shift, u32 rate_flags) | 2817 | int shift) |
2822 | { | 2818 | { |
2823 | int i, j; | 2819 | int i, j; |
2824 | 2820 | ||
@@ -2846,8 +2842,6 @@ static void ieee80211_get_rates(struct ieee80211_supported_band *sband, | |||
2846 | int brate; | 2842 | int brate; |
2847 | 2843 | ||
2848 | br = &sband->bitrates[j]; | 2844 | br = &sband->bitrates[j]; |
2849 | if ((rate_flags & br->flags) != rate_flags) | ||
2850 | continue; | ||
2851 | 2845 | ||
2852 | brate = DIV_ROUND_UP(br->bitrate, (1 << shift) * 5); | 2846 | brate = DIV_ROUND_UP(br->bitrate, (1 << shift) * 5); |
2853 | if (brate == rate) { | 2847 | if (brate == rate) { |
@@ -4398,40 +4392,32 @@ static int ieee80211_prep_connection(struct ieee80211_sub_if_data *sdata, | |||
4398 | return -ENOMEM; | 4392 | return -ENOMEM; |
4399 | } | 4393 | } |
4400 | 4394 | ||
4401 | if (new_sta || override) { | 4395 | /* |
4402 | err = ieee80211_prep_channel(sdata, cbss); | 4396 | * Set up the information for the new channel before setting the |
4403 | if (err) { | 4397 | * new channel. We can't - completely race-free - change the basic |
4404 | if (new_sta) | 4398 | * rates bitmap and the channel (sband) that it refers to, but if |
4405 | sta_info_free(local, new_sta); | 4399 | * we set it up before we at least avoid calling into the driver's |
4406 | return -EINVAL; | 4400 | * bss_info_changed() method with invalid information (since we do |
4407 | } | 4401 | * call that from changing the channel - only for IDLE and perhaps |
4408 | } | 4402 | * some others, but ...). |
4409 | 4403 | * | |
4404 | * So to avoid that, just set up all the new information before the | ||
4405 | * channel, but tell the driver to apply it only afterwards, since | ||
4406 | * it might need the new channel for that. | ||
4407 | */ | ||
4410 | if (new_sta) { | 4408 | if (new_sta) { |
4411 | u32 rates = 0, basic_rates = 0; | 4409 | u32 rates = 0, basic_rates = 0; |
4412 | bool have_higher_than_11mbit; | 4410 | bool have_higher_than_11mbit; |
4413 | int min_rate = INT_MAX, min_rate_index = -1; | 4411 | int min_rate = INT_MAX, min_rate_index = -1; |
4414 | struct ieee80211_chanctx_conf *chanctx_conf; | ||
4415 | const struct cfg80211_bss_ies *ies; | 4412 | const struct cfg80211_bss_ies *ies; |
4416 | int shift = ieee80211_vif_get_shift(&sdata->vif); | 4413 | int shift = ieee80211_vif_get_shift(&sdata->vif); |
4417 | u32 rate_flags; | ||
4418 | |||
4419 | rcu_read_lock(); | ||
4420 | chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf); | ||
4421 | if (WARN_ON(!chanctx_conf)) { | ||
4422 | rcu_read_unlock(); | ||
4423 | sta_info_free(local, new_sta); | ||
4424 | return -EINVAL; | ||
4425 | } | ||
4426 | rate_flags = ieee80211_chandef_rate_flags(&chanctx_conf->def); | ||
4427 | rcu_read_unlock(); | ||
4428 | 4414 | ||
4429 | ieee80211_get_rates(sband, bss->supp_rates, | 4415 | ieee80211_get_rates(sband, bss->supp_rates, |
4430 | bss->supp_rates_len, | 4416 | bss->supp_rates_len, |
4431 | &rates, &basic_rates, | 4417 | &rates, &basic_rates, |
4432 | &have_higher_than_11mbit, | 4418 | &have_higher_than_11mbit, |
4433 | &min_rate, &min_rate_index, | 4419 | &min_rate, &min_rate_index, |
4434 | shift, rate_flags); | 4420 | shift); |
4435 | 4421 | ||
4436 | /* | 4422 | /* |
4437 | * This used to be a workaround for basic rates missing | 4423 | * This used to be a workaround for basic rates missing |
@@ -4489,8 +4475,22 @@ static int ieee80211_prep_connection(struct ieee80211_sub_if_data *sdata, | |||
4489 | sdata->vif.bss_conf.sync_dtim_count = 0; | 4475 | sdata->vif.bss_conf.sync_dtim_count = 0; |
4490 | } | 4476 | } |
4491 | rcu_read_unlock(); | 4477 | rcu_read_unlock(); |
4478 | } | ||
4492 | 4479 | ||
4493 | /* tell driver about BSSID, basic rates and timing */ | 4480 | if (new_sta || override) { |
4481 | err = ieee80211_prep_channel(sdata, cbss); | ||
4482 | if (err) { | ||
4483 | if (new_sta) | ||
4484 | sta_info_free(local, new_sta); | ||
4485 | return -EINVAL; | ||
4486 | } | ||
4487 | } | ||
4488 | |||
4489 | if (new_sta) { | ||
4490 | /* | ||
4491 | * tell driver about BSSID, basic rates and timing | ||
4492 | * this was set up above, before setting the channel | ||
4493 | */ | ||
4494 | ieee80211_bss_info_change_notify(sdata, | 4494 | ieee80211_bss_info_change_notify(sdata, |
4495 | BSS_CHANGED_BSSID | BSS_CHANGED_BASIC_RATES | | 4495 | BSS_CHANGED_BSSID | BSS_CHANGED_BASIC_RATES | |
4496 | BSS_CHANGED_BEACON_INT); | 4496 | BSS_CHANGED_BEACON_INT); |
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c index 1f75280ba26c..3674fe3d67dc 100644 --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c | |||
@@ -1613,12 +1613,16 @@ ieee80211_rx_h_sta_process(struct ieee80211_rx_data *rx) | |||
1613 | */ | 1613 | */ |
1614 | if (!ieee80211_hw_check(&sta->local->hw, AP_LINK_PS) && | 1614 | if (!ieee80211_hw_check(&sta->local->hw, AP_LINK_PS) && |
1615 | !ieee80211_has_morefrags(hdr->frame_control) && | 1615 | !ieee80211_has_morefrags(hdr->frame_control) && |
1616 | !ieee80211_is_back_req(hdr->frame_control) && | ||
1616 | !(status->rx_flags & IEEE80211_RX_DEFERRED_RELEASE) && | 1617 | !(status->rx_flags & IEEE80211_RX_DEFERRED_RELEASE) && |
1617 | (rx->sdata->vif.type == NL80211_IFTYPE_AP || | 1618 | (rx->sdata->vif.type == NL80211_IFTYPE_AP || |
1618 | rx->sdata->vif.type == NL80211_IFTYPE_AP_VLAN) && | 1619 | rx->sdata->vif.type == NL80211_IFTYPE_AP_VLAN) && |
1619 | /* PM bit is only checked in frames where it isn't reserved, | 1620 | /* |
1621 | * PM bit is only checked in frames where it isn't reserved, | ||
1620 | * in AP mode it's reserved in non-bufferable management frames | 1622 | * in AP mode it's reserved in non-bufferable management frames |
1621 | * (cf. IEEE 802.11-2012 8.2.4.1.7 Power Management field) | 1623 | * (cf. IEEE 802.11-2012 8.2.4.1.7 Power Management field) |
1624 | * BAR frames should be ignored as specified in | ||
1625 | * IEEE 802.11-2012 10.2.1.2. | ||
1622 | */ | 1626 | */ |
1623 | (!ieee80211_is_mgmt(hdr->frame_control) || | 1627 | (!ieee80211_is_mgmt(hdr->frame_control) || |
1624 | ieee80211_is_bufferable_mmpdu(hdr->frame_control))) { | 1628 | ieee80211_is_bufferable_mmpdu(hdr->frame_control))) { |
diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c index 7cdf7a835bb0..403e3cc58b57 100644 --- a/net/mac80211/sta_info.c +++ b/net/mac80211/sta_info.c | |||
@@ -2155,7 +2155,7 @@ void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo) | |||
2155 | struct ieee80211_sta_rx_stats *cpurxs; | 2155 | struct ieee80211_sta_rx_stats *cpurxs; |
2156 | 2156 | ||
2157 | cpurxs = per_cpu_ptr(sta->pcpu_rx_stats, cpu); | 2157 | cpurxs = per_cpu_ptr(sta->pcpu_rx_stats, cpu); |
2158 | sinfo->rx_packets += cpurxs->dropped; | 2158 | sinfo->rx_dropped_misc += cpurxs->dropped; |
2159 | } | 2159 | } |
2160 | } | 2160 | } |
2161 | 2161 | ||
diff --git a/net/mac80211/sta_info.h b/net/mac80211/sta_info.h index 5609cacb20d5..ea0747d6a6da 100644 --- a/net/mac80211/sta_info.h +++ b/net/mac80211/sta_info.h | |||
@@ -116,6 +116,8 @@ enum ieee80211_sta_info_flags { | |||
116 | #define HT_AGG_STATE_STOPPING 3 | 116 | #define HT_AGG_STATE_STOPPING 3 |
117 | #define HT_AGG_STATE_WANT_START 4 | 117 | #define HT_AGG_STATE_WANT_START 4 |
118 | #define HT_AGG_STATE_WANT_STOP 5 | 118 | #define HT_AGG_STATE_WANT_STOP 5 |
119 | #define HT_AGG_STATE_START_CB 6 | ||
120 | #define HT_AGG_STATE_STOP_CB 7 | ||
119 | 121 | ||
120 | enum ieee80211_agg_stop_reason { | 122 | enum ieee80211_agg_stop_reason { |
121 | AGG_STOP_DECLINED, | 123 | AGG_STOP_DECLINED, |
diff --git a/net/mac80211/wpa.c b/net/mac80211/wpa.c index c1ef22df865f..cc19614ff4e6 100644 --- a/net/mac80211/wpa.c +++ b/net/mac80211/wpa.c | |||
@@ -17,6 +17,7 @@ | |||
17 | #include <asm/unaligned.h> | 17 | #include <asm/unaligned.h> |
18 | #include <net/mac80211.h> | 18 | #include <net/mac80211.h> |
19 | #include <crypto/aes.h> | 19 | #include <crypto/aes.h> |
20 | #include <crypto/algapi.h> | ||
20 | 21 | ||
21 | #include "ieee80211_i.h" | 22 | #include "ieee80211_i.h" |
22 | #include "michael.h" | 23 | #include "michael.h" |
@@ -153,7 +154,7 @@ ieee80211_rx_h_michael_mic_verify(struct ieee80211_rx_data *rx) | |||
153 | data_len = skb->len - hdrlen - MICHAEL_MIC_LEN; | 154 | data_len = skb->len - hdrlen - MICHAEL_MIC_LEN; |
154 | key = &rx->key->conf.key[NL80211_TKIP_DATA_OFFSET_RX_MIC_KEY]; | 155 | key = &rx->key->conf.key[NL80211_TKIP_DATA_OFFSET_RX_MIC_KEY]; |
155 | michael_mic(key, hdr, data, data_len, mic); | 156 | michael_mic(key, hdr, data, data_len, mic); |
156 | if (memcmp(mic, data + data_len, MICHAEL_MIC_LEN) != 0) | 157 | if (crypto_memneq(mic, data + data_len, MICHAEL_MIC_LEN)) |
157 | goto mic_fail; | 158 | goto mic_fail; |
158 | 159 | ||
159 | /* remove Michael MIC from payload */ | 160 | /* remove Michael MIC from payload */ |
@@ -1048,7 +1049,7 @@ ieee80211_crypto_aes_cmac_decrypt(struct ieee80211_rx_data *rx) | |||
1048 | bip_aad(skb, aad); | 1049 | bip_aad(skb, aad); |
1049 | ieee80211_aes_cmac(key->u.aes_cmac.tfm, aad, | 1050 | ieee80211_aes_cmac(key->u.aes_cmac.tfm, aad, |
1050 | skb->data + 24, skb->len - 24, mic); | 1051 | skb->data + 24, skb->len - 24, mic); |
1051 | if (memcmp(mic, mmie->mic, sizeof(mmie->mic)) != 0) { | 1052 | if (crypto_memneq(mic, mmie->mic, sizeof(mmie->mic))) { |
1052 | key->u.aes_cmac.icverrors++; | 1053 | key->u.aes_cmac.icverrors++; |
1053 | return RX_DROP_UNUSABLE; | 1054 | return RX_DROP_UNUSABLE; |
1054 | } | 1055 | } |
@@ -1098,7 +1099,7 @@ ieee80211_crypto_aes_cmac_256_decrypt(struct ieee80211_rx_data *rx) | |||
1098 | bip_aad(skb, aad); | 1099 | bip_aad(skb, aad); |
1099 | ieee80211_aes_cmac_256(key->u.aes_cmac.tfm, aad, | 1100 | ieee80211_aes_cmac_256(key->u.aes_cmac.tfm, aad, |
1100 | skb->data + 24, skb->len - 24, mic); | 1101 | skb->data + 24, skb->len - 24, mic); |
1101 | if (memcmp(mic, mmie->mic, sizeof(mmie->mic)) != 0) { | 1102 | if (crypto_memneq(mic, mmie->mic, sizeof(mmie->mic))) { |
1102 | key->u.aes_cmac.icverrors++; | 1103 | key->u.aes_cmac.icverrors++; |
1103 | return RX_DROP_UNUSABLE; | 1104 | return RX_DROP_UNUSABLE; |
1104 | } | 1105 | } |
@@ -1202,7 +1203,7 @@ ieee80211_crypto_aes_gmac_decrypt(struct ieee80211_rx_data *rx) | |||
1202 | if (ieee80211_aes_gmac(key->u.aes_gmac.tfm, aad, nonce, | 1203 | if (ieee80211_aes_gmac(key->u.aes_gmac.tfm, aad, nonce, |
1203 | skb->data + 24, skb->len - 24, | 1204 | skb->data + 24, skb->len - 24, |
1204 | mic) < 0 || | 1205 | mic) < 0 || |
1205 | memcmp(mic, mmie->mic, sizeof(mmie->mic)) != 0) { | 1206 | crypto_memneq(mic, mmie->mic, sizeof(mmie->mic))) { |
1206 | key->u.aes_gmac.icverrors++; | 1207 | key->u.aes_gmac.icverrors++; |
1207 | return RX_DROP_UNUSABLE; | 1208 | return RX_DROP_UNUSABLE; |
1208 | } | 1209 | } |
diff --git a/net/mac802154/iface.c b/net/mac802154/iface.c index 06019dba4b10..bd88a9b80773 100644 --- a/net/mac802154/iface.c +++ b/net/mac802154/iface.c | |||
@@ -526,8 +526,6 @@ static void mac802154_wpan_free(struct net_device *dev) | |||
526 | struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev); | 526 | struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev); |
527 | 527 | ||
528 | mac802154_llsec_destroy(&sdata->sec); | 528 | mac802154_llsec_destroy(&sdata->sec); |
529 | |||
530 | free_netdev(dev); | ||
531 | } | 529 | } |
532 | 530 | ||
533 | static void ieee802154_if_setup(struct net_device *dev) | 531 | static void ieee802154_if_setup(struct net_device *dev) |
@@ -593,7 +591,8 @@ ieee802154_setup_sdata(struct ieee802154_sub_if_data *sdata, | |||
593 | sdata->dev->dev_addr); | 591 | sdata->dev->dev_addr); |
594 | 592 | ||
595 | sdata->dev->header_ops = &mac802154_header_ops; | 593 | sdata->dev->header_ops = &mac802154_header_ops; |
596 | sdata->dev->destructor = mac802154_wpan_free; | 594 | sdata->dev->needs_free_netdev = true; |
595 | sdata->dev->priv_destructor = mac802154_wpan_free; | ||
597 | sdata->dev->netdev_ops = &mac802154_wpan_ops; | 596 | sdata->dev->netdev_ops = &mac802154_wpan_ops; |
598 | sdata->dev->ml_priv = &mac802154_mlme_wpan; | 597 | sdata->dev->ml_priv = &mac802154_mlme_wpan; |
599 | wpan_dev->promiscuous_mode = false; | 598 | wpan_dev->promiscuous_mode = false; |
@@ -608,7 +607,7 @@ ieee802154_setup_sdata(struct ieee802154_sub_if_data *sdata, | |||
608 | 607 | ||
609 | break; | 608 | break; |
610 | case NL802154_IFTYPE_MONITOR: | 609 | case NL802154_IFTYPE_MONITOR: |
611 | sdata->dev->destructor = free_netdev; | 610 | sdata->dev->needs_free_netdev = true; |
612 | sdata->dev->netdev_ops = &mac802154_monitor_ops; | 611 | sdata->dev->netdev_ops = &mac802154_monitor_ops; |
613 | wpan_dev->promiscuous_mode = true; | 612 | wpan_dev->promiscuous_mode = true; |
614 | break; | 613 | break; |
diff --git a/net/mpls/af_mpls.c b/net/mpls/af_mpls.c index 257ec66009da..7b05fd1497ce 100644 --- a/net/mpls/af_mpls.c +++ b/net/mpls/af_mpls.c | |||
@@ -1418,7 +1418,7 @@ static void mpls_ifup(struct net_device *dev, unsigned int flags) | |||
1418 | continue; | 1418 | continue; |
1419 | alive++; | 1419 | alive++; |
1420 | nh_flags &= ~flags; | 1420 | nh_flags &= ~flags; |
1421 | WRITE_ONCE(nh->nh_flags, flags); | 1421 | WRITE_ONCE(nh->nh_flags, nh_flags); |
1422 | } endfor_nexthops(rt); | 1422 | } endfor_nexthops(rt); |
1423 | 1423 | ||
1424 | WRITE_ONCE(rt->rt_nhn_alive, alive); | 1424 | WRITE_ONCE(rt->rt_nhn_alive, alive); |
diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c index 9799a50bc604..a8be9b72e6cd 100644 --- a/net/netfilter/nf_conntrack_netlink.c +++ b/net/netfilter/nf_conntrack_netlink.c | |||
@@ -890,8 +890,13 @@ restart: | |||
890 | } | 890 | } |
891 | out: | 891 | out: |
892 | local_bh_enable(); | 892 | local_bh_enable(); |
893 | if (last) | 893 | if (last) { |
894 | /* nf ct hash resize happened, now clear the leftover. */ | ||
895 | if ((struct nf_conn *)cb->args[1] == last) | ||
896 | cb->args[1] = 0; | ||
897 | |||
894 | nf_ct_put(last); | 898 | nf_ct_put(last); |
899 | } | ||
895 | 900 | ||
896 | while (i) { | 901 | while (i) { |
897 | i--; | 902 | i--; |
diff --git a/net/netfilter/nf_conntrack_proto_sctp.c b/net/netfilter/nf_conntrack_proto_sctp.c index 13875d599a85..1c5b14a6cab3 100644 --- a/net/netfilter/nf_conntrack_proto_sctp.c +++ b/net/netfilter/nf_conntrack_proto_sctp.c | |||
@@ -512,16 +512,19 @@ static int sctp_error(struct net *net, struct nf_conn *tpl, struct sk_buff *skb, | |||
512 | u8 pf, unsigned int hooknum) | 512 | u8 pf, unsigned int hooknum) |
513 | { | 513 | { |
514 | const struct sctphdr *sh; | 514 | const struct sctphdr *sh; |
515 | struct sctphdr _sctph; | ||
516 | const char *logmsg; | 515 | const char *logmsg; |
517 | 516 | ||
518 | sh = skb_header_pointer(skb, dataoff, sizeof(_sctph), &_sctph); | 517 | if (skb->len < dataoff + sizeof(struct sctphdr)) { |
519 | if (!sh) { | ||
520 | logmsg = "nf_ct_sctp: short packet "; | 518 | logmsg = "nf_ct_sctp: short packet "; |
521 | goto out_invalid; | 519 | goto out_invalid; |
522 | } | 520 | } |
523 | if (net->ct.sysctl_checksum && hooknum == NF_INET_PRE_ROUTING && | 521 | if (net->ct.sysctl_checksum && hooknum == NF_INET_PRE_ROUTING && |
524 | skb->ip_summed == CHECKSUM_NONE) { | 522 | skb->ip_summed == CHECKSUM_NONE) { |
523 | if (!skb_make_writable(skb, dataoff + sizeof(struct sctphdr))) { | ||
524 | logmsg = "nf_ct_sctp: failed to read header "; | ||
525 | goto out_invalid; | ||
526 | } | ||
527 | sh = (const struct sctphdr *)(skb->data + dataoff); | ||
525 | if (sh->checksum != sctp_compute_cksum(skb, dataoff)) { | 528 | if (sh->checksum != sctp_compute_cksum(skb, dataoff)) { |
526 | logmsg = "nf_ct_sctp: bad CRC "; | 529 | logmsg = "nf_ct_sctp: bad CRC "; |
527 | goto out_invalid; | 530 | goto out_invalid; |
diff --git a/net/netfilter/nf_nat_core.c b/net/netfilter/nf_nat_core.c index ef0be325a0c6..6c72922d20ca 100644 --- a/net/netfilter/nf_nat_core.c +++ b/net/netfilter/nf_nat_core.c | |||
@@ -566,7 +566,7 @@ static int nf_nat_proto_clean(struct nf_conn *ct, void *data) | |||
566 | * Else, when the conntrack is destoyed, nf_nat_cleanup_conntrack() | 566 | * Else, when the conntrack is destoyed, nf_nat_cleanup_conntrack() |
567 | * will delete entry from already-freed table. | 567 | * will delete entry from already-freed table. |
568 | */ | 568 | */ |
569 | ct->status &= ~IPS_NAT_DONE_MASK; | 569 | clear_bit(IPS_SRC_NAT_DONE_BIT, &ct->status); |
570 | rhltable_remove(&nf_nat_bysource_table, &ct->nat_bysource, | 570 | rhltable_remove(&nf_nat_bysource_table, &ct->nat_bysource, |
571 | nf_nat_bysource_params); | 571 | nf_nat_bysource_params); |
572 | 572 | ||
diff --git a/net/netfilter/nft_set_rbtree.c b/net/netfilter/nft_set_rbtree.c index e97e2fb53f0a..fbdbaa00dd5f 100644 --- a/net/netfilter/nft_set_rbtree.c +++ b/net/netfilter/nft_set_rbtree.c | |||
@@ -116,17 +116,17 @@ static int __nft_rbtree_insert(const struct net *net, const struct nft_set *set, | |||
116 | else if (d > 0) | 116 | else if (d > 0) |
117 | p = &parent->rb_right; | 117 | p = &parent->rb_right; |
118 | else { | 118 | else { |
119 | if (nft_set_elem_active(&rbe->ext, genmask)) { | 119 | if (nft_rbtree_interval_end(rbe) && |
120 | if (nft_rbtree_interval_end(rbe) && | 120 | !nft_rbtree_interval_end(new)) { |
121 | !nft_rbtree_interval_end(new)) | 121 | p = &parent->rb_left; |
122 | p = &parent->rb_left; | 122 | } else if (!nft_rbtree_interval_end(rbe) && |
123 | else if (!nft_rbtree_interval_end(rbe) && | 123 | nft_rbtree_interval_end(new)) { |
124 | nft_rbtree_interval_end(new)) | 124 | p = &parent->rb_right; |
125 | p = &parent->rb_right; | 125 | } else if (nft_set_elem_active(&rbe->ext, genmask)) { |
126 | else { | 126 | *ext = &rbe->ext; |
127 | *ext = &rbe->ext; | 127 | return -EEXIST; |
128 | return -EEXIST; | 128 | } else { |
129 | } | 129 | p = &parent->rb_left; |
130 | } | 130 | } |
131 | } | 131 | } |
132 | } | 132 | } |
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index ee841f00a6ec..7586d446d7dc 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c | |||
@@ -62,6 +62,7 @@ | |||
62 | #include <asm/cacheflush.h> | 62 | #include <asm/cacheflush.h> |
63 | #include <linux/hash.h> | 63 | #include <linux/hash.h> |
64 | #include <linux/genetlink.h> | 64 | #include <linux/genetlink.h> |
65 | #include <linux/net_namespace.h> | ||
65 | 66 | ||
66 | #include <net/net_namespace.h> | 67 | #include <net/net_namespace.h> |
67 | #include <net/sock.h> | 68 | #include <net/sock.h> |
@@ -1415,7 +1416,8 @@ static void do_one_broadcast(struct sock *sk, | |||
1415 | goto out; | 1416 | goto out; |
1416 | } | 1417 | } |
1417 | NETLINK_CB(p->skb2).nsid = peernet2id(sock_net(sk), p->net); | 1418 | NETLINK_CB(p->skb2).nsid = peernet2id(sock_net(sk), p->net); |
1418 | NETLINK_CB(p->skb2).nsid_is_set = true; | 1419 | if (NETLINK_CB(p->skb2).nsid != NETNSA_NSID_NOT_ASSIGNED) |
1420 | NETLINK_CB(p->skb2).nsid_is_set = true; | ||
1419 | val = netlink_broadcast_deliver(sk, p->skb2); | 1421 | val = netlink_broadcast_deliver(sk, p->skb2); |
1420 | if (val < 0) { | 1422 | if (val < 0) { |
1421 | netlink_overrun(sk); | 1423 | netlink_overrun(sk); |
diff --git a/net/openvswitch/vport-internal_dev.c b/net/openvswitch/vport-internal_dev.c index 89193a634da4..04a3128adcf0 100644 --- a/net/openvswitch/vport-internal_dev.c +++ b/net/openvswitch/vport-internal_dev.c | |||
@@ -94,7 +94,6 @@ static void internal_dev_destructor(struct net_device *dev) | |||
94 | struct vport *vport = ovs_internal_dev_get_vport(dev); | 94 | struct vport *vport = ovs_internal_dev_get_vport(dev); |
95 | 95 | ||
96 | ovs_vport_free(vport); | 96 | ovs_vport_free(vport); |
97 | free_netdev(dev); | ||
98 | } | 97 | } |
99 | 98 | ||
100 | static void | 99 | static void |
@@ -156,7 +155,8 @@ static void do_setup(struct net_device *netdev) | |||
156 | netdev->priv_flags &= ~IFF_TX_SKB_SHARING; | 155 | netdev->priv_flags &= ~IFF_TX_SKB_SHARING; |
157 | netdev->priv_flags |= IFF_LIVE_ADDR_CHANGE | IFF_OPENVSWITCH | | 156 | netdev->priv_flags |= IFF_LIVE_ADDR_CHANGE | IFF_OPENVSWITCH | |
158 | IFF_PHONY_HEADROOM | IFF_NO_QUEUE; | 157 | IFF_PHONY_HEADROOM | IFF_NO_QUEUE; |
159 | netdev->destructor = internal_dev_destructor; | 158 | netdev->needs_free_netdev = true; |
159 | netdev->priv_destructor = internal_dev_destructor; | ||
160 | netdev->ethtool_ops = &internal_dev_ethtool_ops; | 160 | netdev->ethtool_ops = &internal_dev_ethtool_ops; |
161 | netdev->rtnl_link_ops = &internal_dev_link_ops; | 161 | netdev->rtnl_link_ops = &internal_dev_link_ops; |
162 | 162 | ||
diff --git a/net/phonet/pep-gprs.c b/net/phonet/pep-gprs.c index 21c28b51be94..2c9337946e30 100644 --- a/net/phonet/pep-gprs.c +++ b/net/phonet/pep-gprs.c | |||
@@ -236,7 +236,7 @@ static void gprs_setup(struct net_device *dev) | |||
236 | dev->tx_queue_len = 10; | 236 | dev->tx_queue_len = 10; |
237 | 237 | ||
238 | dev->netdev_ops = &gprs_netdev_ops; | 238 | dev->netdev_ops = &gprs_netdev_ops; |
239 | dev->destructor = free_netdev; | 239 | dev->needs_free_netdev = true; |
240 | } | 240 | } |
241 | 241 | ||
242 | /* | 242 | /* |
diff --git a/net/sched/act_pedit.c b/net/sched/act_pedit.c index 164b5ac094be..7dc5892671c8 100644 --- a/net/sched/act_pedit.c +++ b/net/sched/act_pedit.c | |||
@@ -94,8 +94,10 @@ static struct tcf_pedit_key_ex *tcf_pedit_keys_ex_parse(struct nlattr *nla, | |||
94 | k++; | 94 | k++; |
95 | } | 95 | } |
96 | 96 | ||
97 | if (n) | 97 | if (n) { |
98 | err = -EINVAL; | ||
98 | goto err_out; | 99 | goto err_out; |
100 | } | ||
99 | 101 | ||
100 | return keys_ex; | 102 | return keys_ex; |
101 | 103 | ||
diff --git a/net/sched/act_police.c b/net/sched/act_police.c index f42008b29311..b062bc80c7cb 100644 --- a/net/sched/act_police.c +++ b/net/sched/act_police.c | |||
@@ -132,21 +132,21 @@ static int tcf_act_police_init(struct net *net, struct nlattr *nla, | |||
132 | } | 132 | } |
133 | } | 133 | } |
134 | 134 | ||
135 | spin_lock_bh(&police->tcf_lock); | ||
136 | if (est) { | 135 | if (est) { |
137 | err = gen_replace_estimator(&police->tcf_bstats, NULL, | 136 | err = gen_replace_estimator(&police->tcf_bstats, NULL, |
138 | &police->tcf_rate_est, | 137 | &police->tcf_rate_est, |
139 | &police->tcf_lock, | 138 | &police->tcf_lock, |
140 | NULL, est); | 139 | NULL, est); |
141 | if (err) | 140 | if (err) |
142 | goto failure_unlock; | 141 | goto failure; |
143 | } else if (tb[TCA_POLICE_AVRATE] && | 142 | } else if (tb[TCA_POLICE_AVRATE] && |
144 | (ret == ACT_P_CREATED || | 143 | (ret == ACT_P_CREATED || |
145 | !gen_estimator_active(&police->tcf_rate_est))) { | 144 | !gen_estimator_active(&police->tcf_rate_est))) { |
146 | err = -EINVAL; | 145 | err = -EINVAL; |
147 | goto failure_unlock; | 146 | goto failure; |
148 | } | 147 | } |
149 | 148 | ||
149 | spin_lock_bh(&police->tcf_lock); | ||
150 | /* No failure allowed after this point */ | 150 | /* No failure allowed after this point */ |
151 | police->tcfp_mtu = parm->mtu; | 151 | police->tcfp_mtu = parm->mtu; |
152 | if (police->tcfp_mtu == 0) { | 152 | if (police->tcfp_mtu == 0) { |
@@ -192,8 +192,6 @@ static int tcf_act_police_init(struct net *net, struct nlattr *nla, | |||
192 | 192 | ||
193 | return ret; | 193 | return ret; |
194 | 194 | ||
195 | failure_unlock: | ||
196 | spin_unlock_bh(&police->tcf_lock); | ||
197 | failure: | 195 | failure: |
198 | qdisc_put_rtab(P_tab); | 196 | qdisc_put_rtab(P_tab); |
199 | qdisc_put_rtab(R_tab); | 197 | qdisc_put_rtab(R_tab); |
diff --git a/net/sctp/socket.c b/net/sctp/socket.c index f16c8d97b7f3..30aa0a529215 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c | |||
@@ -4622,13 +4622,13 @@ int sctp_for_each_endpoint(int (*cb)(struct sctp_endpoint *, void *), | |||
4622 | 4622 | ||
4623 | for (head = sctp_ep_hashtable; hash < sctp_ep_hashsize; | 4623 | for (head = sctp_ep_hashtable; hash < sctp_ep_hashsize; |
4624 | hash++, head++) { | 4624 | hash++, head++) { |
4625 | read_lock(&head->lock); | 4625 | read_lock_bh(&head->lock); |
4626 | sctp_for_each_hentry(epb, &head->chain) { | 4626 | sctp_for_each_hentry(epb, &head->chain) { |
4627 | err = cb(sctp_ep(epb), p); | 4627 | err = cb(sctp_ep(epb), p); |
4628 | if (err) | 4628 | if (err) |
4629 | break; | 4629 | break; |
4630 | } | 4630 | } |
4631 | read_unlock(&head->lock); | 4631 | read_unlock_bh(&head->lock); |
4632 | } | 4632 | } |
4633 | 4633 | ||
4634 | return err; | 4634 | return err; |
diff --git a/net/sunrpc/xprtrdma/backchannel.c b/net/sunrpc/xprtrdma/backchannel.c index 24fedd4b117e..03f6b5840764 100644 --- a/net/sunrpc/xprtrdma/backchannel.c +++ b/net/sunrpc/xprtrdma/backchannel.c | |||
@@ -119,11 +119,9 @@ int xprt_rdma_bc_setup(struct rpc_xprt *xprt, unsigned int reqs) | |||
119 | 119 | ||
120 | for (i = 0; i < (reqs << 1); i++) { | 120 | for (i = 0; i < (reqs << 1); i++) { |
121 | rqst = kzalloc(sizeof(*rqst), GFP_KERNEL); | 121 | rqst = kzalloc(sizeof(*rqst), GFP_KERNEL); |
122 | if (!rqst) { | 122 | if (!rqst) |
123 | pr_err("RPC: %s: Failed to create bc rpc_rqst\n", | ||
124 | __func__); | ||
125 | goto out_free; | 123 | goto out_free; |
126 | } | 124 | |
127 | dprintk("RPC: %s: new rqst %p\n", __func__, rqst); | 125 | dprintk("RPC: %s: new rqst %p\n", __func__, rqst); |
128 | 126 | ||
129 | rqst->rq_xprt = &r_xprt->rx_xprt; | 127 | rqst->rq_xprt = &r_xprt->rx_xprt; |
diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c index 16aff8ddc16f..d5b54c020dec 100644 --- a/net/sunrpc/xprtsock.c +++ b/net/sunrpc/xprtsock.c | |||
@@ -2432,7 +2432,12 @@ static void xs_tcp_setup_socket(struct work_struct *work) | |||
2432 | case -ENETUNREACH: | 2432 | case -ENETUNREACH: |
2433 | case -EADDRINUSE: | 2433 | case -EADDRINUSE: |
2434 | case -ENOBUFS: | 2434 | case -ENOBUFS: |
2435 | /* retry with existing socket, after a delay */ | 2435 | /* |
2436 | * xs_tcp_force_close() wakes tasks with -EIO. | ||
2437 | * We need to wake them first to ensure the | ||
2438 | * correct error code. | ||
2439 | */ | ||
2440 | xprt_wake_pending_tasks(xprt, status); | ||
2436 | xs_tcp_force_close(xprt); | 2441 | xs_tcp_force_close(xprt); |
2437 | goto out; | 2442 | goto out; |
2438 | } | 2443 | } |
diff --git a/net/tipc/msg.c b/net/tipc/msg.c index 312ef7de57d7..ab3087687a32 100644 --- a/net/tipc/msg.c +++ b/net/tipc/msg.c | |||
@@ -508,7 +508,7 @@ bool tipc_msg_reverse(u32 own_node, struct sk_buff **skb, int err) | |||
508 | } | 508 | } |
509 | 509 | ||
510 | if (skb_cloned(_skb) && | 510 | if (skb_cloned(_skb) && |
511 | pskb_expand_head(_skb, BUF_HEADROOM, BUF_TAILROOM, GFP_KERNEL)) | 511 | pskb_expand_head(_skb, BUF_HEADROOM, BUF_TAILROOM, GFP_ATOMIC)) |
512 | goto exit; | 512 | goto exit; |
513 | 513 | ||
514 | /* Now reverse the concerned fields */ | 514 | /* Now reverse the concerned fields */ |
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index 6a7fe7660551..1a0c961f4ffe 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c | |||
@@ -999,7 +999,8 @@ static int unix_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) | |||
999 | struct path path = { }; | 999 | struct path path = { }; |
1000 | 1000 | ||
1001 | err = -EINVAL; | 1001 | err = -EINVAL; |
1002 | if (sunaddr->sun_family != AF_UNIX) | 1002 | if (addr_len < offsetofend(struct sockaddr_un, sun_family) || |
1003 | sunaddr->sun_family != AF_UNIX) | ||
1003 | goto out; | 1004 | goto out; |
1004 | 1005 | ||
1005 | if (addr_len == sizeof(short)) { | 1006 | if (addr_len == sizeof(short)) { |
@@ -1110,6 +1111,10 @@ static int unix_dgram_connect(struct socket *sock, struct sockaddr *addr, | |||
1110 | unsigned int hash; | 1111 | unsigned int hash; |
1111 | int err; | 1112 | int err; |
1112 | 1113 | ||
1114 | err = -EINVAL; | ||
1115 | if (alen < offsetofend(struct sockaddr, sa_family)) | ||
1116 | goto out; | ||
1117 | |||
1113 | if (addr->sa_family != AF_UNSPEC) { | 1118 | if (addr->sa_family != AF_UNSPEC) { |
1114 | err = unix_mkname(sunaddr, alen, &hash); | 1119 | err = unix_mkname(sunaddr, alen, &hash); |
1115 | if (err < 0) | 1120 | if (err < 0) |