+
+define ip-proto 4 ip {mtu} {
+ # RFC2003
+ get-for ip-ip
+ get source v4addr
+ get dest v4addr
+ gen_1_ip $mtu $source $dest
+}
+
+
+define ip-proto 2 igmp {mtu} {
+ get-for igmp
+ get type enum 0 255 0.5
+ get timeout number 0 255
+ get group v4addr
+ set checksum 0
+ set extra {}
+ assemble igmp {
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Type | Timeout | ? Checksum |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Group |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | ? Extra ... |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ }
+
+ if {[choice-prob igmp-extra 0.3]} {
+ get extra rand 1 [expr {$mtu - [packet-len $igmp]}] 1
+ assembly-overwrite igmp extra $extra
+ }
+
+ assembly-overwrite igmp checksum [packet-csum-ip $igmp]
+ return $igmp
+}
+
+define igmp-type 17 membquery {} {}
+define igmp-type 16 membreport {} {}
+define igmp-type 23 leavegroup {} {}
+define igmp-type 18 membreport {} {}
+
+
+define ip-proto 51 ah {mtu} {
+ # RFC1826
+ get-for ah
+ get next number 0 255
+ get reserved hex 0 0xffff
+ get spi hex32
+ get auth_data rand 0 [expr {$mtu-8}] 4
+ set length [packet-len $auth_data]
+ assemble ah {
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Next | Length | RESERVED |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | SPI |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ | Auth Data ... |
+ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ }
+ get payload rand 0 [expr {$mtu - [packet-len $ah]}] 1
+ append ah $payload
+ return $ah
+}
+
+