aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/ipv6/ip6_offload.c12
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:
160static int ipv6_exthdrs_len(struct ipv6hdr *iph, 160static 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 }