trafgen: parser: Add syntax to generate DNS header
commite6c1b6ca7fd51a9b7d2b3c597cd9731b59330032
authorVadim Kochan <vadim4j@gmail.com>
Thu, 1 Jun 2017 10:12:29 +0000 (1 13:12 +0300)
committerTobias Klauser <tklauser@distanz.ch>
Fri, 2 Jun 2017 07:15:32 +0000 (2 09:15 +0200)
treefb0b0c28179a60fd752090fd9b1f79dadb1308ea
parent9d5e303a998e4618d492c9d0befb09e3cd3d746b
trafgen: parser: Add syntax to generate DNS header

Add new syntax for DNS header generation via 'dns()' proto function.

The fields are supported:

id - 16 bit identifier
qr - message is a query(0) or response(1)
op|oper - specified kind of query
aanswer - authoritative answer flag
trunc - message was truncated flag
rdesired - recursion desired flag
ravail - recursion available flag
zero - reserved for future use
rcode - response code
qdcount - number of entries in question section
ancount - number of entries in answer section
nscount - number of entries in authority section
arcount - number of entries in additional section

Also there are functions to generate DNS sections:

'qry()' function to generate separate query entry:

name - variable domain name
type - type of the query
class - class of the query

'ans()', 'auth()', 'add'  functions to generate separate answer,
authoritative, adidditional entry with the same fields layout:

name - variable domain name
type - resource record type
class - class of the data
ttl - time interval that the record may be cached
len - length of data
data - variable length of bytes

All the DNS section entries will be automaticlly sorted by DNS proto API
in the way which is required by DNS header:

query entries
answer entries
authoritative entries
additional entries

'name' field in qry/ans/auth/add functions is automatically converted to
FQDN format if it was specified as "string".

There are also added functions to simplify the way of filling
some often used RR types for using them inside ans/auth/add functions:

addr(ipv4_addr | ipv6_addr) - fills the following RR fields:
len  - 4 or 16 depends on IPv4 or IPv6 address was specified
data - is filled with IPv4 or IPv6 address
type - 1 for IPv4 address, 28 - for IPv6

ns(string)
type - 2

cname(string)
type - 5

ptr(string)
type - 12

EXAMPLES:

{
    dns(qr=1,
        auth(name="ns1", ns("ns1.org")),
ans(name="www.google.com", cname("google.com")),
auth(name="aa", ns("bb")),
qry(name="www.google.com"))
}

{
    dns(qr=1, ans(name="www.google.com", addr(1.2.3.4)))
}

{
    dns(qr=1, ans(name="www.google.com", addr(1::)))
}

Signed-off-by: Vadim Kochan <vadim4j@gmail.com>
Signed-off-by: Tobias Klauser <tklauser@distanz.ch>
trafgen_lexer.l
trafgen_parser.y