forked from luck/tmp_suning_uos_patched
gso: Remove arbitrary checks for unsupported GSO
In several gso_segment functions there are checks of gso_type against a seemingly arbitrary list of SKB_GSO_* flags. This seems like an attempt to identify unsupported GSO types, but since the stack is the one that set these GSO types in the first place this seems unnecessary to do. If a combination isn't valid in the first place that stack should not allow setting it. This is a code simplication especially for add new GSO types. Signed-off-by: Tom Herbert <tom@herbertland.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
948350140e
commit
5c7cdf339a
|
@ -1205,24 +1205,6 @@ static struct sk_buff *inet_gso_segment(struct sk_buff *skb,
|
||||||
int ihl;
|
int ihl;
|
||||||
int id;
|
int id;
|
||||||
|
|
||||||
if (unlikely(skb_shinfo(skb)->gso_type &
|
|
||||||
~(SKB_GSO_TCPV4 |
|
|
||||||
SKB_GSO_UDP |
|
|
||||||
SKB_GSO_DODGY |
|
|
||||||
SKB_GSO_TCP_ECN |
|
|
||||||
SKB_GSO_GRE |
|
|
||||||
SKB_GSO_GRE_CSUM |
|
|
||||||
SKB_GSO_IPIP |
|
|
||||||
SKB_GSO_SIT |
|
|
||||||
SKB_GSO_TCPV6 |
|
|
||||||
SKB_GSO_UDP_TUNNEL |
|
|
||||||
SKB_GSO_UDP_TUNNEL_CSUM |
|
|
||||||
SKB_GSO_TCP_FIXEDID |
|
|
||||||
SKB_GSO_TUNNEL_REMCSUM |
|
|
||||||
SKB_GSO_PARTIAL |
|
|
||||||
0)))
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
skb_reset_network_header(skb);
|
skb_reset_network_header(skb);
|
||||||
nhoff = skb_network_header(skb) - skb_mac_header(skb);
|
nhoff = skb_network_header(skb) - skb_mac_header(skb);
|
||||||
if (unlikely(!pskb_may_pull(skb, sizeof(*iph))))
|
if (unlikely(!pskb_may_pull(skb, sizeof(*iph))))
|
||||||
|
|
|
@ -26,20 +26,6 @@ static struct sk_buff *gre_gso_segment(struct sk_buff *skb,
|
||||||
int gre_offset, outer_hlen;
|
int gre_offset, outer_hlen;
|
||||||
bool need_csum, ufo;
|
bool need_csum, ufo;
|
||||||
|
|
||||||
if (unlikely(skb_shinfo(skb)->gso_type &
|
|
||||||
~(SKB_GSO_TCPV4 |
|
|
||||||
SKB_GSO_TCPV6 |
|
|
||||||
SKB_GSO_UDP |
|
|
||||||
SKB_GSO_DODGY |
|
|
||||||
SKB_GSO_TCP_ECN |
|
|
||||||
SKB_GSO_TCP_FIXEDID |
|
|
||||||
SKB_GSO_GRE |
|
|
||||||
SKB_GSO_GRE_CSUM |
|
|
||||||
SKB_GSO_IPIP |
|
|
||||||
SKB_GSO_SIT |
|
|
||||||
SKB_GSO_PARTIAL)))
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
if (!skb->encapsulation)
|
if (!skb->encapsulation)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
|
|
@ -83,25 +83,6 @@ struct sk_buff *tcp_gso_segment(struct sk_buff *skb,
|
||||||
|
|
||||||
if (skb_gso_ok(skb, features | NETIF_F_GSO_ROBUST)) {
|
if (skb_gso_ok(skb, features | NETIF_F_GSO_ROBUST)) {
|
||||||
/* Packet is from an untrusted source, reset gso_segs. */
|
/* Packet is from an untrusted source, reset gso_segs. */
|
||||||
int type = skb_shinfo(skb)->gso_type;
|
|
||||||
|
|
||||||
if (unlikely(type &
|
|
||||||
~(SKB_GSO_TCPV4 |
|
|
||||||
SKB_GSO_DODGY |
|
|
||||||
SKB_GSO_TCP_ECN |
|
|
||||||
SKB_GSO_TCP_FIXEDID |
|
|
||||||
SKB_GSO_TCPV6 |
|
|
||||||
SKB_GSO_GRE |
|
|
||||||
SKB_GSO_GRE_CSUM |
|
|
||||||
SKB_GSO_IPIP |
|
|
||||||
SKB_GSO_SIT |
|
|
||||||
SKB_GSO_UDP_TUNNEL |
|
|
||||||
SKB_GSO_UDP_TUNNEL_CSUM |
|
|
||||||
SKB_GSO_TUNNEL_REMCSUM |
|
|
||||||
0) ||
|
|
||||||
!(type & (SKB_GSO_TCPV4 |
|
|
||||||
SKB_GSO_TCPV6))))
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
skb_shinfo(skb)->gso_segs = DIV_ROUND_UP(skb->len, mss);
|
skb_shinfo(skb)->gso_segs = DIV_ROUND_UP(skb->len, mss);
|
||||||
|
|
||||||
|
|
|
@ -209,16 +209,6 @@ static struct sk_buff *udp4_ufo_fragment(struct sk_buff *skb,
|
||||||
|
|
||||||
if (skb_gso_ok(skb, features | NETIF_F_GSO_ROBUST)) {
|
if (skb_gso_ok(skb, features | NETIF_F_GSO_ROBUST)) {
|
||||||
/* Packet is from an untrusted source, reset gso_segs. */
|
/* Packet is from an untrusted source, reset gso_segs. */
|
||||||
int type = skb_shinfo(skb)->gso_type;
|
|
||||||
|
|
||||||
if (unlikely(type & ~(SKB_GSO_UDP | SKB_GSO_DODGY |
|
|
||||||
SKB_GSO_UDP_TUNNEL |
|
|
||||||
SKB_GSO_UDP_TUNNEL_CSUM |
|
|
||||||
SKB_GSO_TUNNEL_REMCSUM |
|
|
||||||
SKB_GSO_IPIP |
|
|
||||||
SKB_GSO_GRE | SKB_GSO_GRE_CSUM) ||
|
|
||||||
!(type & (SKB_GSO_UDP))))
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
skb_shinfo(skb)->gso_segs = DIV_ROUND_UP(skb->len, mss);
|
skb_shinfo(skb)->gso_segs = DIV_ROUND_UP(skb->len, mss);
|
||||||
|
|
||||||
|
|
|
@ -69,24 +69,6 @@ static struct sk_buff *ipv6_gso_segment(struct sk_buff *skb,
|
||||||
bool encap, udpfrag;
|
bool encap, udpfrag;
|
||||||
int nhoff;
|
int nhoff;
|
||||||
|
|
||||||
if (unlikely(skb_shinfo(skb)->gso_type &
|
|
||||||
~(SKB_GSO_TCPV4 |
|
|
||||||
SKB_GSO_UDP |
|
|
||||||
SKB_GSO_DODGY |
|
|
||||||
SKB_GSO_TCP_ECN |
|
|
||||||
SKB_GSO_TCP_FIXEDID |
|
|
||||||
SKB_GSO_TCPV6 |
|
|
||||||
SKB_GSO_GRE |
|
|
||||||
SKB_GSO_GRE_CSUM |
|
|
||||||
SKB_GSO_IPIP |
|
|
||||||
SKB_GSO_SIT |
|
|
||||||
SKB_GSO_UDP_TUNNEL |
|
|
||||||
SKB_GSO_UDP_TUNNEL_CSUM |
|
|
||||||
SKB_GSO_TUNNEL_REMCSUM |
|
|
||||||
SKB_GSO_PARTIAL |
|
|
||||||
0)))
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
skb_reset_network_header(skb);
|
skb_reset_network_header(skb);
|
||||||
nhoff = skb_network_header(skb) - skb_mac_header(skb);
|
nhoff = skb_network_header(skb) - skb_mac_header(skb);
|
||||||
if (unlikely(!pskb_may_pull(skb, sizeof(*ipv6h))))
|
if (unlikely(!pskb_may_pull(skb, sizeof(*ipv6h))))
|
||||||
|
|
|
@ -36,19 +36,6 @@ static struct sk_buff *udp6_ufo_fragment(struct sk_buff *skb,
|
||||||
|
|
||||||
if (skb_gso_ok(skb, features | NETIF_F_GSO_ROBUST)) {
|
if (skb_gso_ok(skb, features | NETIF_F_GSO_ROBUST)) {
|
||||||
/* Packet is from an untrusted source, reset gso_segs. */
|
/* Packet is from an untrusted source, reset gso_segs. */
|
||||||
int type = skb_shinfo(skb)->gso_type;
|
|
||||||
|
|
||||||
if (unlikely(type & ~(SKB_GSO_UDP |
|
|
||||||
SKB_GSO_DODGY |
|
|
||||||
SKB_GSO_UDP_TUNNEL |
|
|
||||||
SKB_GSO_UDP_TUNNEL_CSUM |
|
|
||||||
SKB_GSO_TUNNEL_REMCSUM |
|
|
||||||
SKB_GSO_GRE |
|
|
||||||
SKB_GSO_GRE_CSUM |
|
|
||||||
SKB_GSO_IPIP |
|
|
||||||
SKB_GSO_SIT) ||
|
|
||||||
!(type & (SKB_GSO_UDP))))
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
skb_shinfo(skb)->gso_segs = DIV_ROUND_UP(skb->len, mss);
|
skb_shinfo(skb)->gso_segs = DIV_ROUND_UP(skb->len, mss);
|
||||||
|
|
||||||
|
|
|
@ -26,15 +26,6 @@ static struct sk_buff *mpls_gso_segment(struct sk_buff *skb,
|
||||||
netdev_features_t mpls_features;
|
netdev_features_t mpls_features;
|
||||||
__be16 mpls_protocol;
|
__be16 mpls_protocol;
|
||||||
|
|
||||||
if (unlikely(skb_shinfo(skb)->gso_type &
|
|
||||||
~(SKB_GSO_TCPV4 |
|
|
||||||
SKB_GSO_TCPV6 |
|
|
||||||
SKB_GSO_UDP |
|
|
||||||
SKB_GSO_DODGY |
|
|
||||||
SKB_GSO_TCP_FIXEDID |
|
|
||||||
SKB_GSO_TCP_ECN)))
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
/* Setup inner SKB. */
|
/* Setup inner SKB. */
|
||||||
mpls_protocol = skb->protocol;
|
mpls_protocol = skb->protocol;
|
||||||
skb->protocol = skb->inner_protocol;
|
skb->protocol = skb->inner_protocol;
|
||||||
|
@ -57,7 +48,7 @@ static struct sk_buff *mpls_gso_segment(struct sk_buff *skb,
|
||||||
* skb_mac_gso_segment(), an indirect caller of this function.
|
* skb_mac_gso_segment(), an indirect caller of this function.
|
||||||
*/
|
*/
|
||||||
__skb_pull(skb, skb->data - skb_mac_header(skb));
|
__skb_pull(skb, skb->data - skb_mac_header(skb));
|
||||||
out:
|
|
||||||
return segs;
|
return segs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user