|
@@ -160,8 +160,8 @@ out:
|
|
static int ipv6_exthdrs_len(struct ipv6hdr *iph,
|
|
static int ipv6_exthdrs_len(struct ipv6hdr *iph,
|
|
const struct net_offload **opps)
|
|
const struct net_offload **opps)
|
|
{
|
|
{
|
|
- struct ipv6_opt_hdr *opth = NULL;
|
|
|
|
- int len = 0, optlen = 0, proto;
|
|
|
|
|
|
+ struct ipv6_opt_hdr *opth = (void *)iph;
|
|
|
|
+ int len = 0, proto, optlen = sizeof(*iph);
|
|
|
|
|
|
proto = iph->nexthdr;
|
|
proto = iph->nexthdr;
|
|
for (;;) {
|
|
for (;;) {
|
|
@@ -172,12 +172,8 @@ static int ipv6_exthdrs_len(struct ipv6hdr *iph,
|
|
if (!((*opps)->flags & INET6_PROTO_GSO_EXTHDR))
|
|
if (!((*opps)->flags & INET6_PROTO_GSO_EXTHDR))
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
- if (opth == NULL) {
|
|
|
|
- opth = (void *)(iph+1);
|
|
|
|
- } else {
|
|
|
|
- optlen = ipv6_optlen(opth);
|
|
|
|
- opth = (void *)opth + optlen;
|
|
|
|
- }
|
|
|
|
|
|
+ opth = (void *)opth + optlen;
|
|
|
|
+ optlen = ipv6_optlen(opth);
|
|
len += optlen;
|
|
len += optlen;
|
|
proto = opth->nexthdr;
|
|
proto = opth->nexthdr;
|
|
}
|
|
}
|