diff options
author | David S. Miller <davem@davemloft.net> | 2014-05-12 13:19:14 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-05-12 13:19:14 -0400 |
commit | 5f013c9bc70214dcacd5fbed5a06c217d6ff9c59 (patch) | |
tree | 34c3a633000e03bca57d0ce55d8759f86edecc03 /net | |
parent | 51ee42efa0829cf9e46f8e1c0ab7a9ab6facf3f2 (diff) | |
parent | 1a466ae96e9f749d02a73315a3e66375e61a61dd (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Conflicts:
drivers/net/ethernet/altera/altera_sgdma.c
net/netlink/af_netlink.c
net/sched/cls_api.c
net/sched/sch_api.c
The netlink conflict dealt with moving to netlink_capable() and
netlink_ns_capable() in the 'net' tree vs. supporting 'tc' operations
in non-init namespaces. These were simple transformations from
netlink_capable to netlink_ns_capable.
The Altera driver conflict was simply code removal overlapping some
void pointer cast cleanups in net-next.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
53 files changed, 426 insertions, 227 deletions
diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c index 55a174317925..095943c02d6e 100644 --- a/net/bluetooth/hci_conn.c +++ b/net/bluetooth/hci_conn.c | |||
@@ -884,14 +884,17 @@ static int hci_conn_auth(struct hci_conn *conn, __u8 sec_level, __u8 auth_type) | |||
884 | if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->flags)) { | 884 | if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->flags)) { |
885 | struct hci_cp_auth_requested cp; | 885 | struct hci_cp_auth_requested cp; |
886 | 886 | ||
887 | /* encrypt must be pending if auth is also pending */ | ||
888 | set_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags); | ||
889 | |||
890 | cp.handle = cpu_to_le16(conn->handle); | 887 | cp.handle = cpu_to_le16(conn->handle); |
891 | hci_send_cmd(conn->hdev, HCI_OP_AUTH_REQUESTED, | 888 | hci_send_cmd(conn->hdev, HCI_OP_AUTH_REQUESTED, |
892 | sizeof(cp), &cp); | 889 | sizeof(cp), &cp); |
890 | |||
891 | /* If we're already encrypted set the REAUTH_PEND flag, | ||
892 | * otherwise set the ENCRYPT_PEND. | ||
893 | */ | ||
893 | if (conn->key_type != 0xff) | 894 | if (conn->key_type != 0xff) |
894 | set_bit(HCI_CONN_REAUTH_PEND, &conn->flags); | 895 | set_bit(HCI_CONN_REAUTH_PEND, &conn->flags); |
896 | else | ||
897 | set_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags); | ||
895 | } | 898 | } |
896 | 899 | ||
897 | return 0; | 900 | return 0; |
diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c index 07c37d0cecb2..ca19fd4bbb8f 100644 --- a/net/bluetooth/hci_event.c +++ b/net/bluetooth/hci_event.c | |||
@@ -3388,6 +3388,12 @@ static void hci_key_refresh_complete_evt(struct hci_dev *hdev, | |||
3388 | if (!conn) | 3388 | if (!conn) |
3389 | goto unlock; | 3389 | goto unlock; |
3390 | 3390 | ||
3391 | /* For BR/EDR the necessary steps are taken through the | ||
3392 | * auth_complete event. | ||
3393 | */ | ||
3394 | if (conn->type != LE_LINK) | ||
3395 | goto unlock; | ||
3396 | |||
3391 | if (!ev->status) | 3397 | if (!ev->status) |
3392 | conn->sec_level = conn->pending_sec_level; | 3398 | conn->sec_level = conn->pending_sec_level; |
3393 | 3399 | ||
diff --git a/net/bridge/br_netfilter.c b/net/bridge/br_netfilter.c index 80e1b0f60a30..2acf7fa1fec6 100644 --- a/net/bridge/br_netfilter.c +++ b/net/bridge/br_netfilter.c | |||
@@ -859,12 +859,12 @@ static unsigned int br_nf_forward_arp(const struct nf_hook_ops *ops, | |||
859 | return NF_STOLEN; | 859 | return NF_STOLEN; |
860 | } | 860 | } |
861 | 861 | ||
862 | #if IS_ENABLED(CONFIG_NF_CONNTRACK_IPV4) | 862 | #if IS_ENABLED(CONFIG_NF_DEFRAG_IPV4) |
863 | static int br_nf_dev_queue_xmit(struct sk_buff *skb) | 863 | static int br_nf_dev_queue_xmit(struct sk_buff *skb) |
864 | { | 864 | { |
865 | int ret; | 865 | int ret; |
866 | 866 | ||
867 | if (skb->nfct != NULL && skb->protocol == htons(ETH_P_IP) && | 867 | if (skb->protocol == htons(ETH_P_IP) && |
868 | skb->len + nf_bridge_mtu_reduction(skb) > skb->dev->mtu && | 868 | skb->len + nf_bridge_mtu_reduction(skb) > skb->dev->mtu && |
869 | !skb_is_gso(skb)) { | 869 | !skb_is_gso(skb)) { |
870 | if (br_parse_ip_options(skb)) | 870 | if (br_parse_ip_options(skb)) |
diff --git a/net/bridge/br_netlink.c b/net/bridge/br_netlink.c index e74b6d530cb6..e8844d975b32 100644 --- a/net/bridge/br_netlink.c +++ b/net/bridge/br_netlink.c | |||
@@ -445,6 +445,20 @@ static int br_validate(struct nlattr *tb[], struct nlattr *data[]) | |||
445 | return 0; | 445 | return 0; |
446 | } | 446 | } |
447 | 447 | ||
448 | static int br_dev_newlink(struct net *src_net, struct net_device *dev, | ||
449 | struct nlattr *tb[], struct nlattr *data[]) | ||
450 | { | ||
451 | struct net_bridge *br = netdev_priv(dev); | ||
452 | |||
453 | if (tb[IFLA_ADDRESS]) { | ||
454 | spin_lock_bh(&br->lock); | ||
455 | br_stp_change_bridge_id(br, nla_data(tb[IFLA_ADDRESS])); | ||
456 | spin_unlock_bh(&br->lock); | ||
457 | } | ||
458 | |||
459 | return register_netdevice(dev); | ||
460 | } | ||
461 | |||
448 | static size_t br_get_link_af_size(const struct net_device *dev) | 462 | static size_t br_get_link_af_size(const struct net_device *dev) |
449 | { | 463 | { |
450 | struct net_port_vlans *pv; | 464 | struct net_port_vlans *pv; |
@@ -473,6 +487,7 @@ struct rtnl_link_ops br_link_ops __read_mostly = { | |||
473 | .priv_size = sizeof(struct net_bridge), | 487 | .priv_size = sizeof(struct net_bridge), |
474 | .setup = br_dev_setup, | 488 | .setup = br_dev_setup, |
475 | .validate = br_validate, | 489 | .validate = br_validate, |
490 | .newlink = br_dev_newlink, | ||
476 | .dellink = br_dev_delete, | 491 | .dellink = br_dev_delete, |
477 | }; | 492 | }; |
478 | 493 | ||
diff --git a/net/can/gw.c b/net/can/gw.c index ac31891967da..050a2110d43f 100644 --- a/net/can/gw.c +++ b/net/can/gw.c | |||
@@ -804,7 +804,7 @@ static int cgw_create_job(struct sk_buff *skb, struct nlmsghdr *nlh) | |||
804 | u8 limhops = 0; | 804 | u8 limhops = 0; |
805 | int err = 0; | 805 | int err = 0; |
806 | 806 | ||
807 | if (!capable(CAP_NET_ADMIN)) | 807 | if (!netlink_capable(skb, CAP_NET_ADMIN)) |
808 | return -EPERM; | 808 | return -EPERM; |
809 | 809 | ||
810 | if (nlmsg_len(nlh) < sizeof(*r)) | 810 | if (nlmsg_len(nlh) < sizeof(*r)) |
@@ -893,7 +893,7 @@ static int cgw_remove_job(struct sk_buff *skb, struct nlmsghdr *nlh) | |||
893 | u8 limhops = 0; | 893 | u8 limhops = 0; |
894 | int err = 0; | 894 | int err = 0; |
895 | 895 | ||
896 | if (!capable(CAP_NET_ADMIN)) | 896 | if (!netlink_capable(skb, CAP_NET_ADMIN)) |
897 | return -EPERM; | 897 | return -EPERM; |
898 | 898 | ||
899 | if (nlmsg_len(nlh) < sizeof(*r)) | 899 | if (nlmsg_len(nlh) < sizeof(*r)) |
diff --git a/net/ceph/osdmap.c b/net/ceph/osdmap.c index e632b5a52f5b..8b8a5a24b223 100644 --- a/net/ceph/osdmap.c +++ b/net/ceph/osdmap.c | |||
@@ -1548,8 +1548,10 @@ static void apply_primary_affinity(struct ceph_osdmap *osdmap, u32 pps, | |||
1548 | return; | 1548 | return; |
1549 | 1549 | ||
1550 | for (i = 0; i < len; i++) { | 1550 | for (i = 0; i < len; i++) { |
1551 | if (osds[i] != CRUSH_ITEM_NONE && | 1551 | int osd = osds[i]; |
1552 | osdmap->osd_primary_affinity[i] != | 1552 | |
1553 | if (osd != CRUSH_ITEM_NONE && | ||
1554 | osdmap->osd_primary_affinity[osd] != | ||
1553 | CEPH_OSD_DEFAULT_PRIMARY_AFFINITY) { | 1555 | CEPH_OSD_DEFAULT_PRIMARY_AFFINITY) { |
1554 | break; | 1556 | break; |
1555 | } | 1557 | } |
@@ -1563,10 +1565,9 @@ static void apply_primary_affinity(struct ceph_osdmap *osdmap, u32 pps, | |||
1563 | * osd's pgs get rejected as primary. | 1565 | * osd's pgs get rejected as primary. |
1564 | */ | 1566 | */ |
1565 | for (i = 0; i < len; i++) { | 1567 | for (i = 0; i < len; i++) { |
1566 | int osd; | 1568 | int osd = osds[i]; |
1567 | u32 aff; | 1569 | u32 aff; |
1568 | 1570 | ||
1569 | osd = osds[i]; | ||
1570 | if (osd == CRUSH_ITEM_NONE) | 1571 | if (osd == CRUSH_ITEM_NONE) |
1571 | continue; | 1572 | continue; |
1572 | 1573 | ||
diff --git a/net/core/dev.c b/net/core/dev.c index fe0b9cd69cb6..867adb25b5b8 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -2424,7 +2424,7 @@ EXPORT_SYMBOL(netdev_rx_csum_fault); | |||
2424 | * 2. No high memory really exists on this machine. | 2424 | * 2. No high memory really exists on this machine. |
2425 | */ | 2425 | */ |
2426 | 2426 | ||
2427 | static int illegal_highdma(const struct net_device *dev, struct sk_buff *skb) | 2427 | static int illegal_highdma(struct net_device *dev, struct sk_buff *skb) |
2428 | { | 2428 | { |
2429 | #ifdef CONFIG_HIGHMEM | 2429 | #ifdef CONFIG_HIGHMEM |
2430 | int i; | 2430 | int i; |
@@ -2499,38 +2499,36 @@ static int dev_gso_segment(struct sk_buff *skb, netdev_features_t features) | |||
2499 | } | 2499 | } |
2500 | 2500 | ||
2501 | static netdev_features_t harmonize_features(struct sk_buff *skb, | 2501 | static netdev_features_t harmonize_features(struct sk_buff *skb, |
2502 | const struct net_device *dev, | 2502 | netdev_features_t features) |
2503 | netdev_features_t features) | ||
2504 | { | 2503 | { |
2505 | int tmp; | 2504 | int tmp; |
2506 | 2505 | ||
2507 | if (skb->ip_summed != CHECKSUM_NONE && | 2506 | if (skb->ip_summed != CHECKSUM_NONE && |
2508 | !can_checksum_protocol(features, skb_network_protocol(skb, &tmp))) { | 2507 | !can_checksum_protocol(features, skb_network_protocol(skb, &tmp))) { |
2509 | features &= ~NETIF_F_ALL_CSUM; | 2508 | features &= ~NETIF_F_ALL_CSUM; |
2510 | } else if (illegal_highdma(dev, skb)) { | 2509 | } else if (illegal_highdma(skb->dev, skb)) { |
2511 | features &= ~NETIF_F_SG; | 2510 | features &= ~NETIF_F_SG; |
2512 | } | 2511 | } |
2513 | 2512 | ||
2514 | return features; | 2513 | return features; |
2515 | } | 2514 | } |
2516 | 2515 | ||
2517 | netdev_features_t netif_skb_dev_features(struct sk_buff *skb, | 2516 | netdev_features_t netif_skb_features(struct sk_buff *skb) |
2518 | const struct net_device *dev) | ||
2519 | { | 2517 | { |
2520 | __be16 protocol = skb->protocol; | 2518 | __be16 protocol = skb->protocol; |
2521 | netdev_features_t features = dev->features; | 2519 | netdev_features_t features = skb->dev->features; |
2522 | 2520 | ||
2523 | if (skb_shinfo(skb)->gso_segs > dev->gso_max_segs) | 2521 | if (skb_shinfo(skb)->gso_segs > skb->dev->gso_max_segs) |
2524 | features &= ~NETIF_F_GSO_MASK; | 2522 | features &= ~NETIF_F_GSO_MASK; |
2525 | 2523 | ||
2526 | if (protocol == htons(ETH_P_8021Q) || protocol == htons(ETH_P_8021AD)) { | 2524 | if (protocol == htons(ETH_P_8021Q) || protocol == htons(ETH_P_8021AD)) { |
2527 | struct vlan_ethhdr *veh = (struct vlan_ethhdr *)skb->data; | 2525 | struct vlan_ethhdr *veh = (struct vlan_ethhdr *)skb->data; |
2528 | protocol = veh->h_vlan_encapsulated_proto; | 2526 | protocol = veh->h_vlan_encapsulated_proto; |
2529 | } else if (!vlan_tx_tag_present(skb)) { | 2527 | } else if (!vlan_tx_tag_present(skb)) { |
2530 | return harmonize_features(skb, dev, features); | 2528 | return harmonize_features(skb, features); |
2531 | } | 2529 | } |
2532 | 2530 | ||
2533 | features &= (dev->vlan_features | NETIF_F_HW_VLAN_CTAG_TX | | 2531 | features &= (skb->dev->vlan_features | NETIF_F_HW_VLAN_CTAG_TX | |
2534 | NETIF_F_HW_VLAN_STAG_TX); | 2532 | NETIF_F_HW_VLAN_STAG_TX); |
2535 | 2533 | ||
2536 | if (protocol == htons(ETH_P_8021Q) || protocol == htons(ETH_P_8021AD)) | 2534 | if (protocol == htons(ETH_P_8021Q) || protocol == htons(ETH_P_8021AD)) |
@@ -2538,9 +2536,9 @@ netdev_features_t netif_skb_dev_features(struct sk_buff *skb, | |||
2538 | NETIF_F_GEN_CSUM | NETIF_F_HW_VLAN_CTAG_TX | | 2536 | NETIF_F_GEN_CSUM | NETIF_F_HW_VLAN_CTAG_TX | |
2539 | NETIF_F_HW_VLAN_STAG_TX; | 2537 | NETIF_F_HW_VLAN_STAG_TX; |
2540 | 2538 | ||
2541 | return harmonize_features(skb, dev, features); | 2539 | return harmonize_features(skb, features); |
2542 | } | 2540 | } |
2543 | EXPORT_SYMBOL(netif_skb_dev_features); | 2541 | EXPORT_SYMBOL(netif_skb_features); |
2544 | 2542 | ||
2545 | int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev, | 2543 | int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev, |
2546 | struct netdev_queue *txq) | 2544 | struct netdev_queue *txq) |
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index d4ff41739b0f..9837bebf93ce 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c | |||
@@ -774,7 +774,8 @@ static inline int rtnl_vfinfo_size(const struct net_device *dev, | |||
774 | return 0; | 774 | return 0; |
775 | } | 775 | } |
776 | 776 | ||
777 | static size_t rtnl_port_size(const struct net_device *dev) | 777 | static size_t rtnl_port_size(const struct net_device *dev, |
778 | u32 ext_filter_mask) | ||
778 | { | 779 | { |
779 | size_t port_size = nla_total_size(4) /* PORT_VF */ | 780 | size_t port_size = nla_total_size(4) /* PORT_VF */ |
780 | + nla_total_size(PORT_PROFILE_MAX) /* PORT_PROFILE */ | 781 | + nla_total_size(PORT_PROFILE_MAX) /* PORT_PROFILE */ |
@@ -790,7 +791,8 @@ static size_t rtnl_port_size(const struct net_device *dev) | |||
790 | size_t port_self_size = nla_total_size(sizeof(struct nlattr)) | 791 | size_t port_self_size = nla_total_size(sizeof(struct nlattr)) |
791 | + port_size; | 792 | + port_size; |
792 | 793 | ||
793 | if (!dev->netdev_ops->ndo_get_vf_port || !dev->dev.parent) | 794 | if (!dev->netdev_ops->ndo_get_vf_port || !dev->dev.parent || |
795 | !(ext_filter_mask & RTEXT_FILTER_VF)) | ||
794 | return 0; | 796 | return 0; |
795 | if (dev_num_vf(dev->dev.parent)) | 797 | if (dev_num_vf(dev->dev.parent)) |
796 | return port_self_size + vf_ports_size + | 798 | return port_self_size + vf_ports_size + |
@@ -826,7 +828,7 @@ static noinline size_t if_nlmsg_size(const struct net_device *dev, | |||
826 | + nla_total_size(ext_filter_mask | 828 | + nla_total_size(ext_filter_mask |
827 | & RTEXT_FILTER_VF ? 4 : 0) /* IFLA_NUM_VF */ | 829 | & RTEXT_FILTER_VF ? 4 : 0) /* IFLA_NUM_VF */ |
828 | + rtnl_vfinfo_size(dev, ext_filter_mask) /* IFLA_VFINFO_LIST */ | 830 | + rtnl_vfinfo_size(dev, ext_filter_mask) /* IFLA_VFINFO_LIST */ |
829 | + rtnl_port_size(dev) /* IFLA_VF_PORTS + IFLA_PORT_SELF */ | 831 | + rtnl_port_size(dev, ext_filter_mask) /* IFLA_VF_PORTS + IFLA_PORT_SELF */ |
830 | + rtnl_link_get_size(dev) /* IFLA_LINKINFO */ | 832 | + rtnl_link_get_size(dev) /* IFLA_LINKINFO */ |
831 | + rtnl_link_get_af_size(dev) /* IFLA_AF_SPEC */ | 833 | + rtnl_link_get_af_size(dev) /* IFLA_AF_SPEC */ |
832 | + nla_total_size(MAX_PHYS_PORT_ID_LEN); /* IFLA_PHYS_PORT_ID */ | 834 | + nla_total_size(MAX_PHYS_PORT_ID_LEN); /* IFLA_PHYS_PORT_ID */ |
@@ -888,11 +890,13 @@ static int rtnl_port_self_fill(struct sk_buff *skb, struct net_device *dev) | |||
888 | return 0; | 890 | return 0; |
889 | } | 891 | } |
890 | 892 | ||
891 | static int rtnl_port_fill(struct sk_buff *skb, struct net_device *dev) | 893 | static int rtnl_port_fill(struct sk_buff *skb, struct net_device *dev, |
894 | u32 ext_filter_mask) | ||
892 | { | 895 | { |
893 | int err; | 896 | int err; |
894 | 897 | ||
895 | if (!dev->netdev_ops->ndo_get_vf_port || !dev->dev.parent) | 898 | if (!dev->netdev_ops->ndo_get_vf_port || !dev->dev.parent || |
899 | !(ext_filter_mask & RTEXT_FILTER_VF)) | ||
896 | return 0; | 900 | return 0; |
897 | 901 | ||
898 | err = rtnl_port_self_fill(skb, dev); | 902 | err = rtnl_port_self_fill(skb, dev); |
@@ -1079,7 +1083,7 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev, | |||
1079 | nla_nest_end(skb, vfinfo); | 1083 | nla_nest_end(skb, vfinfo); |
1080 | } | 1084 | } |
1081 | 1085 | ||
1082 | if (rtnl_port_fill(skb, dev)) | 1086 | if (rtnl_port_fill(skb, dev, ext_filter_mask)) |
1083 | goto nla_put_failure; | 1087 | goto nla_put_failure; |
1084 | 1088 | ||
1085 | if (dev->rtnl_link_ops || rtnl_have_link_slave_info(dev)) { | 1089 | if (dev->rtnl_link_ops || rtnl_have_link_slave_info(dev)) { |
@@ -1198,6 +1202,7 @@ static int rtnl_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb) | |||
1198 | struct hlist_head *head; | 1202 | struct hlist_head *head; |
1199 | struct nlattr *tb[IFLA_MAX+1]; | 1203 | struct nlattr *tb[IFLA_MAX+1]; |
1200 | u32 ext_filter_mask = 0; | 1204 | u32 ext_filter_mask = 0; |
1205 | int err; | ||
1201 | 1206 | ||
1202 | s_h = cb->args[0]; | 1207 | s_h = cb->args[0]; |
1203 | s_idx = cb->args[1]; | 1208 | s_idx = cb->args[1]; |
@@ -1218,11 +1223,17 @@ static int rtnl_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb) | |||
1218 | hlist_for_each_entry_rcu(dev, head, index_hlist) { | 1223 | hlist_for_each_entry_rcu(dev, head, index_hlist) { |
1219 | if (idx < s_idx) | 1224 | if (idx < s_idx) |
1220 | goto cont; | 1225 | goto cont; |
1221 | if (rtnl_fill_ifinfo(skb, dev, RTM_NEWLINK, | 1226 | err = rtnl_fill_ifinfo(skb, dev, RTM_NEWLINK, |
1222 | NETLINK_CB(cb->skb).portid, | 1227 | NETLINK_CB(cb->skb).portid, |
1223 | cb->nlh->nlmsg_seq, 0, | 1228 | cb->nlh->nlmsg_seq, 0, |
1224 | NLM_F_MULTI, | 1229 | NLM_F_MULTI, |
1225 | ext_filter_mask) <= 0) | 1230 | ext_filter_mask); |
1231 | /* If we ran out of room on the first message, | ||
1232 | * we're in trouble | ||
1233 | */ | ||
1234 | WARN_ON((err == -EMSGSIZE) && (skb->len == 0)); | ||
1235 | |||
1236 | if (err <= 0) | ||
1226 | goto out; | 1237 | goto out; |
1227 | 1238 | ||
1228 | nl_dump_check_consistent(cb, nlmsg_hdr(skb)); | 1239 | nl_dump_check_consistent(cb, nlmsg_hdr(skb)); |
@@ -1395,7 +1406,8 @@ static int do_set_master(struct net_device *dev, int ifindex) | |||
1395 | return 0; | 1406 | return 0; |
1396 | } | 1407 | } |
1397 | 1408 | ||
1398 | static int do_setlink(struct net_device *dev, struct ifinfomsg *ifm, | 1409 | static int do_setlink(const struct sk_buff *skb, |
1410 | struct net_device *dev, struct ifinfomsg *ifm, | ||
1399 | struct nlattr **tb, char *ifname, int modified) | 1411 | struct nlattr **tb, char *ifname, int modified) |
1400 | { | 1412 | { |
1401 | const struct net_device_ops *ops = dev->netdev_ops; | 1413 | const struct net_device_ops *ops = dev->netdev_ops; |
@@ -1407,7 +1419,7 @@ static int do_setlink(struct net_device *dev, struct ifinfomsg *ifm, | |||
1407 | err = PTR_ERR(net); | 1419 | err = PTR_ERR(net); |
1408 | goto errout; | 1420 | goto errout; |
1409 | } | 1421 | } |
1410 | if (!ns_capable(net->user_ns, CAP_NET_ADMIN)) { | 1422 | if (!netlink_ns_capable(skb, net->user_ns, CAP_NET_ADMIN)) { |
1411 | err = -EPERM; | 1423 | err = -EPERM; |
1412 | goto errout; | 1424 | goto errout; |
1413 | } | 1425 | } |
@@ -1661,7 +1673,7 @@ static int rtnl_setlink(struct sk_buff *skb, struct nlmsghdr *nlh) | |||
1661 | if (err < 0) | 1673 | if (err < 0) |
1662 | goto errout; | 1674 | goto errout; |
1663 | 1675 | ||
1664 | err = do_setlink(dev, ifm, tb, ifname, 0); | 1676 | err = do_setlink(skb, dev, ifm, tb, ifname, 0); |
1665 | errout: | 1677 | errout: |
1666 | return err; | 1678 | return err; |
1667 | } | 1679 | } |
@@ -1778,7 +1790,8 @@ err: | |||
1778 | } | 1790 | } |
1779 | EXPORT_SYMBOL(rtnl_create_link); | 1791 | EXPORT_SYMBOL(rtnl_create_link); |
1780 | 1792 | ||
1781 | static int rtnl_group_changelink(struct net *net, int group, | 1793 | static int rtnl_group_changelink(const struct sk_buff *skb, |
1794 | struct net *net, int group, | ||
1782 | struct ifinfomsg *ifm, | 1795 | struct ifinfomsg *ifm, |
1783 | struct nlattr **tb) | 1796 | struct nlattr **tb) |
1784 | { | 1797 | { |
@@ -1787,7 +1800,7 @@ static int rtnl_group_changelink(struct net *net, int group, | |||
1787 | 1800 | ||
1788 | for_each_netdev(net, dev) { | 1801 | for_each_netdev(net, dev) { |
1789 | if (dev->group == group) { | 1802 | if (dev->group == group) { |
1790 | err = do_setlink(dev, ifm, tb, NULL, 0); | 1803 | err = do_setlink(skb, dev, ifm, tb, NULL, 0); |
1791 | if (err < 0) | 1804 | if (err < 0) |
1792 | return err; | 1805 | return err; |
1793 | } | 1806 | } |
@@ -1929,12 +1942,12 @@ replay: | |||
1929 | modified = 1; | 1942 | modified = 1; |
1930 | } | 1943 | } |
1931 | 1944 | ||
1932 | return do_setlink(dev, ifm, tb, ifname, modified); | 1945 | return do_setlink(skb, dev, ifm, tb, ifname, modified); |
1933 | } | 1946 | } |
1934 | 1947 | ||
1935 | if (!(nlh->nlmsg_flags & NLM_F_CREATE)) { | 1948 | if (!(nlh->nlmsg_flags & NLM_F_CREATE)) { |
1936 | if (ifm->ifi_index == 0 && tb[IFLA_GROUP]) | 1949 | if (ifm->ifi_index == 0 && tb[IFLA_GROUP]) |
1937 | return rtnl_group_changelink(net, | 1950 | return rtnl_group_changelink(skb, net, |
1938 | nla_get_u32(tb[IFLA_GROUP]), | 1951 | nla_get_u32(tb[IFLA_GROUP]), |
1939 | ifm, tb); | 1952 | ifm, tb); |
1940 | return -ENODEV; | 1953 | return -ENODEV; |
@@ -2321,7 +2334,7 @@ static int rtnl_fdb_del(struct sk_buff *skb, struct nlmsghdr *nlh) | |||
2321 | int err = -EINVAL; | 2334 | int err = -EINVAL; |
2322 | __u8 *addr; | 2335 | __u8 *addr; |
2323 | 2336 | ||
2324 | if (!capable(CAP_NET_ADMIN)) | 2337 | if (!netlink_capable(skb, CAP_NET_ADMIN)) |
2325 | return -EPERM; | 2338 | return -EPERM; |
2326 | 2339 | ||
2327 | err = nlmsg_parse(nlh, sizeof(*ndm), tb, NDA_MAX, NULL); | 2340 | err = nlmsg_parse(nlh, sizeof(*ndm), tb, NDA_MAX, NULL); |
@@ -2773,7 +2786,7 @@ static int rtnetlink_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh) | |||
2773 | sz_idx = type>>2; | 2786 | sz_idx = type>>2; |
2774 | kind = type&3; | 2787 | kind = type&3; |
2775 | 2788 | ||
2776 | if (kind != 2 && !ns_capable(net->user_ns, CAP_NET_ADMIN)) | 2789 | if (kind != 2 && !netlink_net_capable(skb, CAP_NET_ADMIN)) |
2777 | return -EPERM; | 2790 | return -EPERM; |
2778 | 2791 | ||
2779 | if (kind == 2 && nlh->nlmsg_flags&NLM_F_DUMP) { | 2792 | if (kind == 2 && nlh->nlmsg_flags&NLM_F_DUMP) { |
diff --git a/net/core/sock.c b/net/core/sock.c index b4fff008136f..664ee4295b6f 100644 --- a/net/core/sock.c +++ b/net/core/sock.c | |||
@@ -145,6 +145,55 @@ | |||
145 | static DEFINE_MUTEX(proto_list_mutex); | 145 | static DEFINE_MUTEX(proto_list_mutex); |
146 | static LIST_HEAD(proto_list); | 146 | static LIST_HEAD(proto_list); |
147 | 147 | ||
148 | /** | ||
149 | * sk_ns_capable - General socket capability test | ||
150 | * @sk: Socket to use a capability on or through | ||
151 | * @user_ns: The user namespace of the capability to use | ||
152 | * @cap: The capability to use | ||
153 | * | ||
154 | * Test to see if the opener of the socket had when the socket was | ||
155 | * created and the current process has the capability @cap in the user | ||
156 | * namespace @user_ns. | ||
157 | */ | ||
158 | bool sk_ns_capable(const struct sock *sk, | ||
159 | struct user_namespace *user_ns, int cap) | ||
160 | { | ||
161 | return file_ns_capable(sk->sk_socket->file, user_ns, cap) && | ||
162 | ns_capable(user_ns, cap); | ||
163 | } | ||
164 | EXPORT_SYMBOL(sk_ns_capable); | ||
165 | |||
166 | /** | ||
167 | * sk_capable - Socket global capability test | ||
168 | * @sk: Socket to use a capability on or through | ||
169 | * @cap: The global capbility to use | ||
170 | * | ||
171 | * Test to see if the opener of the socket had when the socket was | ||
172 | * created and the current process has the capability @cap in all user | ||
173 | * namespaces. | ||
174 | */ | ||
175 | bool sk_capable(const struct sock *sk, int cap) | ||
176 | { | ||
177 | return sk_ns_capable(sk, &init_user_ns, cap); | ||
178 | } | ||
179 | EXPORT_SYMBOL(sk_capable); | ||
180 | |||
181 | /** | ||
182 | * sk_net_capable - Network namespace socket capability test | ||
183 | * @sk: Socket to use a capability on or through | ||
184 | * @cap: The capability to use | ||
185 | * | ||
186 | * Test to see if the opener of the socket had when the socke was created | ||
187 | * and the current process has the capability @cap over the network namespace | ||
188 | * the socket is a member of. | ||
189 | */ | ||
190 | bool sk_net_capable(const struct sock *sk, int cap) | ||
191 | { | ||
192 | return sk_ns_capable(sk, sock_net(sk)->user_ns, cap); | ||
193 | } | ||
194 | EXPORT_SYMBOL(sk_net_capable); | ||
195 | |||
196 | |||
148 | #ifdef CONFIG_MEMCG_KMEM | 197 | #ifdef CONFIG_MEMCG_KMEM |
149 | int mem_cgroup_sockets_init(struct mem_cgroup *memcg, struct cgroup_subsys *ss) | 198 | int mem_cgroup_sockets_init(struct mem_cgroup *memcg, struct cgroup_subsys *ss) |
150 | { | 199 | { |
diff --git a/net/core/sock_diag.c b/net/core/sock_diag.c index 9deb6abd6cf6..a4216a4c9572 100644 --- a/net/core/sock_diag.c +++ b/net/core/sock_diag.c | |||
@@ -49,7 +49,7 @@ int sock_diag_put_meminfo(struct sock *sk, struct sk_buff *skb, int attrtype) | |||
49 | } | 49 | } |
50 | EXPORT_SYMBOL_GPL(sock_diag_put_meminfo); | 50 | EXPORT_SYMBOL_GPL(sock_diag_put_meminfo); |
51 | 51 | ||
52 | int sock_diag_put_filterinfo(struct sock *sk, | 52 | int sock_diag_put_filterinfo(bool may_report_filterinfo, struct sock *sk, |
53 | struct sk_buff *skb, int attrtype) | 53 | struct sk_buff *skb, int attrtype) |
54 | { | 54 | { |
55 | struct sock_fprog_kern *fprog; | 55 | struct sock_fprog_kern *fprog; |
@@ -58,7 +58,7 @@ int sock_diag_put_filterinfo(struct sock *sk, | |||
58 | unsigned int flen; | 58 | unsigned int flen; |
59 | int err = 0; | 59 | int err = 0; |
60 | 60 | ||
61 | if (!ns_capable(sock_net(sk)->user_ns, CAP_NET_ADMIN)) { | 61 | if (!may_report_filterinfo) { |
62 | nla_reserve(skb, attrtype, 0); | 62 | nla_reserve(skb, attrtype, 0); |
63 | return 0; | 63 | return 0; |
64 | } | 64 | } |
diff --git a/net/dcb/dcbnl.c b/net/dcb/dcbnl.c index 553644402670..f8b98d89c285 100644 --- a/net/dcb/dcbnl.c +++ b/net/dcb/dcbnl.c | |||
@@ -1669,7 +1669,7 @@ static int dcb_doit(struct sk_buff *skb, struct nlmsghdr *nlh) | |||
1669 | struct nlmsghdr *reply_nlh = NULL; | 1669 | struct nlmsghdr *reply_nlh = NULL; |
1670 | const struct reply_func *fn; | 1670 | const struct reply_func *fn; |
1671 | 1671 | ||
1672 | if ((nlh->nlmsg_type == RTM_SETDCB) && !capable(CAP_NET_ADMIN)) | 1672 | if ((nlh->nlmsg_type == RTM_SETDCB) && !netlink_capable(skb, CAP_NET_ADMIN)) |
1673 | return -EPERM; | 1673 | return -EPERM; |
1674 | 1674 | ||
1675 | ret = nlmsg_parse(nlh, sizeof(*dcb), tb, DCB_ATTR_MAX, | 1675 | ret = nlmsg_parse(nlh, sizeof(*dcb), tb, DCB_ATTR_MAX, |
diff --git a/net/decnet/dn_dev.c b/net/decnet/dn_dev.c index a603823a3e27..3b726f31c64c 100644 --- a/net/decnet/dn_dev.c +++ b/net/decnet/dn_dev.c | |||
@@ -574,7 +574,7 @@ static int dn_nl_deladdr(struct sk_buff *skb, struct nlmsghdr *nlh) | |||
574 | struct dn_ifaddr __rcu **ifap; | 574 | struct dn_ifaddr __rcu **ifap; |
575 | int err = -EINVAL; | 575 | int err = -EINVAL; |
576 | 576 | ||
577 | if (!capable(CAP_NET_ADMIN)) | 577 | if (!netlink_capable(skb, CAP_NET_ADMIN)) |
578 | return -EPERM; | 578 | return -EPERM; |
579 | 579 | ||
580 | if (!net_eq(net, &init_net)) | 580 | if (!net_eq(net, &init_net)) |
@@ -618,7 +618,7 @@ static int dn_nl_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh) | |||
618 | struct dn_ifaddr *ifa; | 618 | struct dn_ifaddr *ifa; |
619 | int err; | 619 | int err; |
620 | 620 | ||
621 | if (!capable(CAP_NET_ADMIN)) | 621 | if (!netlink_capable(skb, CAP_NET_ADMIN)) |
622 | return -EPERM; | 622 | return -EPERM; |
623 | 623 | ||
624 | if (!net_eq(net, &init_net)) | 624 | if (!net_eq(net, &init_net)) |
diff --git a/net/decnet/dn_fib.c b/net/decnet/dn_fib.c index 57dc159245ec..d332aefb0846 100644 --- a/net/decnet/dn_fib.c +++ b/net/decnet/dn_fib.c | |||
@@ -505,7 +505,7 @@ static int dn_fib_rtm_delroute(struct sk_buff *skb, struct nlmsghdr *nlh) | |||
505 | struct nlattr *attrs[RTA_MAX+1]; | 505 | struct nlattr *attrs[RTA_MAX+1]; |
506 | int err; | 506 | int err; |
507 | 507 | ||
508 | if (!capable(CAP_NET_ADMIN)) | 508 | if (!netlink_capable(skb, CAP_NET_ADMIN)) |
509 | return -EPERM; | 509 | return -EPERM; |
510 | 510 | ||
511 | if (!net_eq(net, &init_net)) | 511 | if (!net_eq(net, &init_net)) |
@@ -530,7 +530,7 @@ static int dn_fib_rtm_newroute(struct sk_buff *skb, struct nlmsghdr *nlh) | |||
530 | struct nlattr *attrs[RTA_MAX+1]; | 530 | struct nlattr *attrs[RTA_MAX+1]; |
531 | int err; | 531 | int err; |
532 | 532 | ||
533 | if (!capable(CAP_NET_ADMIN)) | 533 | if (!netlink_capable(skb, CAP_NET_ADMIN)) |
534 | return -EPERM; | 534 | return -EPERM; |
535 | 535 | ||
536 | if (!net_eq(net, &init_net)) | 536 | if (!net_eq(net, &init_net)) |
diff --git a/net/decnet/netfilter/dn_rtmsg.c b/net/decnet/netfilter/dn_rtmsg.c index e83015cecfa7..e4d9560a910b 100644 --- a/net/decnet/netfilter/dn_rtmsg.c +++ b/net/decnet/netfilter/dn_rtmsg.c | |||
@@ -107,7 +107,7 @@ static inline void dnrmg_receive_user_skb(struct sk_buff *skb) | |||
107 | if (nlh->nlmsg_len < sizeof(*nlh) || skb->len < nlh->nlmsg_len) | 107 | if (nlh->nlmsg_len < sizeof(*nlh) || skb->len < nlh->nlmsg_len) |
108 | return; | 108 | return; |
109 | 109 | ||
110 | if (!capable(CAP_NET_ADMIN)) | 110 | if (!netlink_capable(skb, CAP_NET_ADMIN)) |
111 | RCV_SKB_FAIL(-EPERM); | 111 | RCV_SKB_FAIL(-EPERM); |
112 | 112 | ||
113 | /* Eventually we might send routing messages too */ | 113 | /* Eventually we might send routing messages too */ |
diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c index 6765d91b8e75..211c0cc6c3d3 100644 --- a/net/ipv4/af_inet.c +++ b/net/ipv4/af_inet.c | |||
@@ -1619,6 +1619,39 @@ static int __init init_ipv4_mibs(void) | |||
1619 | return register_pernet_subsys(&ipv4_mib_ops); | 1619 | return register_pernet_subsys(&ipv4_mib_ops); |
1620 | } | 1620 | } |
1621 | 1621 | ||
1622 | static __net_init int inet_init_net(struct net *net) | ||
1623 | { | ||
1624 | /* | ||
1625 | * Set defaults for local port range | ||
1626 | */ | ||
1627 | seqlock_init(&net->ipv4.ip_local_ports.lock); | ||
1628 | net->ipv4.ip_local_ports.range[0] = 32768; | ||
1629 | net->ipv4.ip_local_ports.range[1] = 61000; | ||
1630 | |||
1631 | seqlock_init(&net->ipv4.ping_group_range.lock); | ||
1632 | /* | ||
1633 | * Sane defaults - nobody may create ping sockets. | ||
1634 | * Boot scripts should set this to distro-specific group. | ||
1635 | */ | ||
1636 | net->ipv4.ping_group_range.range[0] = make_kgid(&init_user_ns, 1); | ||
1637 | net->ipv4.ping_group_range.range[1] = make_kgid(&init_user_ns, 0); | ||
1638 | return 0; | ||
1639 | } | ||
1640 | |||
1641 | static __net_exit void inet_exit_net(struct net *net) | ||
1642 | { | ||
1643 | } | ||
1644 | |||
1645 | static __net_initdata struct pernet_operations af_inet_ops = { | ||
1646 | .init = inet_init_net, | ||
1647 | .exit = inet_exit_net, | ||
1648 | }; | ||
1649 | |||
1650 | static int __init init_inet_pernet_ops(void) | ||
1651 | { | ||
1652 | return register_pernet_subsys(&af_inet_ops); | ||
1653 | } | ||
1654 | |||
1622 | static int ipv4_proc_init(void); | 1655 | static int ipv4_proc_init(void); |
1623 | 1656 | ||
1624 | /* | 1657 | /* |
@@ -1763,6 +1796,9 @@ static int __init inet_init(void) | |||
1763 | if (ip_mr_init()) | 1796 | if (ip_mr_init()) |
1764 | pr_crit("%s: Cannot init ipv4 mroute\n", __func__); | 1797 | pr_crit("%s: Cannot init ipv4 mroute\n", __func__); |
1765 | #endif | 1798 | #endif |
1799 | |||
1800 | if (init_inet_pernet_ops()) | ||
1801 | pr_crit("%s: Cannot init ipv4 inet pernet ops\n", __func__); | ||
1766 | /* | 1802 | /* |
1767 | * Initialise per-cpu ipv4 mibs | 1803 | * Initialise per-cpu ipv4 mibs |
1768 | */ | 1804 | */ |
diff --git a/net/ipv4/fib_semantics.c b/net/ipv4/fib_semantics.c index 8a043f03c88e..b10cd43a4722 100644 --- a/net/ipv4/fib_semantics.c +++ b/net/ipv4/fib_semantics.c | |||
@@ -821,13 +821,13 @@ struct fib_info *fib_create_info(struct fib_config *cfg) | |||
821 | fi = kzalloc(sizeof(*fi)+nhs*sizeof(struct fib_nh), GFP_KERNEL); | 821 | fi = kzalloc(sizeof(*fi)+nhs*sizeof(struct fib_nh), GFP_KERNEL); |
822 | if (fi == NULL) | 822 | if (fi == NULL) |
823 | goto failure; | 823 | goto failure; |
824 | fib_info_cnt++; | ||
824 | if (cfg->fc_mx) { | 825 | if (cfg->fc_mx) { |
825 | fi->fib_metrics = kzalloc(sizeof(u32) * RTAX_MAX, GFP_KERNEL); | 826 | fi->fib_metrics = kzalloc(sizeof(u32) * RTAX_MAX, GFP_KERNEL); |
826 | if (!fi->fib_metrics) | 827 | if (!fi->fib_metrics) |
827 | goto failure; | 828 | goto failure; |
828 | } else | 829 | } else |
829 | fi->fib_metrics = (u32 *) dst_default_metrics; | 830 | fi->fib_metrics = (u32 *) dst_default_metrics; |
830 | fib_info_cnt++; | ||
831 | 831 | ||
832 | fi->fib_net = hold_net(net); | 832 | fi->fib_net = hold_net(net); |
833 | fi->fib_protocol = cfg->fc_protocol; | 833 | fi->fib_protocol = cfg->fc_protocol; |
diff --git a/net/ipv4/inet_connection_sock.c b/net/ipv4/inet_connection_sock.c index 0d1e2cb877ec..a56b8e6e866a 100644 --- a/net/ipv4/inet_connection_sock.c +++ b/net/ipv4/inet_connection_sock.c | |||
@@ -37,11 +37,11 @@ void inet_get_local_port_range(struct net *net, int *low, int *high) | |||
37 | unsigned int seq; | 37 | unsigned int seq; |
38 | 38 | ||
39 | do { | 39 | do { |
40 | seq = read_seqbegin(&net->ipv4.sysctl_local_ports.lock); | 40 | seq = read_seqbegin(&net->ipv4.ip_local_ports.lock); |
41 | 41 | ||
42 | *low = net->ipv4.sysctl_local_ports.range[0]; | 42 | *low = net->ipv4.ip_local_ports.range[0]; |
43 | *high = net->ipv4.sysctl_local_ports.range[1]; | 43 | *high = net->ipv4.ip_local_ports.range[1]; |
44 | } while (read_seqretry(&net->ipv4.sysctl_local_ports.lock, seq)); | 44 | } while (read_seqretry(&net->ipv4.ip_local_ports.lock, seq)); |
45 | } | 45 | } |
46 | EXPORT_SYMBOL(inet_get_local_port_range); | 46 | EXPORT_SYMBOL(inet_get_local_port_range); |
47 | 47 | ||
diff --git a/net/ipv4/ip_forward.c b/net/ipv4/ip_forward.c index be8abe73bb9f..6f111e48e11c 100644 --- a/net/ipv4/ip_forward.c +++ b/net/ipv4/ip_forward.c | |||
@@ -42,12 +42,12 @@ | |||
42 | static bool ip_may_fragment(const struct sk_buff *skb) | 42 | static bool ip_may_fragment(const struct sk_buff *skb) |
43 | { | 43 | { |
44 | return unlikely((ip_hdr(skb)->frag_off & htons(IP_DF)) == 0) || | 44 | return unlikely((ip_hdr(skb)->frag_off & htons(IP_DF)) == 0) || |
45 | !skb->local_df; | 45 | skb->local_df; |
46 | } | 46 | } |
47 | 47 | ||
48 | static bool ip_exceeds_mtu(const struct sk_buff *skb, unsigned int mtu) | 48 | static bool ip_exceeds_mtu(const struct sk_buff *skb, unsigned int mtu) |
49 | { | 49 | { |
50 | if (skb->len <= mtu || skb->local_df) | 50 | if (skb->len <= mtu) |
51 | return false; | 51 | return false; |
52 | 52 | ||
53 | if (skb_is_gso(skb) && skb_gso_network_seglen(skb) <= mtu) | 53 | if (skb_is_gso(skb) && skb_gso_network_seglen(skb) <= mtu) |
@@ -56,53 +56,6 @@ static bool ip_exceeds_mtu(const struct sk_buff *skb, unsigned int mtu) | |||
56 | return true; | 56 | return true; |
57 | } | 57 | } |
58 | 58 | ||
59 | static bool ip_gso_exceeds_dst_mtu(const struct sk_buff *skb) | ||
60 | { | ||
61 | unsigned int mtu; | ||
62 | |||
63 | if (skb->local_df || !skb_is_gso(skb)) | ||
64 | return false; | ||
65 | |||
66 | mtu = ip_dst_mtu_maybe_forward(skb_dst(skb), true); | ||
67 | |||
68 | /* if seglen > mtu, do software segmentation for IP fragmentation on | ||
69 | * output. DF bit cannot be set since ip_forward would have sent | ||
70 | * icmp error. | ||
71 | */ | ||
72 | return skb_gso_network_seglen(skb) > mtu; | ||
73 | } | ||
74 | |||
75 | /* called if GSO skb needs to be fragmented on forward */ | ||
76 | static int ip_forward_finish_gso(struct sk_buff *skb) | ||
77 | { | ||
78 | struct dst_entry *dst = skb_dst(skb); | ||
79 | netdev_features_t features; | ||
80 | struct sk_buff *segs; | ||
81 | int ret = 0; | ||
82 | |||
83 | features = netif_skb_dev_features(skb, dst->dev); | ||
84 | segs = skb_gso_segment(skb, features & ~NETIF_F_GSO_MASK); | ||
85 | if (IS_ERR(segs)) { | ||
86 | kfree_skb(skb); | ||
87 | return -ENOMEM; | ||
88 | } | ||
89 | |||
90 | consume_skb(skb); | ||
91 | |||
92 | do { | ||
93 | struct sk_buff *nskb = segs->next; | ||
94 | int err; | ||
95 | |||
96 | segs->next = NULL; | ||
97 | err = dst_output(segs); | ||
98 | |||
99 | if (err && ret == 0) | ||
100 | ret = err; | ||
101 | segs = nskb; | ||
102 | } while (segs); | ||
103 | |||
104 | return ret; | ||
105 | } | ||
106 | 59 | ||
107 | static int ip_forward_finish(struct sk_buff *skb) | 60 | static int ip_forward_finish(struct sk_buff *skb) |
108 | { | 61 | { |
@@ -114,9 +67,6 @@ static int ip_forward_finish(struct sk_buff *skb) | |||
114 | if (unlikely(opt->optlen)) | 67 | if (unlikely(opt->optlen)) |
115 | ip_forward_options(skb); | 68 | ip_forward_options(skb); |
116 | 69 | ||
117 | if (ip_gso_exceeds_dst_mtu(skb)) | ||
118 | return ip_forward_finish_gso(skb); | ||
119 | |||
120 | return dst_output(skb); | 70 | return dst_output(skb); |
121 | } | 71 | } |
122 | 72 | ||
diff --git a/net/ipv4/ip_fragment.c b/net/ipv4/ip_fragment.c index c10a3ce5cbff..ed32313e307c 100644 --- a/net/ipv4/ip_fragment.c +++ b/net/ipv4/ip_fragment.c | |||
@@ -232,8 +232,9 @@ static void ip_expire(unsigned long arg) | |||
232 | * "Fragment Reassembly Timeout" message, per RFC792. | 232 | * "Fragment Reassembly Timeout" message, per RFC792. |
233 | */ | 233 | */ |
234 | if (qp->user == IP_DEFRAG_AF_PACKET || | 234 | if (qp->user == IP_DEFRAG_AF_PACKET || |
235 | (qp->user == IP_DEFRAG_CONNTRACK_IN && | 235 | ((qp->user >= IP_DEFRAG_CONNTRACK_IN) && |
236 | skb_rtable(head)->rt_type != RTN_LOCAL)) | 236 | (qp->user <= __IP_DEFRAG_CONNTRACK_IN_END) && |
237 | (skb_rtable(head)->rt_type != RTN_LOCAL))) | ||
237 | goto out_rcu_unlock; | 238 | goto out_rcu_unlock; |
238 | 239 | ||
239 | 240 | ||
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c index 1cbeba5edff9..a52f50187b54 100644 --- a/net/ipv4/ip_output.c +++ b/net/ipv4/ip_output.c | |||
@@ -211,6 +211,48 @@ static inline int ip_finish_output2(struct sk_buff *skb) | |||
211 | return -EINVAL; | 211 | return -EINVAL; |
212 | } | 212 | } |
213 | 213 | ||
214 | static int ip_finish_output_gso(struct sk_buff *skb) | ||
215 | { | ||
216 | netdev_features_t features; | ||
217 | struct sk_buff *segs; | ||
218 | int ret = 0; | ||
219 | |||
220 | /* common case: locally created skb or seglen is <= mtu */ | ||
221 | if (((IPCB(skb)->flags & IPSKB_FORWARDED) == 0) || | ||
222 | skb_gso_network_seglen(skb) <= ip_skb_dst_mtu(skb)) | ||
223 | return ip_finish_output2(skb); | ||
224 | |||
225 | /* Slowpath - GSO segment length is exceeding the dst MTU. | ||
226 | * | ||
227 | * This can happen in two cases: | ||
228 | * 1) TCP GRO packet, DF bit not set | ||
229 | * 2) skb arrived via virtio-net, we thus get TSO/GSO skbs directly | ||
230 | * from host network stack. | ||
231 | */ | ||
232 | features = netif_skb_features(skb); | ||
233 | segs = skb_gso_segment(skb, features & ~NETIF_F_GSO_MASK); | ||
234 | if (IS_ERR(segs)) { | ||
235 | kfree_skb(skb); | ||
236 | return -ENOMEM; | ||
237 | } | ||
238 | |||
239 | consume_skb(skb); | ||
240 | |||
241 | do { | ||
242 | struct sk_buff *nskb = segs->next; | ||
243 | int err; | ||
244 | |||
245 | segs->next = NULL; | ||
246 | err = ip_fragment(segs, ip_finish_output2); | ||
247 | |||
248 | if (err && ret == 0) | ||
249 | ret = err; | ||
250 | segs = nskb; | ||
251 | } while (segs); | ||
252 | |||
253 | return ret; | ||
254 | } | ||
255 | |||
214 | static int ip_finish_output(struct sk_buff *skb) | 256 | static int ip_finish_output(struct sk_buff *skb) |
215 | { | 257 | { |
216 | #if defined(CONFIG_NETFILTER) && defined(CONFIG_XFRM) | 258 | #if defined(CONFIG_NETFILTER) && defined(CONFIG_XFRM) |
@@ -220,10 +262,13 @@ static int ip_finish_output(struct sk_buff *skb) | |||
220 | return dst_output(skb); | 262 | return dst_output(skb); |
221 | } | 263 | } |
222 | #endif | 264 | #endif |
223 | if (skb->len > ip_skb_dst_mtu(skb) && !skb_is_gso(skb)) | 265 | if (skb_is_gso(skb)) |
266 | return ip_finish_output_gso(skb); | ||
267 | |||
268 | if (skb->len > ip_skb_dst_mtu(skb)) | ||
224 | return ip_fragment(skb, ip_finish_output2); | 269 | return ip_fragment(skb, ip_finish_output2); |
225 | else | 270 | |
226 | return ip_finish_output2(skb); | 271 | return ip_finish_output2(skb); |
227 | } | 272 | } |
228 | 273 | ||
229 | int ip_mc_output(struct sock *sk, struct sk_buff *skb) | 274 | int ip_mc_output(struct sock *sk, struct sk_buff *skb) |
diff --git a/net/ipv4/ip_tunnel.c b/net/ipv4/ip_tunnel.c index fa5b7519765f..b3f859731c60 100644 --- a/net/ipv4/ip_tunnel.c +++ b/net/ipv4/ip_tunnel.c | |||
@@ -442,6 +442,8 @@ int ip_tunnel_rcv(struct ip_tunnel *tunnel, struct sk_buff *skb, | |||
442 | tunnel->i_seqno = ntohl(tpi->seq) + 1; | 442 | tunnel->i_seqno = ntohl(tpi->seq) + 1; |
443 | } | 443 | } |
444 | 444 | ||
445 | skb_reset_network_header(skb); | ||
446 | |||
445 | err = IP_ECN_decapsulate(iph, skb); | 447 | err = IP_ECN_decapsulate(iph, skb); |
446 | if (unlikely(err)) { | 448 | if (unlikely(err)) { |
447 | if (log_ecn_error) | 449 | if (log_ecn_error) |
diff --git a/net/ipv4/netfilter/nf_defrag_ipv4.c b/net/ipv4/netfilter/nf_defrag_ipv4.c index 12e13bd82b5b..f40f321b41fc 100644 --- a/net/ipv4/netfilter/nf_defrag_ipv4.c +++ b/net/ipv4/netfilter/nf_defrag_ipv4.c | |||
@@ -22,7 +22,6 @@ | |||
22 | #endif | 22 | #endif |
23 | #include <net/netfilter/nf_conntrack_zones.h> | 23 | #include <net/netfilter/nf_conntrack_zones.h> |
24 | 24 | ||
25 | /* Returns new sk_buff, or NULL */ | ||
26 | static int nf_ct_ipv4_gather_frags(struct sk_buff *skb, u_int32_t user) | 25 | static int nf_ct_ipv4_gather_frags(struct sk_buff *skb, u_int32_t user) |
27 | { | 26 | { |
28 | int err; | 27 | int err; |
@@ -33,8 +32,10 @@ static int nf_ct_ipv4_gather_frags(struct sk_buff *skb, u_int32_t user) | |||
33 | err = ip_defrag(skb, user); | 32 | err = ip_defrag(skb, user); |
34 | local_bh_enable(); | 33 | local_bh_enable(); |
35 | 34 | ||
36 | if (!err) | 35 | if (!err) { |
37 | ip_send_check(ip_hdr(skb)); | 36 | ip_send_check(ip_hdr(skb)); |
37 | skb->local_df = 1; | ||
38 | } | ||
38 | 39 | ||
39 | return err; | 40 | return err; |
40 | } | 41 | } |
diff --git a/net/ipv4/ping.c b/net/ipv4/ping.c index 8210964a9f19..044a0ddf6a79 100644 --- a/net/ipv4/ping.c +++ b/net/ipv4/ping.c | |||
@@ -236,15 +236,15 @@ exit: | |||
236 | static void inet_get_ping_group_range_net(struct net *net, kgid_t *low, | 236 | static void inet_get_ping_group_range_net(struct net *net, kgid_t *low, |
237 | kgid_t *high) | 237 | kgid_t *high) |
238 | { | 238 | { |
239 | kgid_t *data = net->ipv4.sysctl_ping_group_range; | 239 | kgid_t *data = net->ipv4.ping_group_range.range; |
240 | unsigned int seq; | 240 | unsigned int seq; |
241 | 241 | ||
242 | do { | 242 | do { |
243 | seq = read_seqbegin(&net->ipv4.sysctl_local_ports.lock); | 243 | seq = read_seqbegin(&net->ipv4.ping_group_range.lock); |
244 | 244 | ||
245 | *low = data[0]; | 245 | *low = data[0]; |
246 | *high = data[1]; | 246 | *high = data[1]; |
247 | } while (read_seqretry(&net->ipv4.sysctl_local_ports.lock, seq)); | 247 | } while (read_seqretry(&net->ipv4.ping_group_range.lock, seq)); |
248 | } | 248 | } |
249 | 249 | ||
250 | 250 | ||
diff --git a/net/ipv4/sysctl_net_ipv4.c b/net/ipv4/sysctl_net_ipv4.c index 44eba052b43d..5cde8f263d40 100644 --- a/net/ipv4/sysctl_net_ipv4.c +++ b/net/ipv4/sysctl_net_ipv4.c | |||
@@ -45,10 +45,10 @@ static int ip_ping_group_range_max[] = { GID_T_MAX, GID_T_MAX }; | |||
45 | /* Update system visible IP port range */ | 45 | /* Update system visible IP port range */ |
46 | static void set_local_port_range(struct net *net, int range[2]) | 46 | static void set_local_port_range(struct net *net, int range[2]) |
47 | { | 47 | { |
48 | write_seqlock(&net->ipv4.sysctl_local_ports.lock); | 48 | write_seqlock(&net->ipv4.ip_local_ports.lock); |
49 | net->ipv4.sysctl_local_ports.range[0] = range[0]; | 49 | net->ipv4.ip_local_ports.range[0] = range[0]; |
50 | net->ipv4.sysctl_local_ports.range[1] = range[1]; | 50 | net->ipv4.ip_local_ports.range[1] = range[1]; |
51 | write_sequnlock(&net->ipv4.sysctl_local_ports.lock); | 51 | write_sequnlock(&net->ipv4.ip_local_ports.lock); |
52 | } | 52 | } |
53 | 53 | ||
54 | /* Validate changes from /proc interface. */ | 54 | /* Validate changes from /proc interface. */ |
@@ -57,7 +57,7 @@ static int ipv4_local_port_range(struct ctl_table *table, int write, | |||
57 | size_t *lenp, loff_t *ppos) | 57 | size_t *lenp, loff_t *ppos) |
58 | { | 58 | { |
59 | struct net *net = | 59 | struct net *net = |
60 | container_of(table->data, struct net, ipv4.sysctl_local_ports.range); | 60 | container_of(table->data, struct net, ipv4.ip_local_ports.range); |
61 | int ret; | 61 | int ret; |
62 | int range[2]; | 62 | int range[2]; |
63 | struct ctl_table tmp = { | 63 | struct ctl_table tmp = { |
@@ -87,14 +87,14 @@ static void inet_get_ping_group_range_table(struct ctl_table *table, kgid_t *low | |||
87 | { | 87 | { |
88 | kgid_t *data = table->data; | 88 | kgid_t *data = table->data; |
89 | struct net *net = | 89 | struct net *net = |
90 | container_of(table->data, struct net, ipv4.sysctl_ping_group_range); | 90 | container_of(table->data, struct net, ipv4.ping_group_range.range); |
91 | unsigned int seq; | 91 | unsigned int seq; |
92 | do { | 92 | do { |
93 | seq = read_seqbegin(&net->ipv4.sysctl_local_ports.lock); | 93 | seq = read_seqbegin(&net->ipv4.ip_local_ports.lock); |
94 | 94 | ||
95 | *low = data[0]; | 95 | *low = data[0]; |
96 | *high = data[1]; | 96 | *high = data[1]; |
97 | } while (read_seqretry(&net->ipv4.sysctl_local_ports.lock, seq)); | 97 | } while (read_seqretry(&net->ipv4.ip_local_ports.lock, seq)); |
98 | } | 98 | } |
99 | 99 | ||
100 | /* Update system visible IP port range */ | 100 | /* Update system visible IP port range */ |
@@ -102,11 +102,11 @@ static void set_ping_group_range(struct ctl_table *table, kgid_t low, kgid_t hig | |||
102 | { | 102 | { |
103 | kgid_t *data = table->data; | 103 | kgid_t *data = table->data; |
104 | struct net *net = | 104 | struct net *net = |
105 | container_of(table->data, struct net, ipv4.sysctl_ping_group_range); | 105 | container_of(table->data, struct net, ipv4.ping_group_range.range); |
106 | write_seqlock(&net->ipv4.sysctl_local_ports.lock); | 106 | write_seqlock(&net->ipv4.ip_local_ports.lock); |
107 | data[0] = low; | 107 | data[0] = low; |
108 | data[1] = high; | 108 | data[1] = high; |
109 | write_sequnlock(&net->ipv4.sysctl_local_ports.lock); | 109 | write_sequnlock(&net->ipv4.ip_local_ports.lock); |
110 | } | 110 | } |
111 | 111 | ||
112 | /* Validate changes from /proc interface. */ | 112 | /* Validate changes from /proc interface. */ |
@@ -805,7 +805,7 @@ static struct ctl_table ipv4_net_table[] = { | |||
805 | }, | 805 | }, |
806 | { | 806 | { |
807 | .procname = "ping_group_range", | 807 | .procname = "ping_group_range", |
808 | .data = &init_net.ipv4.sysctl_ping_group_range, | 808 | .data = &init_net.ipv4.ping_group_range.range, |
809 | .maxlen = sizeof(gid_t)*2, | 809 | .maxlen = sizeof(gid_t)*2, |
810 | .mode = 0644, | 810 | .mode = 0644, |
811 | .proc_handler = ipv4_ping_group_range, | 811 | .proc_handler = ipv4_ping_group_range, |
@@ -819,8 +819,8 @@ static struct ctl_table ipv4_net_table[] = { | |||
819 | }, | 819 | }, |
820 | { | 820 | { |
821 | .procname = "ip_local_port_range", | 821 | .procname = "ip_local_port_range", |
822 | .maxlen = sizeof(init_net.ipv4.sysctl_local_ports.range), | 822 | .maxlen = sizeof(init_net.ipv4.ip_local_ports.range), |
823 | .data = &init_net.ipv4.sysctl_local_ports.range, | 823 | .data = &init_net.ipv4.ip_local_ports.range, |
824 | .mode = 0644, | 824 | .mode = 0644, |
825 | .proc_handler = ipv4_local_port_range, | 825 | .proc_handler = ipv4_local_port_range, |
826 | }, | 826 | }, |
@@ -858,20 +858,6 @@ static __net_init int ipv4_sysctl_init_net(struct net *net) | |||
858 | table[i].data += (void *)net - (void *)&init_net; | 858 | table[i].data += (void *)net - (void *)&init_net; |
859 | } | 859 | } |
860 | 860 | ||
861 | /* | ||
862 | * Sane defaults - nobody may create ping sockets. | ||
863 | * Boot scripts should set this to distro-specific group. | ||
864 | */ | ||
865 | net->ipv4.sysctl_ping_group_range[0] = make_kgid(&init_user_ns, 1); | ||
866 | net->ipv4.sysctl_ping_group_range[1] = make_kgid(&init_user_ns, 0); | ||
867 | |||
868 | /* | ||
869 | * Set defaults for local port range | ||
870 | */ | ||
871 | seqlock_init(&net->ipv4.sysctl_local_ports.lock); | ||
872 | net->ipv4.sysctl_local_ports.range[0] = 32768; | ||
873 | net->ipv4.sysctl_local_ports.range[1] = 61000; | ||
874 | |||
875 | net->ipv4.ipv4_hdr = register_net_sysctl(net, "net/ipv4", table); | 861 | net->ipv4.ipv4_hdr = register_net_sysctl(net, "net/ipv4", table); |
876 | if (net->ipv4.ipv4_hdr == NULL) | 862 | if (net->ipv4.ipv4_hdr == NULL) |
877 | goto err_reg; | 863 | goto err_reg; |
diff --git a/net/ipv4/tcp_cubic.c b/net/ipv4/tcp_cubic.c index ba2a4f3a6a1e..a9bd8a4828a9 100644 --- a/net/ipv4/tcp_cubic.c +++ b/net/ipv4/tcp_cubic.c | |||
@@ -408,7 +408,7 @@ static void bictcp_acked(struct sock *sk, u32 cnt, s32 rtt_us) | |||
408 | ratio -= ca->delayed_ack >> ACK_RATIO_SHIFT; | 408 | ratio -= ca->delayed_ack >> ACK_RATIO_SHIFT; |
409 | ratio += cnt; | 409 | ratio += cnt; |
410 | 410 | ||
411 | ca->delayed_ack = min(ratio, ACK_RATIO_LIMIT); | 411 | ca->delayed_ack = clamp(ratio, 1U, ACK_RATIO_LIMIT); |
412 | } | 412 | } |
413 | 413 | ||
414 | /* Some calls are for duplicates without timetamps */ | 414 | /* Some calls are for duplicates without timetamps */ |
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index 89277a34f2c9..694711a140d4 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c | |||
@@ -2488,8 +2488,14 @@ int __tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb) | |||
2488 | err = tcp_transmit_skb(sk, skb, 1, GFP_ATOMIC); | 2488 | err = tcp_transmit_skb(sk, skb, 1, GFP_ATOMIC); |
2489 | } | 2489 | } |
2490 | 2490 | ||
2491 | if (likely(!err)) | 2491 | if (likely(!err)) { |
2492 | TCP_SKB_CB(skb)->sacked |= TCPCB_EVER_RETRANS; | 2492 | TCP_SKB_CB(skb)->sacked |= TCPCB_EVER_RETRANS; |
2493 | /* Update global TCP statistics. */ | ||
2494 | TCP_INC_STATS(sock_net(sk), TCP_MIB_RETRANSSEGS); | ||
2495 | if (TCP_SKB_CB(skb)->tcp_flags & TCPHDR_SYN) | ||
2496 | NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPSYNRETRANS); | ||
2497 | tp->total_retrans++; | ||
2498 | } | ||
2493 | return err; | 2499 | return err; |
2494 | } | 2500 | } |
2495 | 2501 | ||
@@ -2499,12 +2505,6 @@ int tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb) | |||
2499 | int err = __tcp_retransmit_skb(sk, skb); | 2505 | int err = __tcp_retransmit_skb(sk, skb); |
2500 | 2506 | ||
2501 | if (err == 0) { | 2507 | if (err == 0) { |
2502 | /* Update global TCP statistics. */ | ||
2503 | TCP_INC_STATS(sock_net(sk), TCP_MIB_RETRANSSEGS); | ||
2504 | if (TCP_SKB_CB(skb)->tcp_flags & TCPHDR_SYN) | ||
2505 | NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPSYNRETRANS); | ||
2506 | tp->total_retrans++; | ||
2507 | |||
2508 | #if FASTRETRANS_DEBUG > 0 | 2508 | #if FASTRETRANS_DEBUG > 0 |
2509 | if (TCP_SKB_CB(skb)->sacked & TCPCB_SACKED_RETRANS) { | 2509 | if (TCP_SKB_CB(skb)->sacked & TCPCB_SACKED_RETRANS) { |
2510 | net_dbg_ratelimited("retrans_out leaked\n"); | 2510 | net_dbg_ratelimited("retrans_out leaked\n"); |
diff --git a/net/ipv6/ip6_fib.c b/net/ipv6/ip6_fib.c index 6fefd44abbf5..cb4459bd1d29 100644 --- a/net/ipv6/ip6_fib.c +++ b/net/ipv6/ip6_fib.c | |||
@@ -1458,7 +1458,7 @@ static int fib6_walk_continue(struct fib6_walker_t *w) | |||
1458 | 1458 | ||
1459 | if (w->skip) { | 1459 | if (w->skip) { |
1460 | w->skip--; | 1460 | w->skip--; |
1461 | continue; | 1461 | goto skip; |
1462 | } | 1462 | } |
1463 | 1463 | ||
1464 | err = w->func(w); | 1464 | err = w->func(w); |
@@ -1468,6 +1468,7 @@ static int fib6_walk_continue(struct fib6_walker_t *w) | |||
1468 | w->count++; | 1468 | w->count++; |
1469 | continue; | 1469 | continue; |
1470 | } | 1470 | } |
1471 | skip: | ||
1471 | w->state = FWS_U; | 1472 | w->state = FWS_U; |
1472 | case FWS_U: | 1473 | case FWS_U: |
1473 | if (fn == w->root) | 1474 | if (fn == w->root) |
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index 40e7581374f7..31a38bde69ef 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c | |||
@@ -344,12 +344,16 @@ static unsigned int ip6_dst_mtu_forward(const struct dst_entry *dst) | |||
344 | 344 | ||
345 | static bool ip6_pkt_too_big(const struct sk_buff *skb, unsigned int mtu) | 345 | static bool ip6_pkt_too_big(const struct sk_buff *skb, unsigned int mtu) |
346 | { | 346 | { |
347 | if (skb->len <= mtu || skb->local_df) | 347 | if (skb->len <= mtu) |
348 | return false; | 348 | return false; |
349 | 349 | ||
350 | /* ipv6 conntrack defrag sets max_frag_size + local_df */ | ||
350 | if (IP6CB(skb)->frag_max_size && IP6CB(skb)->frag_max_size > mtu) | 351 | if (IP6CB(skb)->frag_max_size && IP6CB(skb)->frag_max_size > mtu) |
351 | return true; | 352 | return true; |
352 | 353 | ||
354 | if (skb->local_df) | ||
355 | return false; | ||
356 | |||
353 | if (skb_is_gso(skb) && skb_gso_network_seglen(skb) <= mtu) | 357 | if (skb_is_gso(skb) && skb_gso_network_seglen(skb) <= mtu) |
354 | return false; | 358 | return false; |
355 | 359 | ||
diff --git a/net/ipv6/ip6mr.c b/net/ipv6/ip6mr.c index 8659067da28e..8250474ab7dc 100644 --- a/net/ipv6/ip6mr.c +++ b/net/ipv6/ip6mr.c | |||
@@ -1633,7 +1633,7 @@ struct sock *mroute6_socket(struct net *net, struct sk_buff *skb) | |||
1633 | { | 1633 | { |
1634 | struct mr6_table *mrt; | 1634 | struct mr6_table *mrt; |
1635 | struct flowi6 fl6 = { | 1635 | struct flowi6 fl6 = { |
1636 | .flowi6_iif = skb->skb_iif, | 1636 | .flowi6_iif = skb->skb_iif ? : LOOPBACK_IFINDEX, |
1637 | .flowi6_oif = skb->dev->ifindex, | 1637 | .flowi6_oif = skb->dev->ifindex, |
1638 | .flowi6_mark = skb->mark, | 1638 | .flowi6_mark = skb->mark, |
1639 | }; | 1639 | }; |
diff --git a/net/ipv6/netfilter.c b/net/ipv6/netfilter.c index 95f3f1da0d7f..d38e6a8d8b9f 100644 --- a/net/ipv6/netfilter.c +++ b/net/ipv6/netfilter.c | |||
@@ -30,13 +30,15 @@ int ip6_route_me_harder(struct sk_buff *skb) | |||
30 | .daddr = iph->daddr, | 30 | .daddr = iph->daddr, |
31 | .saddr = iph->saddr, | 31 | .saddr = iph->saddr, |
32 | }; | 32 | }; |
33 | int err; | ||
33 | 34 | ||
34 | dst = ip6_route_output(net, skb->sk, &fl6); | 35 | dst = ip6_route_output(net, skb->sk, &fl6); |
35 | if (dst->error) { | 36 | err = dst->error; |
37 | if (err) { | ||
36 | IP6_INC_STATS(net, ip6_dst_idev(dst), IPSTATS_MIB_OUTNOROUTES); | 38 | IP6_INC_STATS(net, ip6_dst_idev(dst), IPSTATS_MIB_OUTNOROUTES); |
37 | LIMIT_NETDEBUG(KERN_DEBUG "ip6_route_me_harder: No more route.\n"); | 39 | LIMIT_NETDEBUG(KERN_DEBUG "ip6_route_me_harder: No more route.\n"); |
38 | dst_release(dst); | 40 | dst_release(dst); |
39 | return dst->error; | 41 | return err; |
40 | } | 42 | } |
41 | 43 | ||
42 | /* Drop old route. */ | 44 | /* Drop old route. */ |
diff --git a/net/ipv6/netfilter/ip6t_rpfilter.c b/net/ipv6/netfilter/ip6t_rpfilter.c index e0983f3648a6..790e0c6b19e1 100644 --- a/net/ipv6/netfilter/ip6t_rpfilter.c +++ b/net/ipv6/netfilter/ip6t_rpfilter.c | |||
@@ -33,6 +33,7 @@ static bool rpfilter_lookup_reverse6(const struct sk_buff *skb, | |||
33 | struct ipv6hdr *iph = ipv6_hdr(skb); | 33 | struct ipv6hdr *iph = ipv6_hdr(skb); |
34 | bool ret = false; | 34 | bool ret = false; |
35 | struct flowi6 fl6 = { | 35 | struct flowi6 fl6 = { |
36 | .flowi6_iif = LOOPBACK_IFINDEX, | ||
36 | .flowlabel = (* (__be32 *) iph) & IPV6_FLOWINFO_MASK, | 37 | .flowlabel = (* (__be32 *) iph) & IPV6_FLOWINFO_MASK, |
37 | .flowi6_proto = iph->nexthdr, | 38 | .flowi6_proto = iph->nexthdr, |
38 | .daddr = iph->saddr, | 39 | .daddr = iph->saddr, |
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index 4011617cca68..004fffb6c221 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
@@ -1273,6 +1273,7 @@ void ip6_redirect(struct sk_buff *skb, struct net *net, int oif, u32 mark) | |||
1273 | struct flowi6 fl6; | 1273 | struct flowi6 fl6; |
1274 | 1274 | ||
1275 | memset(&fl6, 0, sizeof(fl6)); | 1275 | memset(&fl6, 0, sizeof(fl6)); |
1276 | fl6.flowi6_iif = LOOPBACK_IFINDEX; | ||
1276 | fl6.flowi6_oif = oif; | 1277 | fl6.flowi6_oif = oif; |
1277 | fl6.flowi6_mark = mark; | 1278 | fl6.flowi6_mark = mark; |
1278 | fl6.daddr = iph->daddr; | 1279 | fl6.daddr = iph->daddr; |
@@ -1294,6 +1295,7 @@ void ip6_redirect_no_header(struct sk_buff *skb, struct net *net, int oif, | |||
1294 | struct flowi6 fl6; | 1295 | struct flowi6 fl6; |
1295 | 1296 | ||
1296 | memset(&fl6, 0, sizeof(fl6)); | 1297 | memset(&fl6, 0, sizeof(fl6)); |
1298 | fl6.flowi6_iif = LOOPBACK_IFINDEX; | ||
1297 | fl6.flowi6_oif = oif; | 1299 | fl6.flowi6_oif = oif; |
1298 | fl6.flowi6_mark = mark; | 1300 | fl6.flowi6_mark = mark; |
1299 | fl6.daddr = msg->dest; | 1301 | fl6.daddr = msg->dest; |
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c index 0e5b67015650..394e201cde6d 100644 --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c | |||
@@ -1232,7 +1232,8 @@ ieee80211_rx_h_sta_process(struct ieee80211_rx_data *rx) | |||
1232 | if (ether_addr_equal(bssid, rx->sdata->u.ibss.bssid) && | 1232 | if (ether_addr_equal(bssid, rx->sdata->u.ibss.bssid) && |
1233 | test_sta_flag(sta, WLAN_STA_AUTHORIZED)) { | 1233 | test_sta_flag(sta, WLAN_STA_AUTHORIZED)) { |
1234 | sta->last_rx = jiffies; | 1234 | sta->last_rx = jiffies; |
1235 | if (ieee80211_is_data(hdr->frame_control)) { | 1235 | if (ieee80211_is_data(hdr->frame_control) && |
1236 | !is_multicast_ether_addr(hdr->addr1)) { | ||
1236 | sta->last_rx_rate_idx = status->rate_idx; | 1237 | sta->last_rx_rate_idx = status->rate_idx; |
1237 | sta->last_rx_rate_flag = status->flag; | 1238 | sta->last_rx_rate_flag = status->flag; |
1238 | sta->last_rx_rate_vht_flag = status->vht_flag; | 1239 | sta->last_rx_rate_vht_flag = status->vht_flag; |
diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c index c34a5f97abc7..632d372bb511 100644 --- a/net/mac80211/sta_info.c +++ b/net/mac80211/sta_info.c | |||
@@ -1147,7 +1147,8 @@ void ieee80211_sta_ps_deliver_wakeup(struct sta_info *sta) | |||
1147 | atomic_dec(&ps->num_sta_ps); | 1147 | atomic_dec(&ps->num_sta_ps); |
1148 | 1148 | ||
1149 | /* This station just woke up and isn't aware of our SMPS state */ | 1149 | /* This station just woke up and isn't aware of our SMPS state */ |
1150 | if (!ieee80211_smps_is_restrictive(sta->known_smps_mode, | 1150 | if (!ieee80211_vif_is_mesh(&sdata->vif) && |
1151 | !ieee80211_smps_is_restrictive(sta->known_smps_mode, | ||
1151 | sdata->smps_mode) && | 1152 | sdata->smps_mode) && |
1152 | sta->known_smps_mode != sdata->bss->req_smps && | 1153 | sta->known_smps_mode != sdata->bss->req_smps && |
1153 | sta_info_tx_streams(sta) != 1) { | 1154 | sta_info_tx_streams(sta) != 1) { |
diff --git a/net/mac80211/status.c b/net/mac80211/status.c index 00ba90b02ab2..60cb7a665976 100644 --- a/net/mac80211/status.c +++ b/net/mac80211/status.c | |||
@@ -314,10 +314,9 @@ ieee80211_add_tx_radiotap_header(struct ieee80211_local *local, | |||
314 | !is_multicast_ether_addr(hdr->addr1)) | 314 | !is_multicast_ether_addr(hdr->addr1)) |
315 | txflags |= IEEE80211_RADIOTAP_F_TX_FAIL; | 315 | txflags |= IEEE80211_RADIOTAP_F_TX_FAIL; |
316 | 316 | ||
317 | if ((info->status.rates[0].flags & IEEE80211_TX_RC_USE_RTS_CTS) || | 317 | if (info->status.rates[0].flags & IEEE80211_TX_RC_USE_CTS_PROTECT) |
318 | (info->status.rates[0].flags & IEEE80211_TX_RC_USE_CTS_PROTECT)) | ||
319 | txflags |= IEEE80211_RADIOTAP_F_TX_CTS; | 318 | txflags |= IEEE80211_RADIOTAP_F_TX_CTS; |
320 | else if (info->status.rates[0].flags & IEEE80211_TX_RC_USE_RTS_CTS) | 319 | if (info->status.rates[0].flags & IEEE80211_TX_RC_USE_RTS_CTS) |
321 | txflags |= IEEE80211_RADIOTAP_F_TX_RTS; | 320 | txflags |= IEEE80211_RADIOTAP_F_TX_RTS; |
322 | 321 | ||
323 | put_unaligned_le16(txflags, pos); | 322 | put_unaligned_le16(txflags, pos); |
diff --git a/net/mac80211/util.c b/net/mac80211/util.c index ad058759e85e..c08bd4aca6bb 100644 --- a/net/mac80211/util.c +++ b/net/mac80211/util.c | |||
@@ -1777,7 +1777,7 @@ int ieee80211_reconfig(struct ieee80211_local *local) | |||
1777 | mutex_unlock(&local->mtx); | 1777 | mutex_unlock(&local->mtx); |
1778 | 1778 | ||
1779 | if (sched_scan_stopped) | 1779 | if (sched_scan_stopped) |
1780 | cfg80211_sched_scan_stopped(local->hw.wiphy); | 1780 | cfg80211_sched_scan_stopped_rtnl(local->hw.wiphy); |
1781 | 1781 | ||
1782 | /* | 1782 | /* |
1783 | * If this is for hw restart things are still running. | 1783 | * If this is for hw restart things are still running. |
diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c index ccc46fa5edbc..58579634427d 100644 --- a/net/netfilter/nf_conntrack_netlink.c +++ b/net/netfilter/nf_conntrack_netlink.c | |||
@@ -1336,6 +1336,9 @@ ctnetlink_setup_nat(struct nf_conn *ct, const struct nlattr * const cda[]) | |||
1336 | #ifdef CONFIG_NF_NAT_NEEDED | 1336 | #ifdef CONFIG_NF_NAT_NEEDED |
1337 | int ret; | 1337 | int ret; |
1338 | 1338 | ||
1339 | if (!cda[CTA_NAT_DST] && !cda[CTA_NAT_SRC]) | ||
1340 | return 0; | ||
1341 | |||
1339 | ret = ctnetlink_parse_nat_setup(ct, NF_NAT_MANIP_DST, | 1342 | ret = ctnetlink_parse_nat_setup(ct, NF_NAT_MANIP_DST, |
1340 | cda[CTA_NAT_DST]); | 1343 | cda[CTA_NAT_DST]); |
1341 | if (ret < 0) | 1344 | if (ret < 0) |
diff --git a/net/netfilter/nfnetlink.c b/net/netfilter/nfnetlink.c index 6e42dcfad40a..c138b8fbe280 100644 --- a/net/netfilter/nfnetlink.c +++ b/net/netfilter/nfnetlink.c | |||
@@ -256,15 +256,15 @@ replay: | |||
256 | #endif | 256 | #endif |
257 | { | 257 | { |
258 | nfnl_unlock(subsys_id); | 258 | nfnl_unlock(subsys_id); |
259 | kfree_skb(nskb); | 259 | netlink_ack(skb, nlh, -EOPNOTSUPP); |
260 | return netlink_ack(skb, nlh, -EOPNOTSUPP); | 260 | return kfree_skb(nskb); |
261 | } | 261 | } |
262 | } | 262 | } |
263 | 263 | ||
264 | if (!ss->commit || !ss->abort) { | 264 | if (!ss->commit || !ss->abort) { |
265 | nfnl_unlock(subsys_id); | 265 | nfnl_unlock(subsys_id); |
266 | kfree_skb(nskb); | 266 | netlink_ack(skb, nlh, -EOPNOTSUPP); |
267 | return netlink_ack(skb, nlh, -EOPNOTSUPP); | 267 | return kfree_skb(skb); |
268 | } | 268 | } |
269 | 269 | ||
270 | while (skb->len >= nlmsg_total_size(0)) { | 270 | while (skb->len >= nlmsg_total_size(0)) { |
@@ -368,14 +368,13 @@ done: | |||
368 | static void nfnetlink_rcv(struct sk_buff *skb) | 368 | static void nfnetlink_rcv(struct sk_buff *skb) |
369 | { | 369 | { |
370 | struct nlmsghdr *nlh = nlmsg_hdr(skb); | 370 | struct nlmsghdr *nlh = nlmsg_hdr(skb); |
371 | struct net *net = sock_net(skb->sk); | ||
372 | int msglen; | 371 | int msglen; |
373 | 372 | ||
374 | if (nlh->nlmsg_len < NLMSG_HDRLEN || | 373 | if (nlh->nlmsg_len < NLMSG_HDRLEN || |
375 | skb->len < nlh->nlmsg_len) | 374 | skb->len < nlh->nlmsg_len) |
376 | return; | 375 | return; |
377 | 376 | ||
378 | if (!ns_capable(net->user_ns, CAP_NET_ADMIN)) { | 377 | if (!netlink_net_capable(skb, CAP_NET_ADMIN)) { |
379 | netlink_ack(skb, nlh, -EPERM); | 378 | netlink_ack(skb, nlh, -EPERM); |
380 | return; | 379 | return; |
381 | } | 380 | } |
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index 92f4b6915e89..e0ccd84d4d67 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c | |||
@@ -1364,7 +1364,72 @@ retry: | |||
1364 | return err; | 1364 | return err; |
1365 | } | 1365 | } |
1366 | 1366 | ||
1367 | static inline int netlink_capable(const struct socket *sock, unsigned int flag) | 1367 | /** |
1368 | * __netlink_ns_capable - General netlink message capability test | ||
1369 | * @nsp: NETLINK_CB of the socket buffer holding a netlink command from userspace. | ||
1370 | * @user_ns: The user namespace of the capability to use | ||
1371 | * @cap: The capability to use | ||
1372 | * | ||
1373 | * Test to see if the opener of the socket we received the message | ||
1374 | * from had when the netlink socket was created and the sender of the | ||
1375 | * message has has the capability @cap in the user namespace @user_ns. | ||
1376 | */ | ||
1377 | bool __netlink_ns_capable(const struct netlink_skb_parms *nsp, | ||
1378 | struct user_namespace *user_ns, int cap) | ||
1379 | { | ||
1380 | return sk_ns_capable(nsp->sk, user_ns, cap); | ||
1381 | } | ||
1382 | EXPORT_SYMBOL(__netlink_ns_capable); | ||
1383 | |||
1384 | /** | ||
1385 | * netlink_ns_capable - General netlink message capability test | ||
1386 | * @skb: socket buffer holding a netlink command from userspace | ||
1387 | * @user_ns: The user namespace of the capability to use | ||
1388 | * @cap: The capability to use | ||
1389 | * | ||
1390 | * Test to see if the opener of the socket we received the message | ||
1391 | * from had when the netlink socket was created and the sender of the | ||
1392 | * message has has the capability @cap in the user namespace @user_ns. | ||
1393 | */ | ||
1394 | bool netlink_ns_capable(const struct sk_buff *skb, | ||
1395 | struct user_namespace *user_ns, int cap) | ||
1396 | { | ||
1397 | return __netlink_ns_capable(&NETLINK_CB(skb), user_ns, cap); | ||
1398 | } | ||
1399 | EXPORT_SYMBOL(netlink_ns_capable); | ||
1400 | |||
1401 | /** | ||
1402 | * netlink_capable - Netlink global message capability test | ||
1403 | * @skb: socket buffer holding a netlink command from userspace | ||
1404 | * @cap: The capability to use | ||
1405 | * | ||
1406 | * Test to see if the opener of the socket we received the message | ||
1407 | * from had when the netlink socket was created and the sender of the | ||
1408 | * message has has the capability @cap in all user namespaces. | ||
1409 | */ | ||
1410 | bool netlink_capable(const struct sk_buff *skb, int cap) | ||
1411 | { | ||
1412 | return netlink_ns_capable(skb, &init_user_ns, cap); | ||
1413 | } | ||
1414 | EXPORT_SYMBOL(netlink_capable); | ||
1415 | |||
1416 | /** | ||
1417 | * netlink_net_capable - Netlink network namespace message capability test | ||
1418 | * @skb: socket buffer holding a netlink command from userspace | ||
1419 | * @cap: The capability to use | ||
1420 | * | ||
1421 | * Test to see if the opener of the socket we received the message | ||
1422 | * from had when the netlink socket was created and the sender of the | ||
1423 | * message has has the capability @cap over the network namespace of | ||
1424 | * the socket we received the message from. | ||
1425 | */ | ||
1426 | bool netlink_net_capable(const struct sk_buff *skb, int cap) | ||
1427 | { | ||
1428 | return netlink_ns_capable(skb, sock_net(skb->sk)->user_ns, cap); | ||
1429 | } | ||
1430 | EXPORT_SYMBOL(netlink_net_capable); | ||
1431 | |||
1432 | static inline int netlink_allowed(const struct socket *sock, unsigned int flag) | ||
1368 | { | 1433 | { |
1369 | return (nl_table[sock->sk->sk_protocol].flags & flag) || | 1434 | return (nl_table[sock->sk->sk_protocol].flags & flag) || |
1370 | ns_capable(sock_net(sock->sk)->user_ns, CAP_NET_ADMIN); | 1435 | ns_capable(sock_net(sock->sk)->user_ns, CAP_NET_ADMIN); |
@@ -1446,7 +1511,7 @@ static int netlink_bind(struct socket *sock, struct sockaddr *addr, | |||
1446 | 1511 | ||
1447 | /* Only superuser is allowed to listen multicasts */ | 1512 | /* Only superuser is allowed to listen multicasts */ |
1448 | if (groups) { | 1513 | if (groups) { |
1449 | if (!netlink_capable(sock, NL_CFG_F_NONROOT_RECV)) | 1514 | if (!netlink_allowed(sock, NL_CFG_F_NONROOT_RECV)) |
1450 | return -EPERM; | 1515 | return -EPERM; |
1451 | err = netlink_realloc_groups(sk); | 1516 | err = netlink_realloc_groups(sk); |
1452 | if (err) | 1517 | if (err) |
@@ -1516,7 +1581,7 @@ static int netlink_connect(struct socket *sock, struct sockaddr *addr, | |||
1516 | return -EINVAL; | 1581 | return -EINVAL; |
1517 | 1582 | ||
1518 | if ((nladdr->nl_groups || nladdr->nl_pid) && | 1583 | if ((nladdr->nl_groups || nladdr->nl_pid) && |
1519 | !netlink_capable(sock, NL_CFG_F_NONROOT_SEND)) | 1584 | !netlink_allowed(sock, NL_CFG_F_NONROOT_SEND)) |
1520 | return -EPERM; | 1585 | return -EPERM; |
1521 | 1586 | ||
1522 | if (!nlk->portid) | 1587 | if (!nlk->portid) |
@@ -2122,7 +2187,7 @@ static int netlink_setsockopt(struct socket *sock, int level, int optname, | |||
2122 | break; | 2187 | break; |
2123 | case NETLINK_ADD_MEMBERSHIP: | 2188 | case NETLINK_ADD_MEMBERSHIP: |
2124 | case NETLINK_DROP_MEMBERSHIP: { | 2189 | case NETLINK_DROP_MEMBERSHIP: { |
2125 | if (!netlink_capable(sock, NL_CFG_F_NONROOT_RECV)) | 2190 | if (!netlink_allowed(sock, NL_CFG_F_NONROOT_RECV)) |
2126 | return -EPERM; | 2191 | return -EPERM; |
2127 | err = netlink_realloc_groups(sk); | 2192 | err = netlink_realloc_groups(sk); |
2128 | if (err) | 2193 | if (err) |
@@ -2277,7 +2342,7 @@ static int netlink_sendmsg(struct kiocb *kiocb, struct socket *sock, | |||
2277 | dst_group = ffs(addr->nl_groups); | 2342 | dst_group = ffs(addr->nl_groups); |
2278 | err = -EPERM; | 2343 | err = -EPERM; |
2279 | if ((dst_group || dst_portid) && | 2344 | if ((dst_group || dst_portid) && |
2280 | !netlink_capable(sock, NL_CFG_F_NONROOT_SEND)) | 2345 | !netlink_allowed(sock, NL_CFG_F_NONROOT_SEND)) |
2281 | goto out; | 2346 | goto out; |
2282 | } else { | 2347 | } else { |
2283 | dst_portid = nlk->dst_portid; | 2348 | dst_portid = nlk->dst_portid; |
diff --git a/net/netlink/genetlink.c b/net/netlink/genetlink.c index b1dcdb932a86..a3ba3ca0ff92 100644 --- a/net/netlink/genetlink.c +++ b/net/netlink/genetlink.c | |||
@@ -561,7 +561,7 @@ static int genl_family_rcv_msg(struct genl_family *family, | |||
561 | return -EOPNOTSUPP; | 561 | return -EOPNOTSUPP; |
562 | 562 | ||
563 | if ((ops->flags & GENL_ADMIN_PERM) && | 563 | if ((ops->flags & GENL_ADMIN_PERM) && |
564 | !capable(CAP_NET_ADMIN)) | 564 | !netlink_capable(skb, CAP_NET_ADMIN)) |
565 | return -EPERM; | 565 | return -EPERM; |
566 | 566 | ||
567 | if ((nlh->nlmsg_flags & NLM_F_DUMP) == NLM_F_DUMP) { | 567 | if ((nlh->nlmsg_flags & NLM_F_DUMP) == NLM_F_DUMP) { |
diff --git a/net/packet/diag.c b/net/packet/diag.c index 435ff99ba8c7..92f2c7107eec 100644 --- a/net/packet/diag.c +++ b/net/packet/diag.c | |||
@@ -128,6 +128,7 @@ static int pdiag_put_fanout(struct packet_sock *po, struct sk_buff *nlskb) | |||
128 | 128 | ||
129 | static int sk_diag_fill(struct sock *sk, struct sk_buff *skb, | 129 | static int sk_diag_fill(struct sock *sk, struct sk_buff *skb, |
130 | struct packet_diag_req *req, | 130 | struct packet_diag_req *req, |
131 | bool may_report_filterinfo, | ||
131 | struct user_namespace *user_ns, | 132 | struct user_namespace *user_ns, |
132 | u32 portid, u32 seq, u32 flags, int sk_ino) | 133 | u32 portid, u32 seq, u32 flags, int sk_ino) |
133 | { | 134 | { |
@@ -172,7 +173,8 @@ static int sk_diag_fill(struct sock *sk, struct sk_buff *skb, | |||
172 | goto out_nlmsg_trim; | 173 | goto out_nlmsg_trim; |
173 | 174 | ||
174 | if ((req->pdiag_show & PACKET_SHOW_FILTER) && | 175 | if ((req->pdiag_show & PACKET_SHOW_FILTER) && |
175 | sock_diag_put_filterinfo(sk, skb, PACKET_DIAG_FILTER)) | 176 | sock_diag_put_filterinfo(may_report_filterinfo, sk, skb, |
177 | PACKET_DIAG_FILTER)) | ||
176 | goto out_nlmsg_trim; | 178 | goto out_nlmsg_trim; |
177 | 179 | ||
178 | return nlmsg_end(skb, nlh); | 180 | return nlmsg_end(skb, nlh); |
@@ -188,9 +190,11 @@ static int packet_diag_dump(struct sk_buff *skb, struct netlink_callback *cb) | |||
188 | struct packet_diag_req *req; | 190 | struct packet_diag_req *req; |
189 | struct net *net; | 191 | struct net *net; |
190 | struct sock *sk; | 192 | struct sock *sk; |
193 | bool may_report_filterinfo; | ||
191 | 194 | ||
192 | net = sock_net(skb->sk); | 195 | net = sock_net(skb->sk); |
193 | req = nlmsg_data(cb->nlh); | 196 | req = nlmsg_data(cb->nlh); |
197 | may_report_filterinfo = netlink_net_capable(cb->skb, CAP_NET_ADMIN); | ||
194 | 198 | ||
195 | mutex_lock(&net->packet.sklist_lock); | 199 | mutex_lock(&net->packet.sklist_lock); |
196 | sk_for_each(sk, &net->packet.sklist) { | 200 | sk_for_each(sk, &net->packet.sklist) { |
@@ -200,6 +204,7 @@ static int packet_diag_dump(struct sk_buff *skb, struct netlink_callback *cb) | |||
200 | goto next; | 204 | goto next; |
201 | 205 | ||
202 | if (sk_diag_fill(sk, skb, req, | 206 | if (sk_diag_fill(sk, skb, req, |
207 | may_report_filterinfo, | ||
203 | sk_user_ns(NETLINK_CB(cb->skb).sk), | 208 | sk_user_ns(NETLINK_CB(cb->skb).sk), |
204 | NETLINK_CB(cb->skb).portid, | 209 | NETLINK_CB(cb->skb).portid, |
205 | cb->nlh->nlmsg_seq, NLM_F_MULTI, | 210 | cb->nlh->nlmsg_seq, NLM_F_MULTI, |
diff --git a/net/phonet/pn_netlink.c b/net/phonet/pn_netlink.c index dc15f4300808..b64151ade6b3 100644 --- a/net/phonet/pn_netlink.c +++ b/net/phonet/pn_netlink.c | |||
@@ -70,10 +70,10 @@ static int addr_doit(struct sk_buff *skb, struct nlmsghdr *nlh) | |||
70 | int err; | 70 | int err; |
71 | u8 pnaddr; | 71 | u8 pnaddr; |
72 | 72 | ||
73 | if (!capable(CAP_NET_ADMIN)) | 73 | if (!netlink_capable(skb, CAP_NET_ADMIN)) |
74 | return -EPERM; | 74 | return -EPERM; |
75 | 75 | ||
76 | if (!capable(CAP_SYS_ADMIN)) | 76 | if (!netlink_capable(skb, CAP_SYS_ADMIN)) |
77 | return -EPERM; | 77 | return -EPERM; |
78 | 78 | ||
79 | ASSERT_RTNL(); | 79 | ASSERT_RTNL(); |
@@ -233,10 +233,10 @@ static int route_doit(struct sk_buff *skb, struct nlmsghdr *nlh) | |||
233 | int err; | 233 | int err; |
234 | u8 dst; | 234 | u8 dst; |
235 | 235 | ||
236 | if (!capable(CAP_NET_ADMIN)) | 236 | if (!netlink_capable(skb, CAP_NET_ADMIN)) |
237 | return -EPERM; | 237 | return -EPERM; |
238 | 238 | ||
239 | if (!capable(CAP_SYS_ADMIN)) | 239 | if (!netlink_capable(skb, CAP_SYS_ADMIN)) |
240 | return -EPERM; | 240 | return -EPERM; |
241 | 241 | ||
242 | ASSERT_RTNL(); | 242 | ASSERT_RTNL(); |
diff --git a/net/sched/act_api.c b/net/sched/act_api.c index 8a5ba5add4bc..648778aef1a2 100644 --- a/net/sched/act_api.c +++ b/net/sched/act_api.c | |||
@@ -948,7 +948,7 @@ static int tc_ctl_action(struct sk_buff *skb, struct nlmsghdr *n) | |||
948 | u32 portid = skb ? NETLINK_CB(skb).portid : 0; | 948 | u32 portid = skb ? NETLINK_CB(skb).portid : 0; |
949 | int ret = 0, ovr = 0; | 949 | int ret = 0, ovr = 0; |
950 | 950 | ||
951 | if ((n->nlmsg_type != RTM_GETACTION) && !capable(CAP_NET_ADMIN)) | 951 | if ((n->nlmsg_type != RTM_GETACTION) && !netlink_capable(skb, CAP_NET_ADMIN)) |
952 | return -EPERM; | 952 | return -EPERM; |
953 | 953 | ||
954 | ret = nlmsg_parse(n, sizeof(struct tcamsg), tca, TCA_ACT_MAX, NULL); | 954 | ret = nlmsg_parse(n, sizeof(struct tcamsg), tca, TCA_ACT_MAX, NULL); |
diff --git a/net/sched/cls_api.c b/net/sched/cls_api.c index 1a4a20267787..45527e6b52db 100644 --- a/net/sched/cls_api.c +++ b/net/sched/cls_api.c | |||
@@ -135,7 +135,7 @@ static int tc_ctl_tfilter(struct sk_buff *skb, struct nlmsghdr *n) | |||
135 | int tp_created = 0; | 135 | int tp_created = 0; |
136 | 136 | ||
137 | if ((n->nlmsg_type != RTM_GETTFILTER) && | 137 | if ((n->nlmsg_type != RTM_GETTFILTER) && |
138 | !ns_capable(net->user_ns, CAP_NET_ADMIN)) | 138 | !netlink_ns_capable(skb, net->user_ns, CAP_NET_ADMIN)) |
139 | return -EPERM; | 139 | return -EPERM; |
140 | 140 | ||
141 | replay: | 141 | replay: |
diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c index 86f8edfd6b8a..fd14df56e5ff 100644 --- a/net/sched/sch_api.c +++ b/net/sched/sch_api.c | |||
@@ -1085,7 +1085,7 @@ static int tc_get_qdisc(struct sk_buff *skb, struct nlmsghdr *n) | |||
1085 | int err; | 1085 | int err; |
1086 | 1086 | ||
1087 | if ((n->nlmsg_type != RTM_GETQDISC) && | 1087 | if ((n->nlmsg_type != RTM_GETQDISC) && |
1088 | !ns_capable(net->user_ns, CAP_NET_ADMIN)) | 1088 | !netlink_ns_capable(skb, net->user_ns, CAP_NET_ADMIN)) |
1089 | return -EPERM; | 1089 | return -EPERM; |
1090 | 1090 | ||
1091 | err = nlmsg_parse(n, sizeof(*tcm), tca, TCA_MAX, NULL); | 1091 | err = nlmsg_parse(n, sizeof(*tcm), tca, TCA_MAX, NULL); |
@@ -1152,7 +1152,7 @@ static int tc_modify_qdisc(struct sk_buff *skb, struct nlmsghdr *n) | |||
1152 | struct Qdisc *q, *p; | 1152 | struct Qdisc *q, *p; |
1153 | int err; | 1153 | int err; |
1154 | 1154 | ||
1155 | if (!ns_capable(net->user_ns, CAP_NET_ADMIN)) | 1155 | if (!netlink_ns_capable(skb, net->user_ns, CAP_NET_ADMIN)) |
1156 | return -EPERM; | 1156 | return -EPERM; |
1157 | 1157 | ||
1158 | replay: | 1158 | replay: |
@@ -1492,7 +1492,7 @@ static int tc_ctl_tclass(struct sk_buff *skb, struct nlmsghdr *n) | |||
1492 | int err; | 1492 | int err; |
1493 | 1493 | ||
1494 | if ((n->nlmsg_type != RTM_GETTCLASS) && | 1494 | if ((n->nlmsg_type != RTM_GETTCLASS) && |
1495 | !ns_capable(net->user_ns, CAP_NET_ADMIN)) | 1495 | !netlink_ns_capable(skb, net->user_ns, CAP_NET_ADMIN)) |
1496 | return -EPERM; | 1496 | return -EPERM; |
1497 | 1497 | ||
1498 | err = nlmsg_parse(n, sizeof(*tcm), tca, TCA_MAX, NULL); | 1498 | err = nlmsg_parse(n, sizeof(*tcm), tca, TCA_MAX, NULL); |
diff --git a/net/sched/sch_hhf.c b/net/sched/sch_hhf.c index edee03d922e2..6e957c3b9854 100644 --- a/net/sched/sch_hhf.c +++ b/net/sched/sch_hhf.c | |||
@@ -553,11 +553,6 @@ static int hhf_change(struct Qdisc *sch, struct nlattr *opt) | |||
553 | if (err < 0) | 553 | if (err < 0) |
554 | return err; | 554 | return err; |
555 | 555 | ||
556 | sch_tree_lock(sch); | ||
557 | |||
558 | if (tb[TCA_HHF_BACKLOG_LIMIT]) | ||
559 | sch->limit = nla_get_u32(tb[TCA_HHF_BACKLOG_LIMIT]); | ||
560 | |||
561 | if (tb[TCA_HHF_QUANTUM]) | 556 | if (tb[TCA_HHF_QUANTUM]) |
562 | new_quantum = nla_get_u32(tb[TCA_HHF_QUANTUM]); | 557 | new_quantum = nla_get_u32(tb[TCA_HHF_QUANTUM]); |
563 | 558 | ||
@@ -567,6 +562,12 @@ static int hhf_change(struct Qdisc *sch, struct nlattr *opt) | |||
567 | non_hh_quantum = (u64)new_quantum * new_hhf_non_hh_weight; | 562 | non_hh_quantum = (u64)new_quantum * new_hhf_non_hh_weight; |
568 | if (non_hh_quantum > INT_MAX) | 563 | if (non_hh_quantum > INT_MAX) |
569 | return -EINVAL; | 564 | return -EINVAL; |
565 | |||
566 | sch_tree_lock(sch); | ||
567 | |||
568 | if (tb[TCA_HHF_BACKLOG_LIMIT]) | ||
569 | sch->limit = nla_get_u32(tb[TCA_HHF_BACKLOG_LIMIT]); | ||
570 | |||
570 | q->quantum = new_quantum; | 571 | q->quantum = new_quantum; |
571 | q->hhf_non_hh_weight = new_hhf_non_hh_weight; | 572 | q->hhf_non_hh_weight = new_hhf_non_hh_weight; |
572 | 573 | ||
diff --git a/net/sctp/protocol.c b/net/sctp/protocol.c index 074b60e2faab..af5afca4b85a 100644 --- a/net/sctp/protocol.c +++ b/net/sctp/protocol.c | |||
@@ -491,8 +491,13 @@ static void sctp_v4_get_dst(struct sctp_transport *t, union sctp_addr *saddr, | |||
491 | continue; | 491 | continue; |
492 | if ((laddr->state == SCTP_ADDR_SRC) && | 492 | if ((laddr->state == SCTP_ADDR_SRC) && |
493 | (AF_INET == laddr->a.sa.sa_family)) { | 493 | (AF_INET == laddr->a.sa.sa_family)) { |
494 | fl4->saddr = laddr->a.v4.sin_addr.s_addr; | ||
495 | fl4->fl4_sport = laddr->a.v4.sin_port; | 494 | fl4->fl4_sport = laddr->a.v4.sin_port; |
495 | flowi4_update_output(fl4, | ||
496 | asoc->base.sk->sk_bound_dev_if, | ||
497 | RT_CONN_FLAGS(asoc->base.sk), | ||
498 | daddr->v4.sin_addr.s_addr, | ||
499 | laddr->a.v4.sin_addr.s_addr); | ||
500 | |||
496 | rt = ip_route_output_key(sock_net(sk), fl4); | 501 | rt = ip_route_output_key(sock_net(sk), fl4); |
497 | if (!IS_ERR(rt)) { | 502 | if (!IS_ERR(rt)) { |
498 | dst = &rt->dst; | 503 | dst = &rt->dst; |
diff --git a/net/sctp/sm_sideeffect.c b/net/sctp/sm_sideeffect.c index 5d6883ff00c3..fef2acdf4a2e 100644 --- a/net/sctp/sm_sideeffect.c +++ b/net/sctp/sm_sideeffect.c | |||
@@ -496,11 +496,10 @@ static void sctp_do_8_2_transport_strike(sctp_cmd_seq_t *commands, | |||
496 | 496 | ||
497 | /* If the transport error count is greater than the pf_retrans | 497 | /* If the transport error count is greater than the pf_retrans |
498 | * threshold, and less than pathmaxrtx, and if the current state | 498 | * threshold, and less than pathmaxrtx, and if the current state |
499 | * is not SCTP_UNCONFIRMED, then mark this transport as Partially | 499 | * is SCTP_ACTIVE, then mark this transport as Partially Failed, |
500 | * Failed, see SCTP Quick Failover Draft, section 5.1 | 500 | * see SCTP Quick Failover Draft, section 5.1 |
501 | */ | 501 | */ |
502 | if ((transport->state != SCTP_PF) && | 502 | if ((transport->state == SCTP_ACTIVE) && |
503 | (transport->state != SCTP_UNCONFIRMED) && | ||
504 | (asoc->pf_retrans < transport->pathmaxrxt) && | 503 | (asoc->pf_retrans < transport->pathmaxrxt) && |
505 | (transport->error_count > asoc->pf_retrans)) { | 504 | (transport->error_count > asoc->pf_retrans)) { |
506 | 505 | ||
diff --git a/net/tipc/netlink.c b/net/tipc/netlink.c index 3aaf73de9e2d..ad844d365340 100644 --- a/net/tipc/netlink.c +++ b/net/tipc/netlink.c | |||
@@ -47,7 +47,7 @@ static int handle_cmd(struct sk_buff *skb, struct genl_info *info) | |||
47 | int hdr_space = nlmsg_total_size(GENL_HDRLEN + TIPC_GENL_HDRLEN); | 47 | int hdr_space = nlmsg_total_size(GENL_HDRLEN + TIPC_GENL_HDRLEN); |
48 | u16 cmd; | 48 | u16 cmd; |
49 | 49 | ||
50 | if ((req_userhdr->cmd & 0xC000) && (!capable(CAP_NET_ADMIN))) | 50 | if ((req_userhdr->cmd & 0xC000) && (!netlink_capable(skb, CAP_NET_ADMIN))) |
51 | cmd = TIPC_CMD_NOT_NET_ADMIN; | 51 | cmd = TIPC_CMD_NOT_NET_ADMIN; |
52 | else | 52 | else |
53 | cmd = req_userhdr->cmd; | 53 | cmd = req_userhdr->cmd; |
diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c index 5adfd94c5b85..85d232bed87d 100644 --- a/net/vmw_vsock/af_vsock.c +++ b/net/vmw_vsock/af_vsock.c | |||
@@ -1925,9 +1925,23 @@ static struct miscdevice vsock_device = { | |||
1925 | .fops = &vsock_device_ops, | 1925 | .fops = &vsock_device_ops, |
1926 | }; | 1926 | }; |
1927 | 1927 | ||
1928 | static int __vsock_core_init(void) | 1928 | int __vsock_core_init(const struct vsock_transport *t, struct module *owner) |
1929 | { | 1929 | { |
1930 | int err; | 1930 | int err = mutex_lock_interruptible(&vsock_register_mutex); |
1931 | |||
1932 | if (err) | ||
1933 | return err; | ||
1934 | |||
1935 | if (transport) { | ||
1936 | err = -EBUSY; | ||
1937 | goto err_busy; | ||
1938 | } | ||
1939 | |||
1940 | /* Transport must be the owner of the protocol so that it can't | ||
1941 | * unload while there are open sockets. | ||
1942 | */ | ||
1943 | vsock_proto.owner = owner; | ||
1944 | transport = t; | ||
1931 | 1945 | ||
1932 | vsock_init_tables(); | 1946 | vsock_init_tables(); |
1933 | 1947 | ||
@@ -1951,36 +1965,19 @@ static int __vsock_core_init(void) | |||
1951 | goto err_unregister_proto; | 1965 | goto err_unregister_proto; |
1952 | } | 1966 | } |
1953 | 1967 | ||
1968 | mutex_unlock(&vsock_register_mutex); | ||
1954 | return 0; | 1969 | return 0; |
1955 | 1970 | ||
1956 | err_unregister_proto: | 1971 | err_unregister_proto: |
1957 | proto_unregister(&vsock_proto); | 1972 | proto_unregister(&vsock_proto); |
1958 | err_misc_deregister: | 1973 | err_misc_deregister: |
1959 | misc_deregister(&vsock_device); | 1974 | misc_deregister(&vsock_device); |
1960 | return err; | 1975 | transport = NULL; |
1961 | } | 1976 | err_busy: |
1962 | |||
1963 | int vsock_core_init(const struct vsock_transport *t) | ||
1964 | { | ||
1965 | int retval = mutex_lock_interruptible(&vsock_register_mutex); | ||
1966 | if (retval) | ||
1967 | return retval; | ||
1968 | |||
1969 | if (transport) { | ||
1970 | retval = -EBUSY; | ||
1971 | goto out; | ||
1972 | } | ||
1973 | |||
1974 | transport = t; | ||
1975 | retval = __vsock_core_init(); | ||
1976 | if (retval) | ||
1977 | transport = NULL; | ||
1978 | |||
1979 | out: | ||
1980 | mutex_unlock(&vsock_register_mutex); | 1977 | mutex_unlock(&vsock_register_mutex); |
1981 | return retval; | 1978 | return err; |
1982 | } | 1979 | } |
1983 | EXPORT_SYMBOL_GPL(vsock_core_init); | 1980 | EXPORT_SYMBOL_GPL(__vsock_core_init); |
1984 | 1981 | ||
1985 | void vsock_core_exit(void) | 1982 | void vsock_core_exit(void) |
1986 | { | 1983 | { |
@@ -2000,5 +1997,5 @@ EXPORT_SYMBOL_GPL(vsock_core_exit); | |||
2000 | 1997 | ||
2001 | MODULE_AUTHOR("VMware, Inc."); | 1998 | MODULE_AUTHOR("VMware, Inc."); |
2002 | MODULE_DESCRIPTION("VMware Virtual Socket Family"); | 1999 | MODULE_DESCRIPTION("VMware Virtual Socket Family"); |
2003 | MODULE_VERSION("1.0.0.0-k"); | 2000 | MODULE_VERSION("1.0.1.0-k"); |
2004 | MODULE_LICENSE("GPL v2"); | 2001 | MODULE_LICENSE("GPL v2"); |
diff --git a/net/wireless/scan.c b/net/wireless/scan.c index 0f5da18cc619..e7329bb6a323 100644 --- a/net/wireless/scan.c +++ b/net/wireless/scan.c | |||
@@ -284,14 +284,22 @@ void cfg80211_sched_scan_results(struct wiphy *wiphy) | |||
284 | } | 284 | } |
285 | EXPORT_SYMBOL(cfg80211_sched_scan_results); | 285 | EXPORT_SYMBOL(cfg80211_sched_scan_results); |
286 | 286 | ||
287 | void cfg80211_sched_scan_stopped(struct wiphy *wiphy) | 287 | void cfg80211_sched_scan_stopped_rtnl(struct wiphy *wiphy) |
288 | { | 288 | { |
289 | struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); | 289 | struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy); |
290 | 290 | ||
291 | ASSERT_RTNL(); | ||
292 | |||
291 | trace_cfg80211_sched_scan_stopped(wiphy); | 293 | trace_cfg80211_sched_scan_stopped(wiphy); |
292 | 294 | ||
293 | rtnl_lock(); | ||
294 | __cfg80211_stop_sched_scan(rdev, true); | 295 | __cfg80211_stop_sched_scan(rdev, true); |
296 | } | ||
297 | EXPORT_SYMBOL(cfg80211_sched_scan_stopped_rtnl); | ||
298 | |||
299 | void cfg80211_sched_scan_stopped(struct wiphy *wiphy) | ||
300 | { | ||
301 | rtnl_lock(); | ||
302 | cfg80211_sched_scan_stopped_rtnl(wiphy); | ||
295 | rtnl_unlock(); | 303 | rtnl_unlock(); |
296 | } | 304 | } |
297 | EXPORT_SYMBOL(cfg80211_sched_scan_stopped); | 305 | EXPORT_SYMBOL(cfg80211_sched_scan_stopped); |
diff --git a/net/wireless/sme.c b/net/wireless/sme.c index e2923a3f2e5c..0c0844b585d1 100644 --- a/net/wireless/sme.c +++ b/net/wireless/sme.c | |||
@@ -234,7 +234,6 @@ void cfg80211_conn_work(struct work_struct *work) | |||
234 | NULL, 0, NULL, 0, | 234 | NULL, 0, NULL, 0, |
235 | WLAN_STATUS_UNSPECIFIED_FAILURE, | 235 | WLAN_STATUS_UNSPECIFIED_FAILURE, |
236 | false, NULL); | 236 | false, NULL); |
237 | cfg80211_sme_free(wdev); | ||
238 | } | 237 | } |
239 | wdev_unlock(wdev); | 238 | wdev_unlock(wdev); |
240 | } | 239 | } |
@@ -647,6 +646,7 @@ void __cfg80211_connect_result(struct net_device *dev, const u8 *bssid, | |||
647 | cfg80211_unhold_bss(bss_from_pub(bss)); | 646 | cfg80211_unhold_bss(bss_from_pub(bss)); |
648 | cfg80211_put_bss(wdev->wiphy, bss); | 647 | cfg80211_put_bss(wdev->wiphy, bss); |
649 | } | 648 | } |
649 | cfg80211_sme_free(wdev); | ||
650 | return; | 650 | return; |
651 | } | 651 | } |
652 | 652 | ||
diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c index 8f131c10a6f3..51398ae6cda8 100644 --- a/net/xfrm/xfrm_user.c +++ b/net/xfrm/xfrm_user.c | |||
@@ -2377,7 +2377,7 @@ static int xfrm_user_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh) | |||
2377 | link = &xfrm_dispatch[type]; | 2377 | link = &xfrm_dispatch[type]; |
2378 | 2378 | ||
2379 | /* All operations require privileges, even GET */ | 2379 | /* All operations require privileges, even GET */ |
2380 | if (!ns_capable(net->user_ns, CAP_NET_ADMIN)) | 2380 | if (!netlink_net_capable(skb, CAP_NET_ADMIN)) |
2381 | return -EPERM; | 2381 | return -EPERM; |
2382 | 2382 | ||
2383 | if ((type == (XFRM_MSG_GETSA - XFRM_MSG_BASE) || | 2383 | if ((type == (XFRM_MSG_GETSA - XFRM_MSG_BASE) || |