Index: /trunk/lib/libtrace.h.in
===================================================================
--- /trunk/lib/libtrace.h.in	(revision 1664)
+++ /trunk/lib/libtrace.h.in	(revision 1665)
@@ -501,4 +501,12 @@
 } PACKED libtrace_ip6_ext_t;
 
+typedef struct libtrace_ip6_frag 
+{
+	uint8_t nxt;	/**< Next header */
+	uint8_t res;	/**< Reserved */
+	uint16_t frag_off;	/**< Fragment Offset (includes M flag) */
+	uint32_t ident;	/** Fragment identification */
+} PACKED libtrace_ip6_frag_t;
+
 /** Generic IPv6 header structure
  *
Index: /trunk/lib/protocols_l3.c
===================================================================
--- /trunk/lib/protocols_l3.c	(revision 1664)
+++ /trunk/lib/protocols_l3.c	(revision 1665)
@@ -141,4 +141,5 @@
 	void *payload = (char*)ipptr+sizeof(libtrace_ip6_t);
 	uint8_t nxt;
+	uint16_t len;
 
 	assert (ipptr != NULL);
@@ -156,10 +157,9 @@
 			case 0: /* hop by hop options */
 			case TRACE_IPPROTO_ROUTING:
-			case TRACE_IPPROTO_FRAGMENT:
 			case TRACE_IPPROTO_ESP:
 			case TRACE_IPPROTO_AH: 
 			case TRACE_IPPROTO_DSTOPTS: 
 				{
-					uint16_t len=((libtrace_ip6_ext_t*)payload)->len
+					len=((libtrace_ip6_ext_t*)payload)->len
 					+sizeof(libtrace_ip6_ext_t);
 
@@ -177,4 +177,20 @@
 					continue;
 				}
+			case TRACE_IPPROTO_FRAGMENT:
+				{
+					len = sizeof(libtrace_ip6_frag_t);
+					if (remaining) {
+						if (*remaining < len) {
+							/* Snap too short */
+							*remaining = 0;
+							return NULL;
+						}
+						*remaining-=len;
+					}
+					payload=(char*)payload+len;
+					nxt=((libtrace_ip6_frag_t*)payload)->nxt;
+					continue;
+				}
+
 			default:
 				if (prot) *prot=nxt;
