line ::= iface | arp | send | defrouter | ipv4line .

iface ::= ifhdr "{" ifaceopts "}" .
ifhdr ::= "interface" | "iface" .
ifaceopts ::= "ifname" name | "mtu" mtu | "v4addr" ipaddr | "eaddr" eaddr .

send ::= "send" ";" | "send" "{" sendbodyopts "}" .
sendbodyopts ::= sendbody [ sendbodyopts ] .
sendbody ::= "ifname" name | "via" ipaddr .

defrouter ::= "router" ipaddr .

arp ::= "arp" "{" arpbodyopts "}" .
arpbodyopts ::= arpbody [ arpbodyopts ] .
arpbody ::= "v4addr" ipaddr | "eaddr" eaddr .

ipv4line ::= "ipv4" "{" ipv4bodyopts "}" .
ipv4bodyopts ::= ipv4body [ ipv4bodyopts ] .
ipv4body ::= "proto" protocol | "src" ipaddr | "dst" ipaddr | "off" number |
	     "v" number | "hl" number| "id" number | "ttl" number |
	     "tos" number | "sum" number | "len" number |
	     "opt" "{" ipv4optlist "}" | tcpline | udpline | icmpline |
	     ipv4line .
ipv4optlist ::= ipv4option [ ipv4optlist ] .
ipv4optlist = "nop" | "rr" | "zsu" | "mtup" | "mtur" | "encode" | "ts" | "tr" |
	      "sec" | "lsrr" | "e-sec" | "cipso" | "satid" | "ssrr" |
	      "addext" | "visa" | "imitd" | "eip" | "finn" |
	      "secclass" ipv4secclass.
ipv4secclass := "unclass" | "confid" | "reserv-1" | "reserv-2" | "reserv-3" |
		"reserv-4" | "secret" | "topsecret" .

tcpline ::= "tcp" "{" tcpbodyopts "}" .
tcpbodyopts ::= tcpbody [ tcpbodyopts ] .
tcpbody ::= "sport" port | "dport" port | "seq" number | "ack" number |
	    "off" number | "urp" number | "win" number | "sum" number |
	    "flags" tcpflags | data .

udpline ::= "udp" "{" udpbodyopts "}" .
udpbodyopts ::= udpbody [ udpbodyopts ] .
udpbody ::= "sport" port | "dport" port | "len" number | "sum" number | data .

icmpline ::= "icmp" "{" icmpbodyopts "}" .
icmpbodyopts ::= icmpbody [ icmpbodyopts ] .
icmpbody ::= "type" icmptype [ typeopts ] [ "code" icmpcode ] .
icmptype ::= "net-unr" | "host-unr" | "proto-unr" | "port-unr" |
	     "needfrag" | "srcfail" | "net-unk" | "host-unk" | "isolate" |
	     "net-prohib" | "host-prohib" | "net-tos" | "host-tos" .

data	::= "data" "{" databodyopts "}" .
databodyopts ::= "len" number | "value" string | "file" filename .
