diff options
| -rw-r--r-- | net/ipv6/ip6_offload.c | 12 |
1 files changed, 4 insertions, 8 deletions
diff --git a/net/ipv6/ip6_offload.c b/net/ipv6/ip6_offload.c index 08861f1ff883..6fb4162fa785 100644 --- a/net/ipv6/ip6_offload.c +++ b/net/ipv6/ip6_offload.c | |||
| @@ -160,8 +160,8 @@ out: | |||
| 160 | static int ipv6_exthdrs_len(struct ipv6hdr *iph, | 160 | static int ipv6_exthdrs_len(struct ipv6hdr *iph, |
| 161 | const struct net_offload **opps) | 161 | const struct net_offload **opps) |
| 162 | { | 162 | { |
| 163 | struct ipv6_opt_hdr *opth = NULL; | 163 | struct ipv6_opt_hdr *opth = (void *)iph; |
| 164 | int len = 0, optlen = 0, proto; | 164 | int len = 0, proto, optlen = sizeof(*iph); |
| 165 | 165 | ||
| 166 | proto = iph->nexthdr; | 166 | proto = iph->nexthdr; |
| 167 | for (;;) { | 167 | for (;;) { |
| @@ -172,12 +172,8 @@ static int ipv6_exthdrs_len(struct ipv6hdr *iph, | |||
| 172 | if (!((*opps)->flags & INET6_PROTO_GSO_EXTHDR)) | 172 | if (!((*opps)->flags & INET6_PROTO_GSO_EXTHDR)) |
| 173 | break; | 173 | break; |
| 174 | } | 174 | } |
| 175 | if (opth == NULL) { | 175 | opth = (void *)opth + optlen; |
| 176 | opth = (void *)(iph+1); | 176 | optlen = ipv6_optlen(opth); |
| 177 | } else { | ||
| 178 | optlen = ipv6_optlen(opth); | ||
| 179 | opth = (void *)opth + optlen; | ||
| 180 | } | ||
| 181 | len += optlen; | 177 | len += optlen; |
| 182 | proto = opth->nexthdr; | 178 | proto = opth->nexthdr; |
| 183 | } | 179 | } |
