| .. | .. |
|---|
| 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 */ |
|---|