\resizebox{\columnwidth}{!}{%
\begin{tikzpicture}[%
  -latex,
  sibling distance=10em,
  level distance=22pt,
  parser/.style = {%
    draw,
    shape=rectangle,
    rounded corners,
    align=center,
    top color=white,
    bottom color=mydblue!20,
  },
  label/.style = {%
    draw=none,
    align=center,
    text=mydblue,
    font=\scriptsize,
  },
  arrow/.style = {%
	  draw,
	  -latex,
	  rounded corners,
  },
]
	
	\node[parser](eth){Ethernet};
	\node[parser,right=of eth](udp){UDP};
	\coordinate(ip) at ($ (eth) !.5! (udp) $);
	\node[parser,above=of ip](ipv4){IPv4};
	\node[parser,below=of ip](ipv6){IPv6};

	\node[parser,right=of udp](dns){DNS};
	\node[parser](dnsp) at ($ (dns) + (1,1.1) $){preamble};
	\node[parser](dnsq) at ($ (dns) + (2.25,.45) $){domain name};
	\node[parser](dnst) at ($ (dns) + (2.25,-.45) $){query type};
	\node[parser](dnsc) at ($ (dns) + (1,-1.1) $){query class};

	\path[arrow] ($ (eth) + (-1.25,0) $) -- node[left,pos=0]{\texttt{pkt\_in}} (eth);

	\path[arrow] (eth) |- node[label,above left,pos=1]{\texttt{type=0x0800}} (ipv4);
	\path[arrow] (eth) |- node[label,below left,pos=1]{\texttt{type=0x86DD}} (ipv6);
	\path[arrow] (ipv4) -| node[label,above right, pos=0]{\texttt{proto=0x17}} (udp);
	\path[arrow] (ipv6) -| node[label,below right, pos=0]{\texttt{proto=0x17}} (udp);
	\path[arrow] (udp) -- node[label,above]{\texttt{sport=53}} (dns);

	\path[arrow,dashed] (dns) |- (dnsp);
	\path[arrow,dashed] (dnsp) -| node[label,above right,pos=0]{\texttt{qd=an=1}} (dnsq);
	\path[arrow,dashed] (dnsq) -- node[label,right]{\texttt{known log}} (dnst);
	\path[arrow,dashed] (dnst) |- node[label,below right,pos=1]{\texttt{TXT}} (dnsc);
	\path[arrow,dashed]
		(dnsq) edge[out=5, in=355, looseness=8]
			node[label,right]{
				\begin{tabular}{c}
					variable \\
					length
				  \end{tabular}
				}
		(dnsq);
	\path[arrow,dashed]
		(dnsc) --
			node[label,below right,pos=.8]{\texttt{IN}}
			node[pos=1.2,rotate=90]{\texttt{clone}}
		($ (dnsc) + (-1.5,0) $);
\end{tikzpicture}
}
