diff options
Diffstat (limited to 'net/core/dev.c')
-rw-r--r-- | net/core/dev.c | 37 |
1 files changed, 30 insertions, 7 deletions
diff --git a/net/core/dev.c b/net/core/dev.c index 07ed21d64f92..613fb4066be7 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -1106,7 +1106,7 @@ static int __dev_alloc_name(struct net *net, const char *name, char *buf) | |||
1106 | * when the name is long and there isn't enough space left | 1106 | * when the name is long and there isn't enough space left |
1107 | * for the digits, or if all bits are used. | 1107 | * for the digits, or if all bits are used. |
1108 | */ | 1108 | */ |
1109 | return p ? -ENFILE : -EEXIST; | 1109 | return -ENFILE; |
1110 | } | 1110 | } |
1111 | 1111 | ||
1112 | static int dev_alloc_name_ns(struct net *net, | 1112 | static int dev_alloc_name_ns(struct net *net, |
@@ -1146,7 +1146,19 @@ EXPORT_SYMBOL(dev_alloc_name); | |||
1146 | int dev_get_valid_name(struct net *net, struct net_device *dev, | 1146 | int dev_get_valid_name(struct net *net, struct net_device *dev, |
1147 | const char *name) | 1147 | const char *name) |
1148 | { | 1148 | { |
1149 | return dev_alloc_name_ns(net, dev, name); | 1149 | BUG_ON(!net); |
1150 | |||
1151 | if (!dev_valid_name(name)) | ||
1152 | return -EINVAL; | ||
1153 | |||
1154 | if (strchr(name, '%')) | ||
1155 | return dev_alloc_name_ns(net, dev, name); | ||
1156 | else if (__dev_get_by_name(net, name)) | ||
1157 | return -EEXIST; | ||
1158 | else if (dev->name != name) | ||
1159 | strlcpy(dev->name, name, IFNAMSIZ); | ||
1160 | |||
1161 | return 0; | ||
1150 | } | 1162 | } |
1151 | EXPORT_SYMBOL(dev_get_valid_name); | 1163 | EXPORT_SYMBOL(dev_get_valid_name); |
1152 | 1164 | ||
@@ -3139,10 +3151,21 @@ static void qdisc_pkt_len_init(struct sk_buff *skb) | |||
3139 | hdr_len = skb_transport_header(skb) - skb_mac_header(skb); | 3151 | hdr_len = skb_transport_header(skb) - skb_mac_header(skb); |
3140 | 3152 | ||
3141 | /* + transport layer */ | 3153 | /* + transport layer */ |
3142 | if (likely(shinfo->gso_type & (SKB_GSO_TCPV4 | SKB_GSO_TCPV6))) | 3154 | if (likely(shinfo->gso_type & (SKB_GSO_TCPV4 | SKB_GSO_TCPV6))) { |
3143 | hdr_len += tcp_hdrlen(skb); | 3155 | const struct tcphdr *th; |
3144 | else | 3156 | struct tcphdr _tcphdr; |
3145 | hdr_len += sizeof(struct udphdr); | 3157 | |
3158 | th = skb_header_pointer(skb, skb_transport_offset(skb), | ||
3159 | sizeof(_tcphdr), &_tcphdr); | ||
3160 | if (likely(th)) | ||
3161 | hdr_len += __tcp_hdrlen(th); | ||
3162 | } else { | ||
3163 | struct udphdr _udphdr; | ||
3164 | |||
3165 | if (skb_header_pointer(skb, skb_transport_offset(skb), | ||
3166 | sizeof(_udphdr), &_udphdr)) | ||
3167 | hdr_len += sizeof(struct udphdr); | ||
3168 | } | ||
3146 | 3169 | ||
3147 | if (shinfo->gso_type & SKB_GSO_DODGY) | 3170 | if (shinfo->gso_type & SKB_GSO_DODGY) |
3148 | gso_segs = DIV_ROUND_UP(skb->len - hdr_len, | 3171 | gso_segs = DIV_ROUND_UP(skb->len - hdr_len, |
@@ -3904,7 +3927,7 @@ static u32 netif_receive_generic_xdp(struct sk_buff *skb, | |||
3904 | hroom > 0 ? ALIGN(hroom, NET_SKB_PAD) : 0, | 3927 | hroom > 0 ? ALIGN(hroom, NET_SKB_PAD) : 0, |
3905 | troom > 0 ? troom + 128 : 0, GFP_ATOMIC)) | 3928 | troom > 0 ? troom + 128 : 0, GFP_ATOMIC)) |
3906 | goto do_drop; | 3929 | goto do_drop; |
3907 | if (troom > 0 && __skb_linearize(skb)) | 3930 | if (skb_linearize(skb)) |
3908 | goto do_drop; | 3931 | goto do_drop; |
3909 | } | 3932 | } |
3910 | 3933 | ||