|
@@ -242,20 +242,18 @@ void build_ehash_secret(void)
|
|
|
}
|
|
|
EXPORT_SYMBOL(build_ehash_secret);
|
|
|
|
|
|
-static inline int inet_netns_ok(struct net *net, int protocol)
|
|
|
+static inline int inet_netns_ok(struct net *net, __u8 protocol)
|
|
|
{
|
|
|
- int hash;
|
|
|
const struct net_protocol *ipprot;
|
|
|
|
|
|
if (net_eq(net, &init_net))
|
|
|
return 1;
|
|
|
|
|
|
- hash = protocol & (MAX_INET_PROTOS - 1);
|
|
|
- ipprot = rcu_dereference(inet_protos[hash]);
|
|
|
-
|
|
|
- if (ipprot == NULL)
|
|
|
+ ipprot = rcu_dereference(inet_protos[protocol]);
|
|
|
+ if (ipprot == NULL) {
|
|
|
/* raw IP is OK */
|
|
|
return 1;
|
|
|
+ }
|
|
|
return ipprot->netns_ok;
|
|
|
}
|
|
|
|
|
@@ -1216,8 +1214,8 @@ EXPORT_SYMBOL(inet_sk_rebuild_header);
|
|
|
|
|
|
static int inet_gso_send_check(struct sk_buff *skb)
|
|
|
{
|
|
|
- const struct iphdr *iph;
|
|
|
const struct net_protocol *ops;
|
|
|
+ const struct iphdr *iph;
|
|
|
int proto;
|
|
|
int ihl;
|
|
|
int err = -EINVAL;
|
|
@@ -1236,7 +1234,7 @@ static int inet_gso_send_check(struct sk_buff *skb)
|
|
|
__skb_pull(skb, ihl);
|
|
|
skb_reset_transport_header(skb);
|
|
|
iph = ip_hdr(skb);
|
|
|
- proto = iph->protocol & (MAX_INET_PROTOS - 1);
|
|
|
+ proto = iph->protocol;
|
|
|
err = -EPROTONOSUPPORT;
|
|
|
|
|
|
rcu_read_lock();
|
|
@@ -1253,8 +1251,8 @@ static struct sk_buff *inet_gso_segment(struct sk_buff *skb,
|
|
|
netdev_features_t features)
|
|
|
{
|
|
|
struct sk_buff *segs = ERR_PTR(-EINVAL);
|
|
|
- struct iphdr *iph;
|
|
|
const struct net_protocol *ops;
|
|
|
+ struct iphdr *iph;
|
|
|
int proto;
|
|
|
int ihl;
|
|
|
int id;
|
|
@@ -1286,7 +1284,7 @@ static struct sk_buff *inet_gso_segment(struct sk_buff *skb,
|
|
|
skb_reset_transport_header(skb);
|
|
|
iph = ip_hdr(skb);
|
|
|
id = ntohs(iph->id);
|
|
|
- proto = iph->protocol & (MAX_INET_PROTOS - 1);
|
|
|
+ proto = iph->protocol;
|
|
|
segs = ERR_PTR(-EPROTONOSUPPORT);
|
|
|
|
|
|
rcu_read_lock();
|
|
@@ -1340,7 +1338,7 @@ static struct sk_buff **inet_gro_receive(struct sk_buff **head,
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
- proto = iph->protocol & (MAX_INET_PROTOS - 1);
|
|
|
+ proto = iph->protocol;
|
|
|
|
|
|
rcu_read_lock();
|
|
|
ops = rcu_dereference(inet_protos[proto]);
|
|
@@ -1398,11 +1396,11 @@ out:
|
|
|
|
|
|
static int inet_gro_complete(struct sk_buff *skb)
|
|
|
{
|
|
|
- const struct net_protocol *ops;
|
|
|
+ __be16 newlen = htons(skb->len - skb_network_offset(skb));
|
|
|
struct iphdr *iph = ip_hdr(skb);
|
|
|
- int proto = iph->protocol & (MAX_INET_PROTOS - 1);
|
|
|
+ const struct net_protocol *ops;
|
|
|
+ int proto = iph->protocol;
|
|
|
int err = -ENOSYS;
|
|
|
- __be16 newlen = htons(skb->len - skb_network_offset(skb));
|
|
|
|
|
|
csum_replace2(&iph->check, iph->tot_len, newlen);
|
|
|
iph->tot_len = newlen;
|