diff --git a/scapy/layers/inet6.py b/scapy/layers/inet6.py
index bd2122ef6f57a980143e99d939b7166cc7c82c4c..b7dcb416157fb3d9f781c1609b14ff4cb7fc0df6 100644
--- a/scapy/layers/inet6.py
+++ b/scapy/layers/inet6.py
@@ -958,10 +958,6 @@ def fragment6(pkt, fragSize):
     """
 
     pkt = pkt.copy()
-    s = str(pkt) # for instantiation to get upper layer checksum right
-
-    if len(s) <= fragSize:
-        return [pkt]
 
     if not IPv6ExtHdrFragment in pkt:
         # TODO : automatically add a fragment before upper Layer
@@ -969,6 +965,15 @@ def fragment6(pkt, fragSize):
         #        as single element of a list
         return [pkt]
 
+    # If the payload is bigger than 65535, IPv6().post_build() will throw an exception
+    if len(str(pkt[IPv6ExtHdrFragment])) > 65535:
+      pkt[IPv6].plen = 65535
+    
+    s = str(pkt) # for instantiation to get upper layer checksum right
+
+    if len(s) <= fragSize:
+        return [pkt]
+
     # Fragmentable part : fake IPv6 for Fragmentable part length computation
     fragPart = pkt[IPv6ExtHdrFragment].payload
     tmp = str(IPv6(src="::1", dst="::1")/fragPart)