ARS Packet Description system

  This document describes the APD format. APD is a way to describe TCP/IP
  packets, and it is used in high level functions of the ARS library.
  The general format is the following:

	layer_type{field_1=value_1,field_2=value_2,...,field_n=value_n}

  more layers can be combined using the "+" simbol. Example:

	ip{dst=192.168.1.2}+udp{sport=53,dport=53}+data{file=./dns.packet}

  You don't need to specify fields that ARS can guess. For example
  if you don't specify checksums they will be correctly generated
  in the process of packet compilation.

  AVAILABLE LAYERS
  ~~~~~~~~~~~~~~~~

  A layer type is one of the following:

	ip			IP header
	ipopt.eol		IP option EOL
	ipopt.nop		IP option NOP
	ipopt.sec		IP option Security
	ipopt.sid		IP option Stream ID
	ipopt.lsrr		IP option Loose Source Routing
	ipopt.ssrr		IP option Strict Source Routing
	ipopt.rr		IP option Record Route
	ipopt.ts		IP option Timestamp
	udp			UDP header
	tcp			TCP header
	tcpopt.eol		TCP option END (EOL)
	tcpopt.nop		TCP option NOP
	tcpopt.mss		TCP option Max Segment Size
	tcpopt.wscale		TCP option Window Scale
	tcpopt.sackperm		TCP option Selective ACK permitted
	tcpopt.sack		TCP option Selective ACK
	tcpopt.echoreq		TCP option Echo Request
	tcpopt.echoreply	TCP option Echo Reply
	tcpopt.ts		TCP option Timestamp
	icmp			ICMP header
	data			Generic Data

  Different fields are defined for different layer types:

  IP FIELDS:	DESCRIPTION:		POSSIBLE VALUE:
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  saddr		Source address		192.168.1.2, or www.yahoo.com
  daddr		Destination address	192.168.1.2, or www.yahoo.com
  ihl		IP header len		numerical value
  ver		IP version		numerical value
  tos		Type of Service		numerical value
  totlen	IP tot len		numerical value
  id		IP packet ID		numerical value
  fragoff	IP fragment offset	numerical vaule
  mf		More Fragment		0 or 1
  df		Dont Fragment		0 or 1
  rf		Reserved Frag. bit	0 or 1
  ttl		Time to Live		numerical value
  proto		ip protocol field	numerical value
  cksum		ip checksum		numerical value

  UDP FIELDS:	DESCRIPTION:		POSSIBLE VALUE:
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  sport		Source port		numerical value
  dport		Destination port	numerical value
  len		UDP len field		numerical value
  cksum		UDP checksum		numerical value

  TCP FIELDS:	DESCRIPTION:		POSSIBLE VALUE:
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  sport		Source port		numerical value
  dport		Destination port	numerical value
  seq		TCP sequence number	numerical value
  ack		TCP acknowledge number	numerical value
  x2		TCP reserved bits	numerical value
  off		TCP header size		numerical value
  flags		TCP flags		FSRPAUXY (see the example)
  win		TCP window		numerical value
  cksum		TCP checksum		numerical value
  urp		TCP urgent pointer	numerical value

  ICMP FIELDS:	DESCRIPTION:		POSSIBLE VALUE:
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  type		ICMP type		numerical value
  code		ICMP code		numerical value
  cksum		ICMP cksum		numerical value
  id		ICMP echo ID		numerical value
  seq		ICMP echo sequence nr   numerical value
  gw		ICMP gateway		192.168.1.2 or www.yahoo.com
  unused	ICMP 32bit id/seq/gw	numerical value

  DATA FIELDS:	DESCRIPTION:		POSSIBLE VALUE:
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  file		Data file		/etc/passwd
  str		A string		hello world! (no escaping available)
  uint32	A 32bit integer		numerical value
  uint24	A 24bit integer		numerical value
  uint16	A 16bit integer		numerical value
  uint8		A 8bit integer		numerical value

  Other layer types fields aren't still implemented, anyway
  most of this contains sane defaults, (like IP record route option
  and so on).

  You can specify numerical values as hex, octal and decimal numbers.

  Decimail:	10
  Hex:		0xA
  Octal:	012

  Examples
  ~~~~~~~~

  /* Just an ICMP echo request */
  ip{saddr=1.2.3.4,daddr=www.yahoo.com}+icmp{type=8,code=0}\
  +data{str=hello world}

  /* An ICMP destination unreachable with the quoted UDP packet */
  ip{saddr=1.2.3.4,daddr=5.6.7.8}+icmp{type=3,code=3}\
  +ip{saddr=www.yahoo.com,daddr=1.2.3.4}+udp{sport=53,dport=53}\

  /* A TCP packet with the SYN flag set */
  ip{saddr=1.2.3.4,daddr=5.6.7.8}+tcp{flags=S,dport=80,sport=10}
