diff options
Diffstat (limited to 'net/core/dev.c')
-rw-r--r-- | net/core/dev.c | 351 |
1 files changed, 256 insertions, 95 deletions
diff --git a/net/core/dev.c b/net/core/dev.c index 9444c5cb4137..6ba50a1e404c 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -133,6 +133,10 @@ | |||
133 | #include <linux/pci.h> | 133 | #include <linux/pci.h> |
134 | #include <linux/inetdevice.h> | 134 | #include <linux/inetdevice.h> |
135 | #include <linux/cpu_rmap.h> | 135 | #include <linux/cpu_rmap.h> |
136 | #include <linux/if_tunnel.h> | ||
137 | #include <linux/if_pppox.h> | ||
138 | #include <linux/ppp_defs.h> | ||
139 | #include <linux/net_tstamp.h> | ||
136 | 140 | ||
137 | #include "net-sysfs.h" | 141 | #include "net-sysfs.h" |
138 | 142 | ||
@@ -1474,6 +1478,57 @@ static inline void net_timestamp_check(struct sk_buff *skb) | |||
1474 | __net_timestamp(skb); | 1478 | __net_timestamp(skb); |
1475 | } | 1479 | } |
1476 | 1480 | ||
1481 | static int net_hwtstamp_validate(struct ifreq *ifr) | ||
1482 | { | ||
1483 | struct hwtstamp_config cfg; | ||
1484 | enum hwtstamp_tx_types tx_type; | ||
1485 | enum hwtstamp_rx_filters rx_filter; | ||
1486 | int tx_type_valid = 0; | ||
1487 | int rx_filter_valid = 0; | ||
1488 | |||
1489 | if (copy_from_user(&cfg, ifr->ifr_data, sizeof(cfg))) | ||
1490 | return -EFAULT; | ||
1491 | |||
1492 | if (cfg.flags) /* reserved for future extensions */ | ||
1493 | return -EINVAL; | ||
1494 | |||
1495 | tx_type = cfg.tx_type; | ||
1496 | rx_filter = cfg.rx_filter; | ||
1497 | |||
1498 | switch (tx_type) { | ||
1499 | case HWTSTAMP_TX_OFF: | ||
1500 | case HWTSTAMP_TX_ON: | ||
1501 | case HWTSTAMP_TX_ONESTEP_SYNC: | ||
1502 | tx_type_valid = 1; | ||
1503 | break; | ||
1504 | } | ||
1505 | |||
1506 | switch (rx_filter) { | ||
1507 | case HWTSTAMP_FILTER_NONE: | ||
1508 | case HWTSTAMP_FILTER_ALL: | ||
1509 | case HWTSTAMP_FILTER_SOME: | ||
1510 | case HWTSTAMP_FILTER_PTP_V1_L4_EVENT: | ||
1511 | case HWTSTAMP_FILTER_PTP_V1_L4_SYNC: | ||
1512 | case HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ: | ||
1513 | case HWTSTAMP_FILTER_PTP_V2_L4_EVENT: | ||
1514 | case HWTSTAMP_FILTER_PTP_V2_L4_SYNC: | ||
1515 | case HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ: | ||
1516 | case HWTSTAMP_FILTER_PTP_V2_L2_EVENT: | ||
1517 | case HWTSTAMP_FILTER_PTP_V2_L2_SYNC: | ||
1518 | case HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ: | ||
1519 | case HWTSTAMP_FILTER_PTP_V2_EVENT: | ||
1520 | case HWTSTAMP_FILTER_PTP_V2_SYNC: | ||
1521 | case HWTSTAMP_FILTER_PTP_V2_DELAY_REQ: | ||
1522 | rx_filter_valid = 1; | ||
1523 | break; | ||
1524 | } | ||
1525 | |||
1526 | if (!tx_type_valid || !rx_filter_valid) | ||
1527 | return -ERANGE; | ||
1528 | |||
1529 | return 0; | ||
1530 | } | ||
1531 | |||
1477 | static inline bool is_skb_forwardable(struct net_device *dev, | 1532 | static inline bool is_skb_forwardable(struct net_device *dev, |
1478 | struct sk_buff *skb) | 1533 | struct sk_buff *skb) |
1479 | { | 1534 | { |
@@ -1515,6 +1570,14 @@ static inline bool is_skb_forwardable(struct net_device *dev, | |||
1515 | */ | 1570 | */ |
1516 | int dev_forward_skb(struct net_device *dev, struct sk_buff *skb) | 1571 | int dev_forward_skb(struct net_device *dev, struct sk_buff *skb) |
1517 | { | 1572 | { |
1573 | if (skb_shinfo(skb)->tx_flags & SKBTX_DEV_ZEROCOPY) { | ||
1574 | if (skb_copy_ubufs(skb, GFP_ATOMIC)) { | ||
1575 | atomic_long_inc(&dev->rx_dropped); | ||
1576 | kfree_skb(skb); | ||
1577 | return NET_RX_DROP; | ||
1578 | } | ||
1579 | } | ||
1580 | |||
1518 | skb_orphan(skb); | 1581 | skb_orphan(skb); |
1519 | nf_reset(skb); | 1582 | nf_reset(skb); |
1520 | 1583 | ||
@@ -1947,9 +2010,11 @@ static int illegal_highdma(struct net_device *dev, struct sk_buff *skb) | |||
1947 | #ifdef CONFIG_HIGHMEM | 2010 | #ifdef CONFIG_HIGHMEM |
1948 | int i; | 2011 | int i; |
1949 | if (!(dev->features & NETIF_F_HIGHDMA)) { | 2012 | if (!(dev->features & NETIF_F_HIGHDMA)) { |
1950 | for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) | 2013 | for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { |
1951 | if (PageHighMem(skb_shinfo(skb)->frags[i].page)) | 2014 | skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; |
2015 | if (PageHighMem(skb_frag_page(frag))) | ||
1952 | return 1; | 2016 | return 1; |
2017 | } | ||
1953 | } | 2018 | } |
1954 | 2019 | ||
1955 | if (PCI_DMA_BUS_IS_PHYS) { | 2020 | if (PCI_DMA_BUS_IS_PHYS) { |
@@ -1958,7 +2023,8 @@ static int illegal_highdma(struct net_device *dev, struct sk_buff *skb) | |||
1958 | if (!pdev) | 2023 | if (!pdev) |
1959 | return 0; | 2024 | return 0; |
1960 | for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { | 2025 | for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { |
1961 | dma_addr_t addr = page_to_phys(skb_shinfo(skb)->frags[i].page); | 2026 | skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; |
2027 | dma_addr_t addr = page_to_phys(skb_frag_page(frag)); | ||
1962 | if (!pdev->dma_mask || addr + PAGE_SIZE - 1 > *pdev->dma_mask) | 2028 | if (!pdev->dma_mask || addr + PAGE_SIZE - 1 > *pdev->dma_mask) |
1963 | return 1; | 2029 | return 1; |
1964 | } | 2030 | } |
@@ -2519,25 +2585,31 @@ static inline void ____napi_schedule(struct softnet_data *sd, | |||
2519 | 2585 | ||
2520 | /* | 2586 | /* |
2521 | * __skb_get_rxhash: calculate a flow hash based on src/dst addresses | 2587 | * __skb_get_rxhash: calculate a flow hash based on src/dst addresses |
2522 | * and src/dst port numbers. Returns a non-zero hash number on success | 2588 | * and src/dst port numbers. Sets rxhash in skb to non-zero hash value |
2523 | * and 0 on failure. | 2589 | * on success, zero indicates no valid hash. Also, sets l4_rxhash in skb |
2590 | * if hash is a canonical 4-tuple hash over transport ports. | ||
2524 | */ | 2591 | */ |
2525 | __u32 __skb_get_rxhash(struct sk_buff *skb) | 2592 | void __skb_get_rxhash(struct sk_buff *skb) |
2526 | { | 2593 | { |
2527 | int nhoff, hash = 0, poff; | 2594 | int nhoff, hash = 0, poff; |
2528 | const struct ipv6hdr *ip6; | 2595 | const struct ipv6hdr *ip6; |
2529 | const struct iphdr *ip; | 2596 | const struct iphdr *ip; |
2597 | const struct vlan_hdr *vlan; | ||
2530 | u8 ip_proto; | 2598 | u8 ip_proto; |
2531 | u32 addr1, addr2, ihl; | 2599 | u32 addr1, addr2; |
2600 | u16 proto; | ||
2532 | union { | 2601 | union { |
2533 | u32 v32; | 2602 | u32 v32; |
2534 | u16 v16[2]; | 2603 | u16 v16[2]; |
2535 | } ports; | 2604 | } ports; |
2536 | 2605 | ||
2537 | nhoff = skb_network_offset(skb); | 2606 | nhoff = skb_network_offset(skb); |
2607 | proto = skb->protocol; | ||
2538 | 2608 | ||
2539 | switch (skb->protocol) { | 2609 | again: |
2610 | switch (proto) { | ||
2540 | case __constant_htons(ETH_P_IP): | 2611 | case __constant_htons(ETH_P_IP): |
2612 | ip: | ||
2541 | if (!pskb_may_pull(skb, sizeof(*ip) + nhoff)) | 2613 | if (!pskb_may_pull(skb, sizeof(*ip) + nhoff)) |
2542 | goto done; | 2614 | goto done; |
2543 | 2615 | ||
@@ -2548,9 +2620,10 @@ __u32 __skb_get_rxhash(struct sk_buff *skb) | |||
2548 | ip_proto = ip->protocol; | 2620 | ip_proto = ip->protocol; |
2549 | addr1 = (__force u32) ip->saddr; | 2621 | addr1 = (__force u32) ip->saddr; |
2550 | addr2 = (__force u32) ip->daddr; | 2622 | addr2 = (__force u32) ip->daddr; |
2551 | ihl = ip->ihl; | 2623 | nhoff += ip->ihl * 4; |
2552 | break; | 2624 | break; |
2553 | case __constant_htons(ETH_P_IPV6): | 2625 | case __constant_htons(ETH_P_IPV6): |
2626 | ipv6: | ||
2554 | if (!pskb_may_pull(skb, sizeof(*ip6) + nhoff)) | 2627 | if (!pskb_may_pull(skb, sizeof(*ip6) + nhoff)) |
2555 | goto done; | 2628 | goto done; |
2556 | 2629 | ||
@@ -2558,20 +2631,71 @@ __u32 __skb_get_rxhash(struct sk_buff *skb) | |||
2558 | ip_proto = ip6->nexthdr; | 2631 | ip_proto = ip6->nexthdr; |
2559 | addr1 = (__force u32) ip6->saddr.s6_addr32[3]; | 2632 | addr1 = (__force u32) ip6->saddr.s6_addr32[3]; |
2560 | addr2 = (__force u32) ip6->daddr.s6_addr32[3]; | 2633 | addr2 = (__force u32) ip6->daddr.s6_addr32[3]; |
2561 | ihl = (40 >> 2); | 2634 | nhoff += 40; |
2562 | break; | 2635 | break; |
2636 | case __constant_htons(ETH_P_8021Q): | ||
2637 | if (!pskb_may_pull(skb, sizeof(*vlan) + nhoff)) | ||
2638 | goto done; | ||
2639 | vlan = (const struct vlan_hdr *) (skb->data + nhoff); | ||
2640 | proto = vlan->h_vlan_encapsulated_proto; | ||
2641 | nhoff += sizeof(*vlan); | ||
2642 | goto again; | ||
2643 | case __constant_htons(ETH_P_PPP_SES): | ||
2644 | if (!pskb_may_pull(skb, PPPOE_SES_HLEN + nhoff)) | ||
2645 | goto done; | ||
2646 | proto = *((__be16 *) (skb->data + nhoff + | ||
2647 | sizeof(struct pppoe_hdr))); | ||
2648 | nhoff += PPPOE_SES_HLEN; | ||
2649 | switch (proto) { | ||
2650 | case __constant_htons(PPP_IP): | ||
2651 | goto ip; | ||
2652 | case __constant_htons(PPP_IPV6): | ||
2653 | goto ipv6; | ||
2654 | default: | ||
2655 | goto done; | ||
2656 | } | ||
2563 | default: | 2657 | default: |
2564 | goto done; | 2658 | goto done; |
2565 | } | 2659 | } |
2566 | 2660 | ||
2661 | switch (ip_proto) { | ||
2662 | case IPPROTO_GRE: | ||
2663 | if (pskb_may_pull(skb, nhoff + 16)) { | ||
2664 | u8 *h = skb->data + nhoff; | ||
2665 | __be16 flags = *(__be16 *)h; | ||
2666 | |||
2667 | /* | ||
2668 | * Only look inside GRE if version zero and no | ||
2669 | * routing | ||
2670 | */ | ||
2671 | if (!(flags & (GRE_VERSION|GRE_ROUTING))) { | ||
2672 | proto = *(__be16 *)(h + 2); | ||
2673 | nhoff += 4; | ||
2674 | if (flags & GRE_CSUM) | ||
2675 | nhoff += 4; | ||
2676 | if (flags & GRE_KEY) | ||
2677 | nhoff += 4; | ||
2678 | if (flags & GRE_SEQ) | ||
2679 | nhoff += 4; | ||
2680 | goto again; | ||
2681 | } | ||
2682 | } | ||
2683 | break; | ||
2684 | case IPPROTO_IPIP: | ||
2685 | goto again; | ||
2686 | default: | ||
2687 | break; | ||
2688 | } | ||
2689 | |||
2567 | ports.v32 = 0; | 2690 | ports.v32 = 0; |
2568 | poff = proto_ports_offset(ip_proto); | 2691 | poff = proto_ports_offset(ip_proto); |
2569 | if (poff >= 0) { | 2692 | if (poff >= 0) { |
2570 | nhoff += ihl * 4 + poff; | 2693 | nhoff += poff; |
2571 | if (pskb_may_pull(skb, nhoff + 4)) { | 2694 | if (pskb_may_pull(skb, nhoff + 4)) { |
2572 | ports.v32 = * (__force u32 *) (skb->data + nhoff); | 2695 | ports.v32 = * (__force u32 *) (skb->data + nhoff); |
2573 | if (ports.v16[1] < ports.v16[0]) | 2696 | if (ports.v16[1] < ports.v16[0]) |
2574 | swap(ports.v16[0], ports.v16[1]); | 2697 | swap(ports.v16[0], ports.v16[1]); |
2698 | skb->l4_rxhash = 1; | ||
2575 | } | 2699 | } |
2576 | } | 2700 | } |
2577 | 2701 | ||
@@ -2584,7 +2708,7 @@ __u32 __skb_get_rxhash(struct sk_buff *skb) | |||
2584 | hash = 1; | 2708 | hash = 1; |
2585 | 2709 | ||
2586 | done: | 2710 | done: |
2587 | return hash; | 2711 | skb->rxhash = hash; |
2588 | } | 2712 | } |
2589 | EXPORT_SYMBOL(__skb_get_rxhash); | 2713 | EXPORT_SYMBOL(__skb_get_rxhash); |
2590 | 2714 | ||
@@ -2598,10 +2722,7 @@ static struct rps_dev_flow * | |||
2598 | set_rps_cpu(struct net_device *dev, struct sk_buff *skb, | 2722 | set_rps_cpu(struct net_device *dev, struct sk_buff *skb, |
2599 | struct rps_dev_flow *rflow, u16 next_cpu) | 2723 | struct rps_dev_flow *rflow, u16 next_cpu) |
2600 | { | 2724 | { |
2601 | u16 tcpu; | 2725 | if (next_cpu != RPS_NO_CPU) { |
2602 | |||
2603 | tcpu = rflow->cpu = next_cpu; | ||
2604 | if (tcpu != RPS_NO_CPU) { | ||
2605 | #ifdef CONFIG_RFS_ACCEL | 2726 | #ifdef CONFIG_RFS_ACCEL |
2606 | struct netdev_rx_queue *rxqueue; | 2727 | struct netdev_rx_queue *rxqueue; |
2607 | struct rps_dev_flow_table *flow_table; | 2728 | struct rps_dev_flow_table *flow_table; |
@@ -2629,16 +2750,16 @@ set_rps_cpu(struct net_device *dev, struct sk_buff *skb, | |||
2629 | goto out; | 2750 | goto out; |
2630 | old_rflow = rflow; | 2751 | old_rflow = rflow; |
2631 | rflow = &flow_table->flows[flow_id]; | 2752 | rflow = &flow_table->flows[flow_id]; |
2632 | rflow->cpu = next_cpu; | ||
2633 | rflow->filter = rc; | 2753 | rflow->filter = rc; |
2634 | if (old_rflow->filter == rflow->filter) | 2754 | if (old_rflow->filter == rflow->filter) |
2635 | old_rflow->filter = RPS_NO_FILTER; | 2755 | old_rflow->filter = RPS_NO_FILTER; |
2636 | out: | 2756 | out: |
2637 | #endif | 2757 | #endif |
2638 | rflow->last_qtail = | 2758 | rflow->last_qtail = |
2639 | per_cpu(softnet_data, tcpu).input_queue_head; | 2759 | per_cpu(softnet_data, next_cpu).input_queue_head; |
2640 | } | 2760 | } |
2641 | 2761 | ||
2762 | rflow->cpu = next_cpu; | ||
2642 | return rflow; | 2763 | return rflow; |
2643 | } | 2764 | } |
2644 | 2765 | ||
@@ -2673,13 +2794,13 @@ static int get_rps_cpu(struct net_device *dev, struct sk_buff *skb, | |||
2673 | map = rcu_dereference(rxqueue->rps_map); | 2794 | map = rcu_dereference(rxqueue->rps_map); |
2674 | if (map) { | 2795 | if (map) { |
2675 | if (map->len == 1 && | 2796 | if (map->len == 1 && |
2676 | !rcu_dereference_raw(rxqueue->rps_flow_table)) { | 2797 | !rcu_access_pointer(rxqueue->rps_flow_table)) { |
2677 | tcpu = map->cpus[0]; | 2798 | tcpu = map->cpus[0]; |
2678 | if (cpu_online(tcpu)) | 2799 | if (cpu_online(tcpu)) |
2679 | cpu = tcpu; | 2800 | cpu = tcpu; |
2680 | goto done; | 2801 | goto done; |
2681 | } | 2802 | } |
2682 | } else if (!rcu_dereference_raw(rxqueue->rps_flow_table)) { | 2803 | } else if (!rcu_access_pointer(rxqueue->rps_flow_table)) { |
2683 | goto done; | 2804 | goto done; |
2684 | } | 2805 | } |
2685 | 2806 | ||
@@ -3094,8 +3215,8 @@ void netdev_rx_handler_unregister(struct net_device *dev) | |||
3094 | { | 3215 | { |
3095 | 3216 | ||
3096 | ASSERT_RTNL(); | 3217 | ASSERT_RTNL(); |
3097 | rcu_assign_pointer(dev->rx_handler, NULL); | 3218 | RCU_INIT_POINTER(dev->rx_handler, NULL); |
3098 | rcu_assign_pointer(dev->rx_handler_data, NULL); | 3219 | RCU_INIT_POINTER(dev->rx_handler_data, NULL); |
3099 | } | 3220 | } |
3100 | EXPORT_SYMBOL_GPL(netdev_rx_handler_unregister); | 3221 | EXPORT_SYMBOL_GPL(netdev_rx_handler_unregister); |
3101 | 3222 | ||
@@ -3163,6 +3284,17 @@ ncls: | |||
3163 | #endif | 3284 | #endif |
3164 | 3285 | ||
3165 | rx_handler = rcu_dereference(skb->dev->rx_handler); | 3286 | rx_handler = rcu_dereference(skb->dev->rx_handler); |
3287 | if (vlan_tx_tag_present(skb)) { | ||
3288 | if (pt_prev) { | ||
3289 | ret = deliver_skb(skb, pt_prev, orig_dev); | ||
3290 | pt_prev = NULL; | ||
3291 | } | ||
3292 | if (vlan_do_receive(&skb, !rx_handler)) | ||
3293 | goto another_round; | ||
3294 | else if (unlikely(!skb)) | ||
3295 | goto out; | ||
3296 | } | ||
3297 | |||
3166 | if (rx_handler) { | 3298 | if (rx_handler) { |
3167 | if (pt_prev) { | 3299 | if (pt_prev) { |
3168 | ret = deliver_skb(skb, pt_prev, orig_dev); | 3300 | ret = deliver_skb(skb, pt_prev, orig_dev); |
@@ -3182,18 +3314,6 @@ ncls: | |||
3182 | } | 3314 | } |
3183 | } | 3315 | } |
3184 | 3316 | ||
3185 | if (vlan_tx_tag_present(skb)) { | ||
3186 | if (pt_prev) { | ||
3187 | ret = deliver_skb(skb, pt_prev, orig_dev); | ||
3188 | pt_prev = NULL; | ||
3189 | } | ||
3190 | if (vlan_do_receive(&skb)) { | ||
3191 | ret = __netif_receive_skb(skb); | ||
3192 | goto out; | ||
3193 | } else if (unlikely(!skb)) | ||
3194 | goto out; | ||
3195 | } | ||
3196 | |||
3197 | /* deliver only exact match when indicated */ | 3317 | /* deliver only exact match when indicated */ |
3198 | null_or_dev = deliver_exact ? skb->dev : NULL; | 3318 | null_or_dev = deliver_exact ? skb->dev : NULL; |
3199 | 3319 | ||
@@ -3421,10 +3541,10 @@ pull: | |||
3421 | skb->data_len -= grow; | 3541 | skb->data_len -= grow; |
3422 | 3542 | ||
3423 | skb_shinfo(skb)->frags[0].page_offset += grow; | 3543 | skb_shinfo(skb)->frags[0].page_offset += grow; |
3424 | skb_shinfo(skb)->frags[0].size -= grow; | 3544 | skb_frag_size_sub(&skb_shinfo(skb)->frags[0], grow); |
3425 | 3545 | ||
3426 | if (unlikely(!skb_shinfo(skb)->frags[0].size)) { | 3546 | if (unlikely(!skb_frag_size(&skb_shinfo(skb)->frags[0]))) { |
3427 | put_page(skb_shinfo(skb)->frags[0].page); | 3547 | skb_frag_unref(skb, 0); |
3428 | memmove(skb_shinfo(skb)->frags, | 3548 | memmove(skb_shinfo(skb)->frags, |
3429 | skb_shinfo(skb)->frags + 1, | 3549 | skb_shinfo(skb)->frags + 1, |
3430 | --skb_shinfo(skb)->nr_frags * sizeof(skb_frag_t)); | 3550 | --skb_shinfo(skb)->nr_frags * sizeof(skb_frag_t)); |
@@ -3488,11 +3608,10 @@ void skb_gro_reset_offset(struct sk_buff *skb) | |||
3488 | NAPI_GRO_CB(skb)->frag0_len = 0; | 3608 | NAPI_GRO_CB(skb)->frag0_len = 0; |
3489 | 3609 | ||
3490 | if (skb->mac_header == skb->tail && | 3610 | if (skb->mac_header == skb->tail && |
3491 | !PageHighMem(skb_shinfo(skb)->frags[0].page)) { | 3611 | !PageHighMem(skb_frag_page(&skb_shinfo(skb)->frags[0]))) { |
3492 | NAPI_GRO_CB(skb)->frag0 = | 3612 | NAPI_GRO_CB(skb)->frag0 = |
3493 | page_address(skb_shinfo(skb)->frags[0].page) + | 3613 | skb_frag_address(&skb_shinfo(skb)->frags[0]); |
3494 | skb_shinfo(skb)->frags[0].page_offset; | 3614 | NAPI_GRO_CB(skb)->frag0_len = skb_frag_size(&skb_shinfo(skb)->frags[0]); |
3495 | NAPI_GRO_CB(skb)->frag0_len = skb_shinfo(skb)->frags[0].size; | ||
3496 | } | 3615 | } |
3497 | } | 3616 | } |
3498 | EXPORT_SYMBOL(skb_gro_reset_offset); | 3617 | EXPORT_SYMBOL(skb_gro_reset_offset); |
@@ -3974,6 +4093,60 @@ static int dev_ifconf(struct net *net, char __user *arg) | |||
3974 | } | 4093 | } |
3975 | 4094 | ||
3976 | #ifdef CONFIG_PROC_FS | 4095 | #ifdef CONFIG_PROC_FS |
4096 | |||
4097 | #define BUCKET_SPACE (32 - NETDEV_HASHBITS) | ||
4098 | |||
4099 | struct dev_iter_state { | ||
4100 | struct seq_net_private p; | ||
4101 | unsigned int pos; /* bucket << BUCKET_SPACE + offset */ | ||
4102 | }; | ||
4103 | |||
4104 | #define get_bucket(x) ((x) >> BUCKET_SPACE) | ||
4105 | #define get_offset(x) ((x) & ((1 << BUCKET_SPACE) - 1)) | ||
4106 | #define set_bucket_offset(b, o) ((b) << BUCKET_SPACE | (o)) | ||
4107 | |||
4108 | static inline struct net_device *dev_from_same_bucket(struct seq_file *seq) | ||
4109 | { | ||
4110 | struct dev_iter_state *state = seq->private; | ||
4111 | struct net *net = seq_file_net(seq); | ||
4112 | struct net_device *dev; | ||
4113 | struct hlist_node *p; | ||
4114 | struct hlist_head *h; | ||
4115 | unsigned int count, bucket, offset; | ||
4116 | |||
4117 | bucket = get_bucket(state->pos); | ||
4118 | offset = get_offset(state->pos); | ||
4119 | h = &net->dev_name_head[bucket]; | ||
4120 | count = 0; | ||
4121 | hlist_for_each_entry_rcu(dev, p, h, name_hlist) { | ||
4122 | if (count++ == offset) { | ||
4123 | state->pos = set_bucket_offset(bucket, count); | ||
4124 | return dev; | ||
4125 | } | ||
4126 | } | ||
4127 | |||
4128 | return NULL; | ||
4129 | } | ||
4130 | |||
4131 | static inline struct net_device *dev_from_new_bucket(struct seq_file *seq) | ||
4132 | { | ||
4133 | struct dev_iter_state *state = seq->private; | ||
4134 | struct net_device *dev; | ||
4135 | unsigned int bucket; | ||
4136 | |||
4137 | bucket = get_bucket(state->pos); | ||
4138 | do { | ||
4139 | dev = dev_from_same_bucket(seq); | ||
4140 | if (dev) | ||
4141 | return dev; | ||
4142 | |||
4143 | bucket++; | ||
4144 | state->pos = set_bucket_offset(bucket, 0); | ||
4145 | } while (bucket < NETDEV_HASHENTRIES); | ||
4146 | |||
4147 | return NULL; | ||
4148 | } | ||
4149 | |||
3977 | /* | 4150 | /* |
3978 | * This is invoked by the /proc filesystem handler to display a device | 4151 | * This is invoked by the /proc filesystem handler to display a device |
3979 | * in detail. | 4152 | * in detail. |
@@ -3981,33 +4154,33 @@ static int dev_ifconf(struct net *net, char __user *arg) | |||
3981 | void *dev_seq_start(struct seq_file *seq, loff_t *pos) | 4154 | void *dev_seq_start(struct seq_file *seq, loff_t *pos) |
3982 | __acquires(RCU) | 4155 | __acquires(RCU) |
3983 | { | 4156 | { |
3984 | struct net *net = seq_file_net(seq); | 4157 | struct dev_iter_state *state = seq->private; |
3985 | loff_t off; | ||
3986 | struct net_device *dev; | ||
3987 | 4158 | ||
3988 | rcu_read_lock(); | 4159 | rcu_read_lock(); |
3989 | if (!*pos) | 4160 | if (!*pos) |
3990 | return SEQ_START_TOKEN; | 4161 | return SEQ_START_TOKEN; |
3991 | 4162 | ||
3992 | off = 1; | 4163 | /* check for end of the hash */ |
3993 | for_each_netdev_rcu(net, dev) | 4164 | if (state->pos == 0 && *pos > 1) |
3994 | if (off++ == *pos) | 4165 | return NULL; |
3995 | return dev; | ||
3996 | 4166 | ||
3997 | return NULL; | 4167 | return dev_from_new_bucket(seq); |
3998 | } | 4168 | } |
3999 | 4169 | ||
4000 | void *dev_seq_next(struct seq_file *seq, void *v, loff_t *pos) | 4170 | void *dev_seq_next(struct seq_file *seq, void *v, loff_t *pos) |
4001 | { | 4171 | { |
4002 | struct net_device *dev = v; | 4172 | struct net_device *dev; |
4173 | |||
4174 | ++*pos; | ||
4003 | 4175 | ||
4004 | if (v == SEQ_START_TOKEN) | 4176 | if (v == SEQ_START_TOKEN) |
4005 | dev = first_net_device_rcu(seq_file_net(seq)); | 4177 | return dev_from_new_bucket(seq); |
4006 | else | ||
4007 | dev = next_net_device_rcu(dev); | ||
4008 | 4178 | ||
4009 | ++*pos; | 4179 | dev = dev_from_same_bucket(seq); |
4010 | return dev; | 4180 | if (dev) |
4181 | return dev; | ||
4182 | |||
4183 | return dev_from_new_bucket(seq); | ||
4011 | } | 4184 | } |
4012 | 4185 | ||
4013 | void dev_seq_stop(struct seq_file *seq, void *v) | 4186 | void dev_seq_stop(struct seq_file *seq, void *v) |
@@ -4106,7 +4279,7 @@ static const struct seq_operations dev_seq_ops = { | |||
4106 | static int dev_seq_open(struct inode *inode, struct file *file) | 4279 | static int dev_seq_open(struct inode *inode, struct file *file) |
4107 | { | 4280 | { |
4108 | return seq_open_net(inode, file, &dev_seq_ops, | 4281 | return seq_open_net(inode, file, &dev_seq_ops, |
4109 | sizeof(struct seq_net_private)); | 4282 | sizeof(struct dev_iter_state)); |
4110 | } | 4283 | } |
4111 | 4284 | ||
4112 | static const struct file_operations dev_seq_fops = { | 4285 | static const struct file_operations dev_seq_fops = { |
@@ -4489,23 +4662,21 @@ void __dev_set_rx_mode(struct net_device *dev) | |||
4489 | if (!netif_device_present(dev)) | 4662 | if (!netif_device_present(dev)) |
4490 | return; | 4663 | return; |
4491 | 4664 | ||
4492 | if (ops->ndo_set_rx_mode) | 4665 | if (!(dev->priv_flags & IFF_UNICAST_FLT)) { |
4493 | ops->ndo_set_rx_mode(dev); | ||
4494 | else { | ||
4495 | /* Unicast addresses changes may only happen under the rtnl, | 4666 | /* Unicast addresses changes may only happen under the rtnl, |
4496 | * therefore calling __dev_set_promiscuity here is safe. | 4667 | * therefore calling __dev_set_promiscuity here is safe. |
4497 | */ | 4668 | */ |
4498 | if (!netdev_uc_empty(dev) && !dev->uc_promisc) { | 4669 | if (!netdev_uc_empty(dev) && !dev->uc_promisc) { |
4499 | __dev_set_promiscuity(dev, 1); | 4670 | __dev_set_promiscuity(dev, 1); |
4500 | dev->uc_promisc = 1; | 4671 | dev->uc_promisc = true; |
4501 | } else if (netdev_uc_empty(dev) && dev->uc_promisc) { | 4672 | } else if (netdev_uc_empty(dev) && dev->uc_promisc) { |
4502 | __dev_set_promiscuity(dev, -1); | 4673 | __dev_set_promiscuity(dev, -1); |
4503 | dev->uc_promisc = 0; | 4674 | dev->uc_promisc = false; |
4504 | } | 4675 | } |
4505 | |||
4506 | if (ops->ndo_set_multicast_list) | ||
4507 | ops->ndo_set_multicast_list(dev); | ||
4508 | } | 4676 | } |
4677 | |||
4678 | if (ops->ndo_set_rx_mode) | ||
4679 | ops->ndo_set_rx_mode(dev); | ||
4509 | } | 4680 | } |
4510 | 4681 | ||
4511 | void dev_set_rx_mode(struct net_device *dev) | 4682 | void dev_set_rx_mode(struct net_device *dev) |
@@ -4516,30 +4687,6 @@ void dev_set_rx_mode(struct net_device *dev) | |||
4516 | } | 4687 | } |
4517 | 4688 | ||
4518 | /** | 4689 | /** |
4519 | * dev_ethtool_get_settings - call device's ethtool_ops::get_settings() | ||
4520 | * @dev: device | ||
4521 | * @cmd: memory area for ethtool_ops::get_settings() result | ||
4522 | * | ||
4523 | * The cmd arg is initialized properly (cleared and | ||
4524 | * ethtool_cmd::cmd field set to ETHTOOL_GSET). | ||
4525 | * | ||
4526 | * Return device's ethtool_ops::get_settings() result value or | ||
4527 | * -EOPNOTSUPP when device doesn't expose | ||
4528 | * ethtool_ops::get_settings() operation. | ||
4529 | */ | ||
4530 | int dev_ethtool_get_settings(struct net_device *dev, | ||
4531 | struct ethtool_cmd *cmd) | ||
4532 | { | ||
4533 | if (!dev->ethtool_ops || !dev->ethtool_ops->get_settings) | ||
4534 | return -EOPNOTSUPP; | ||
4535 | |||
4536 | memset(cmd, 0, sizeof(struct ethtool_cmd)); | ||
4537 | cmd->cmd = ETHTOOL_GSET; | ||
4538 | return dev->ethtool_ops->get_settings(dev, cmd); | ||
4539 | } | ||
4540 | EXPORT_SYMBOL(dev_ethtool_get_settings); | ||
4541 | |||
4542 | /** | ||
4543 | * dev_get_flags - get flags reported to userspace | 4690 | * dev_get_flags - get flags reported to userspace |
4544 | * @dev: device | 4691 | * @dev: device |
4545 | * | 4692 | * |
@@ -4855,7 +5002,7 @@ static int dev_ifsioc(struct net *net, struct ifreq *ifr, unsigned int cmd) | |||
4855 | return -EOPNOTSUPP; | 5002 | return -EOPNOTSUPP; |
4856 | 5003 | ||
4857 | case SIOCADDMULTI: | 5004 | case SIOCADDMULTI: |
4858 | if ((!ops->ndo_set_multicast_list && !ops->ndo_set_rx_mode) || | 5005 | if (!ops->ndo_set_rx_mode || |
4859 | ifr->ifr_hwaddr.sa_family != AF_UNSPEC) | 5006 | ifr->ifr_hwaddr.sa_family != AF_UNSPEC) |
4860 | return -EINVAL; | 5007 | return -EINVAL; |
4861 | if (!netif_device_present(dev)) | 5008 | if (!netif_device_present(dev)) |
@@ -4863,7 +5010,7 @@ static int dev_ifsioc(struct net *net, struct ifreq *ifr, unsigned int cmd) | |||
4863 | return dev_mc_add_global(dev, ifr->ifr_hwaddr.sa_data); | 5010 | return dev_mc_add_global(dev, ifr->ifr_hwaddr.sa_data); |
4864 | 5011 | ||
4865 | case SIOCDELMULTI: | 5012 | case SIOCDELMULTI: |
4866 | if ((!ops->ndo_set_multicast_list && !ops->ndo_set_rx_mode) || | 5013 | if (!ops->ndo_set_rx_mode || |
4867 | ifr->ifr_hwaddr.sa_family != AF_UNSPEC) | 5014 | ifr->ifr_hwaddr.sa_family != AF_UNSPEC) |
4868 | return -EINVAL; | 5015 | return -EINVAL; |
4869 | if (!netif_device_present(dev)) | 5016 | if (!netif_device_present(dev)) |
@@ -4880,6 +5027,12 @@ static int dev_ifsioc(struct net *net, struct ifreq *ifr, unsigned int cmd) | |||
4880 | ifr->ifr_newname[IFNAMSIZ-1] = '\0'; | 5027 | ifr->ifr_newname[IFNAMSIZ-1] = '\0'; |
4881 | return dev_change_name(dev, ifr->ifr_newname); | 5028 | return dev_change_name(dev, ifr->ifr_newname); |
4882 | 5029 | ||
5030 | case SIOCSHWTSTAMP: | ||
5031 | err = net_hwtstamp_validate(ifr); | ||
5032 | if (err) | ||
5033 | return err; | ||
5034 | /* fall through */ | ||
5035 | |||
4883 | /* | 5036 | /* |
4884 | * Unknown or private ioctl | 5037 | * Unknown or private ioctl |
4885 | */ | 5038 | */ |
@@ -5194,7 +5347,7 @@ static void rollback_registered_many(struct list_head *head) | |||
5194 | dev = list_first_entry(head, struct net_device, unreg_list); | 5347 | dev = list_first_entry(head, struct net_device, unreg_list); |
5195 | call_netdevice_notifiers(NETDEV_UNREGISTER_BATCH, dev); | 5348 | call_netdevice_notifiers(NETDEV_UNREGISTER_BATCH, dev); |
5196 | 5349 | ||
5197 | rcu_barrier(); | 5350 | synchronize_net(); |
5198 | 5351 | ||
5199 | list_for_each_entry(dev, head, unreg_list) | 5352 | list_for_each_entry(dev, head, unreg_list) |
5200 | dev_put(dev); | 5353 | dev_put(dev); |
@@ -5707,6 +5860,12 @@ void netdev_run_todo(void) | |||
5707 | 5860 | ||
5708 | __rtnl_unlock(); | 5861 | __rtnl_unlock(); |
5709 | 5862 | ||
5863 | /* Wait for rcu callbacks to finish before attempting to drain | ||
5864 | * the device list. This usually avoids a 250ms wait. | ||
5865 | */ | ||
5866 | if (!list_empty(&list)) | ||
5867 | rcu_barrier(); | ||
5868 | |||
5710 | while (!list_empty(&list)) { | 5869 | while (!list_empty(&list)) { |
5711 | struct net_device *dev | 5870 | struct net_device *dev |
5712 | = list_first_entry(&list, struct net_device, todo_list); | 5871 | = list_first_entry(&list, struct net_device, todo_list); |
@@ -5727,8 +5886,8 @@ void netdev_run_todo(void) | |||
5727 | 5886 | ||
5728 | /* paranoia */ | 5887 | /* paranoia */ |
5729 | BUG_ON(netdev_refcnt_read(dev)); | 5888 | BUG_ON(netdev_refcnt_read(dev)); |
5730 | WARN_ON(rcu_dereference_raw(dev->ip_ptr)); | 5889 | WARN_ON(rcu_access_pointer(dev->ip_ptr)); |
5731 | WARN_ON(rcu_dereference_raw(dev->ip6_ptr)); | 5890 | WARN_ON(rcu_access_pointer(dev->ip6_ptr)); |
5732 | WARN_ON(dev->dn_ptr); | 5891 | WARN_ON(dev->dn_ptr); |
5733 | 5892 | ||
5734 | if (dev->destructor) | 5893 | if (dev->destructor) |
@@ -5932,7 +6091,7 @@ void free_netdev(struct net_device *dev) | |||
5932 | kfree(dev->_rx); | 6091 | kfree(dev->_rx); |
5933 | #endif | 6092 | #endif |
5934 | 6093 | ||
5935 | kfree(rcu_dereference_raw(dev->ingress_queue)); | 6094 | kfree(rcu_dereference_protected(dev->ingress_queue, 1)); |
5936 | 6095 | ||
5937 | /* Flush device addresses */ | 6096 | /* Flush device addresses */ |
5938 | dev_addr_flush(dev); | 6097 | dev_addr_flush(dev); |
@@ -6107,6 +6266,7 @@ int dev_change_net_namespace(struct net_device *dev, struct net *net, const char | |||
6107 | */ | 6266 | */ |
6108 | call_netdevice_notifiers(NETDEV_UNREGISTER, dev); | 6267 | call_netdevice_notifiers(NETDEV_UNREGISTER, dev); |
6109 | call_netdevice_notifiers(NETDEV_UNREGISTER_BATCH, dev); | 6268 | call_netdevice_notifiers(NETDEV_UNREGISTER_BATCH, dev); |
6269 | rtmsg_ifinfo(RTM_DELLINK, dev, ~0U); | ||
6110 | 6270 | ||
6111 | /* | 6271 | /* |
6112 | * Flush the unicast and multicast chains | 6272 | * Flush the unicast and multicast chains |
@@ -6290,7 +6450,7 @@ const char *netdev_drivername(const struct net_device *dev) | |||
6290 | return empty; | 6450 | return empty; |
6291 | } | 6451 | } |
6292 | 6452 | ||
6293 | static int __netdev_printk(const char *level, const struct net_device *dev, | 6453 | int __netdev_printk(const char *level, const struct net_device *dev, |
6294 | struct va_format *vaf) | 6454 | struct va_format *vaf) |
6295 | { | 6455 | { |
6296 | int r; | 6456 | int r; |
@@ -6305,6 +6465,7 @@ static int __netdev_printk(const char *level, const struct net_device *dev, | |||
6305 | 6465 | ||
6306 | return r; | 6466 | return r; |
6307 | } | 6467 | } |
6468 | EXPORT_SYMBOL(__netdev_printk); | ||
6308 | 6469 | ||
6309 | int netdev_printk(const char *level, const struct net_device *dev, | 6470 | int netdev_printk(const char *level, const struct net_device *dev, |
6310 | const char *format, ...) | 6471 | const char *format, ...) |