diff --git a/net/ipv6/ip6_offload.c b/net/ipv6/ip6_offload.c
index 08861f1ff883844dacc0722011a06303aba190fa..6fb4162fa78572411ccac31ac833c4eabe523fdc 100644
--- a/net/ipv6/ip6_offload.c
+++ b/net/ipv6/ip6_offload.c
@@ -160,8 +160,8 @@ static struct sk_buff *ipv6_gso_segment(struct sk_buff *skb,
 static int ipv6_exthdrs_len(struct ipv6hdr *iph,
 			    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;
 	for (;;) {
@@ -172,12 +172,8 @@ static int ipv6_exthdrs_len(struct ipv6hdr *iph,
 			if (!((*opps)->flags & INET6_PROTO_GSO_EXTHDR))
 				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;
 		proto = opth->nexthdr;
 	}