.. | .. |
---|
955 | 955 | goto tx_err; |
---|
956 | 956 | |
---|
957 | 957 | if (skb->len > dev->mtu + dev->hard_header_len) { |
---|
958 | | - pskb_trim(skb, dev->mtu + dev->hard_header_len); |
---|
| 958 | + if (pskb_trim(skb, dev->mtu + dev->hard_header_len)) |
---|
| 959 | + goto tx_err; |
---|
959 | 960 | truncate = true; |
---|
960 | 961 | } |
---|
961 | 962 | |
---|
962 | | - nhoff = skb_network_header(skb) - skb_mac_header(skb); |
---|
| 963 | + nhoff = skb_network_offset(skb); |
---|
963 | 964 | if (skb->protocol == htons(ETH_P_IP) && |
---|
964 | 965 | (ntohs(ip_hdr(skb)->tot_len) > skb->len - nhoff)) |
---|
965 | 966 | truncate = true; |
---|
.. | .. |
---|
968 | 969 | int thoff; |
---|
969 | 970 | |
---|
970 | 971 | if (skb_transport_header_was_set(skb)) |
---|
971 | | - thoff = skb_transport_header(skb) - skb_mac_header(skb); |
---|
| 972 | + thoff = skb_transport_offset(skb); |
---|
972 | 973 | else |
---|
973 | 974 | thoff = nhoff + sizeof(struct ipv6hdr); |
---|
974 | 975 | if (ntohs(ipv6_hdr(skb)->payload_len) > skb->len - thoff) |
---|
.. | .. |
---|
1015 | 1016 | ntohl(tun_id), |
---|
1016 | 1017 | ntohl(md->u.index), truncate, |
---|
1017 | 1018 | false); |
---|
| 1019 | + proto = htons(ETH_P_ERSPAN); |
---|
1018 | 1020 | } else if (md->version == 2) { |
---|
1019 | 1021 | erspan_build_header_v2(skb, |
---|
1020 | 1022 | ntohl(tun_id), |
---|
1021 | 1023 | md->u.md2.dir, |
---|
1022 | 1024 | get_hwid(&md->u.md2), |
---|
1023 | 1025 | truncate, false); |
---|
| 1026 | + proto = htons(ETH_P_ERSPAN2); |
---|
1024 | 1027 | } else { |
---|
1025 | 1028 | goto tx_err; |
---|
1026 | 1029 | } |
---|
.. | .. |
---|
1043 | 1046 | break; |
---|
1044 | 1047 | } |
---|
1045 | 1048 | |
---|
1046 | | - if (t->parms.erspan_ver == 1) |
---|
| 1049 | + if (t->parms.erspan_ver == 1) { |
---|
1047 | 1050 | erspan_build_header(skb, ntohl(t->parms.o_key), |
---|
1048 | 1051 | t->parms.index, |
---|
1049 | 1052 | truncate, false); |
---|
1050 | | - else if (t->parms.erspan_ver == 2) |
---|
| 1053 | + proto = htons(ETH_P_ERSPAN); |
---|
| 1054 | + } else if (t->parms.erspan_ver == 2) { |
---|
1051 | 1055 | erspan_build_header_v2(skb, ntohl(t->parms.o_key), |
---|
1052 | 1056 | t->parms.dir, |
---|
1053 | 1057 | t->parms.hwid, |
---|
1054 | 1058 | truncate, false); |
---|
1055 | | - else |
---|
| 1059 | + proto = htons(ETH_P_ERSPAN2); |
---|
| 1060 | + } else { |
---|
1056 | 1061 | goto tx_err; |
---|
| 1062 | + } |
---|
1057 | 1063 | |
---|
1058 | 1064 | fl6.daddr = t->parms.raddr; |
---|
1059 | 1065 | } |
---|
1060 | 1066 | |
---|
1061 | 1067 | /* Push GRE header. */ |
---|
1062 | | - proto = (t->parms.erspan_ver == 1) ? htons(ETH_P_ERSPAN) |
---|
1063 | | - : htons(ETH_P_ERSPAN2); |
---|
1064 | 1068 | gre_build_header(skb, 8, TUNNEL_SEQ, proto, 0, htonl(atomic_fetch_inc(&t->o_seqno))); |
---|
1065 | 1069 | |
---|
1066 | 1070 | /* TooBig packet may have updated dst->dev's mtu */ |
---|