| .. | .. |
|---|
| 80 | 80 | |
|---|
| 81 | 81 | bool zlp; |
|---|
| 82 | 82 | bool no_skb_reserve; |
|---|
| 83 | + bool ifname_set; |
|---|
| 83 | 84 | u8 host_mac[ETH_ALEN]; |
|---|
| 84 | 85 | u8 dev_mac[ETH_ALEN]; |
|---|
| 85 | 86 | }; |
|---|
| .. | .. |
|---|
| 322 | 323 | /* data overrun */ |
|---|
| 323 | 324 | case -EOVERFLOW: |
|---|
| 324 | 325 | dev->net->stats.rx_over_errors++; |
|---|
| 325 | | - /* FALLTHROUGH */ |
|---|
| 326 | + fallthrough; |
|---|
| 326 | 327 | |
|---|
| 327 | 328 | default: |
|---|
| 328 | 329 | dev->net->stats.rx_errors++; |
|---|
| .. | .. |
|---|
| 445 | 446 | default: |
|---|
| 446 | 447 | dev->net->stats.tx_errors++; |
|---|
| 447 | 448 | VDBG(dev, "tx err %d\n", req->status); |
|---|
| 448 | | - /* FALLTHROUGH */ |
|---|
| 449 | + fallthrough; |
|---|
| 449 | 450 | case -ECONNRESET: /* unlink */ |
|---|
| 450 | 451 | case -ESHUTDOWN: /* disconnect etc */ |
|---|
| 451 | 452 | dev_kfree_skb_any(skb); |
|---|
| .. | .. |
|---|
| 732 | 733 | .name = "gadget", |
|---|
| 733 | 734 | }; |
|---|
| 734 | 735 | |
|---|
| 735 | | -/** |
|---|
| 736 | +/* |
|---|
| 736 | 737 | * gether_setup_name - initialize one ethernet-over-usb link |
|---|
| 737 | 738 | * @g: gadget to associated with these links |
|---|
| 738 | 739 | * @ethaddr: NULL, or a buffer in which the ethernet address of the |
|---|
| .. | .. |
|---|
| 772 | 773 | dev->qmult = qmult; |
|---|
| 773 | 774 | snprintf(net->name, sizeof(net->name), "%s%%d", netname); |
|---|
| 774 | 775 | |
|---|
| 775 | | - if (get_ether_addr(dev_addr, net->dev_addr)) |
|---|
| 776 | + if (get_ether_addr(dev_addr, net->dev_addr)) { |
|---|
| 777 | + net->addr_assign_type = NET_ADDR_RANDOM; |
|---|
| 776 | 778 | dev_warn(&g->dev, |
|---|
| 777 | 779 | "using random %s ethernet address\n", "self"); |
|---|
| 780 | + } else { |
|---|
| 781 | + net->addr_assign_type = NET_ADDR_SET; |
|---|
| 782 | + } |
|---|
| 778 | 783 | if (get_ether_addr(host_addr, dev->host_mac)) |
|---|
| 779 | 784 | dev_warn(&g->dev, |
|---|
| 780 | 785 | "using random %s ethernet address\n", "host"); |
|---|
| .. | .. |
|---|
| 831 | 836 | INIT_LIST_HEAD(&dev->tx_reqs); |
|---|
| 832 | 837 | INIT_LIST_HEAD(&dev->rx_reqs); |
|---|
| 833 | 838 | |
|---|
| 839 | + /* by default we always have a random MAC address */ |
|---|
| 840 | + net->addr_assign_type = NET_ADDR_RANDOM; |
|---|
| 841 | + |
|---|
| 834 | 842 | skb_queue_head_init(&dev->rx_frames); |
|---|
| 835 | 843 | |
|---|
| 836 | 844 | /* network device setup */ |
|---|
| .. | .. |
|---|
| 868 | 876 | g = dev->gadget; |
|---|
| 869 | 877 | |
|---|
| 870 | 878 | memcpy(net->dev_addr, dev->dev_mac, ETH_ALEN); |
|---|
| 871 | | - net->addr_assign_type = NET_ADDR_RANDOM; |
|---|
| 872 | 879 | |
|---|
| 873 | 880 | status = register_netdev(net); |
|---|
| 874 | 881 | if (status < 0) { |
|---|
| .. | .. |
|---|
| 908 | 915 | if (get_ether_addr(dev_addr, new_addr)) |
|---|
| 909 | 916 | return -EINVAL; |
|---|
| 910 | 917 | memcpy(dev->dev_mac, new_addr, ETH_ALEN); |
|---|
| 918 | + net->addr_assign_type = NET_ADDR_SET; |
|---|
| 911 | 919 | return 0; |
|---|
| 912 | 920 | } |
|---|
| 913 | 921 | EXPORT_SYMBOL_GPL(gether_set_dev_addr); |
|---|
| .. | .. |
|---|
| 1000 | 1008 | |
|---|
| 1001 | 1009 | int gether_get_ifname(struct net_device *net, char *name, int len) |
|---|
| 1002 | 1010 | { |
|---|
| 1011 | + struct eth_dev *dev = netdev_priv(net); |
|---|
| 1003 | 1012 | int ret; |
|---|
| 1004 | 1013 | |
|---|
| 1005 | 1014 | rtnl_lock(); |
|---|
| 1006 | | - ret = snprintf(name, len, "%s\n", netdev_name(net)); |
|---|
| 1015 | + ret = scnprintf(name, len, "%s\n", |
|---|
| 1016 | + dev->ifname_set ? net->name : netdev_name(net)); |
|---|
| 1007 | 1017 | rtnl_unlock(); |
|---|
| 1008 | | - return ret < len ? ret : len; |
|---|
| 1018 | + return ret; |
|---|
| 1009 | 1019 | } |
|---|
| 1010 | 1020 | EXPORT_SYMBOL_GPL(gether_get_ifname); |
|---|
| 1011 | 1021 | |
|---|
| 1012 | | -/** |
|---|
| 1022 | +int gether_set_ifname(struct net_device *net, const char *name, int len) |
|---|
| 1023 | +{ |
|---|
| 1024 | + struct eth_dev *dev = netdev_priv(net); |
|---|
| 1025 | + char tmp[IFNAMSIZ]; |
|---|
| 1026 | + const char *p; |
|---|
| 1027 | + |
|---|
| 1028 | + if (name[len - 1] == '\n') |
|---|
| 1029 | + len--; |
|---|
| 1030 | + |
|---|
| 1031 | + if (len >= sizeof(tmp)) |
|---|
| 1032 | + return -E2BIG; |
|---|
| 1033 | + |
|---|
| 1034 | + strscpy(tmp, name, len + 1); |
|---|
| 1035 | + if (!dev_valid_name(tmp)) |
|---|
| 1036 | + return -EINVAL; |
|---|
| 1037 | + |
|---|
| 1038 | + /* Require exactly one %d, so binding will not fail with EEXIST. */ |
|---|
| 1039 | + p = strchr(name, '%'); |
|---|
| 1040 | + if (!p || p[1] != 'd' || strchr(p + 2, '%')) |
|---|
| 1041 | + return -EINVAL; |
|---|
| 1042 | + |
|---|
| 1043 | + strncpy(net->name, tmp, sizeof(net->name)); |
|---|
| 1044 | + dev->ifname_set = true; |
|---|
| 1045 | + |
|---|
| 1046 | + return 0; |
|---|
| 1047 | +} |
|---|
| 1048 | +EXPORT_SYMBOL_GPL(gether_set_ifname); |
|---|
| 1049 | + |
|---|
| 1050 | +/* |
|---|
| 1013 | 1051 | * gether_cleanup - remove Ethernet-over-USB device |
|---|
| 1014 | 1052 | * Context: may sleep |
|---|
| 1015 | 1053 | * |
|---|