/*-------------------------------------------------------------*/
/***************************************************************
* Some header fields are computed by functions : *
* - linkhdr.ethhdr.type *
* - ip4hdr.ihl *
* - ip4hdr.totlen *
* - ip4hdr.check *
* - ip4hdr.protocol *
* - udphdr.len *
* - udphdr.check *
* - tcphdr.doff *
* - tcphdr.check *
* - icmp4hdr.check *
* To use fake values for those fields, they have to be edited *
* after packet construction. *
***************************************************************/
/*-------------------------------------------------------------*/
/*-------------------------------------------------------------*/
/* Following functions create/decode layers. Their names should be
self explaining.
Note : when decoding a layer, ppkt buffer is automatically
shifted to point to next entry.
*/
/*-------------------------------------------------------------*/
netwib_err netwib_pkt_append_layer_link(netwib_constlinkhdr *plinkhdr,
netwib_buf *pbuf);
netwib_err netwib_pkt_decode_layer_link(netwib_device_dlttype dlttype,
netwib_buf *ppkt,
netwib_linkhdr *plinkhdr);
/*-------------------------------------------------------------*/
netwib_err netwib_pkt_append_layer_ip4opt(netwib_constip4hdr *pip4hdr,
netwib_constbuf *pip4opt,
netwib_uint32 datasize,
netwib_buf *pbuf);
netwib_err netwib_pkt_decode_layer_ip4opt(netwib_buf *ppkt,
netwib_ip4hdr *pip4hdr,
netwib_bufext *pip4opt);
#define netwib_pkt_append_layer_ip4(pip4hdr,datasize,pbuf) netwib_pkt_append_layer_ip4opt(pip4hdr,NULL,datasize,pbuf)
#define netwib_pkt_decode_layer_ip4(pkt,pip4hdr) netwib_pkt_decode_layer_ip4opt(pkt,pip4hdr,NULL)
/*-------------------------------------------------------------*/
netwib_err netwib_pkt_append_layer_udpdata(netwib_constip4hdr *pip4hdr,
netwib_constudphdr *pudphdr,
netwib_constbuf *pdata,
netwib_buf *pbuf);
netwib_err netwib_pkt_decode_layer_udpdata(netwib_buf *ppkt,
netwib_udphdr *pudphdr,
netwib_bufext *pdata);
#define netwib_pkt_decode_layer_udp(ppkt,pudphdr) netwib_pkt_decode_layer_udpdata(ppkt,pudphdr, NULL)
/*-------------------------------------------------------------*/
netwib_err netwib_pkt_append_layer_tcpoptdata(netwib_constip4hdr *pip4hdr,
netwib_consttcphdr *ptcphdr,
netwib_constbuf *ptcpopt,
netwib_constbuf *pdata,
netwib_buf *pbuf);
#define netwib_pkt_append_layer_tcpdata(pip4hdr,ptcphdr,pdata,pbuf) netwib_pkt_append_layer_tcpoptdata(pip4hdr,ptcphdr,NULL,pdata,pbuf)
netwib_err netwib_pkt_decode_layer_tcpoptdata(netwib_buf *ppkt,
netwib_tcphdr *ptcphdr,
netwib_bufext *ptcpopt,
netwib_bufext *pdata);
#define netwib_pkt_decode_layer_tcpdata(pkt,ptcphdr,pdata) netwib_pkt_decode_layer_tcpoptdata(pkt,ptcphdr,NULL,pdata)
#define netwib_pkt_decode_layer_tcp(pkt,ptcphdr) netwib_pkt_decode_layer_tcpoptdata(pkt,ptcphdr,NULL,NULL)
#define netwib_pkt_decode_layer_tcpopt(pkt,ptcphdr,ptcpopt) netwib_pkt_decode_layer_tcpoptdata(pkt,ptcphdr,ptcpopt,NULL)
/*-------------------------------------------------------------*/
netwib_err netwib_pkt_append_layer_icmp4data(netwib_consticmp4hdr *picmp4hdr,
netwib_constbuf *pdata,
netwib_buf *pbuf);
netwib_err netwib_pkt_decode_layer_icmp4data(netwib_buf *ppkt,
netwib_icmp4hdr *picmp4hdr,
netwib_bufext *pdata);
#define netwib_pkt_decode_layer_icmp4(ppkt,picmp4hdr) netwib_pkt_decode_layer_icmp4data(ppkt,picmp4hdr, NULL)
/*-------------------------------------------------------------*/
netwib_err netwib_pkt_append_layer_arp(netwib_constarphdr *parphdr,
netwib_buf *pbuf);
netwib_err netwib_pkt_decode_layer_arp(netwib_buf *ppkt,
netwib_arphdr *parphdr);
/*-------------------------------------------------------------*/
/*-------------------------------------------------------------*/
/* Following functions create/decode packets. Their names should be
self explaining.
*/
/*-------------------------------------------------------------*/
netwib_err netwib_pkt_append_linkdata(netwib_constlinkhdr *plinkhdr,
netwib_constbuf *pdata,
netwib_buf *pbuf);
netwib_err netwib_pkt_decode_linkdata(netwib_device_dlttype dlttype,
netwib_constbuf *ppkt,
netwib_linkhdr *plinkhdr,
netwib_bufext *pdata);
/*-------------------------------------------------------------*/
netwib_err netwib_pkt_append_ip4optdata(netwib_constip4hdr *pip4hdr,
netwib_constbuf *pip4opt,
netwib_constbuf *pdata,
netwib_buf *pbuf);
netwib_err netwib_pkt_decode_ip4optdata(netwib_constbuf *ppkt,
netwib_ip4hdr *pip4hdr,
netwib_bufext *pip4opt,
netwib_bufext *pdata);
netwib_err netwib_pkt_append_linkip4optdata(netwib_constlinkhdr *plinkhdr,
netwib_constip4hdr *pip4hdr,
netwib_constbuf *pip4opt,
netwib_constbuf *pdata,
netwib_buf *pbuf);
netwib_err netwib_pkt_decode_linkip4optdata(netwib_device_dlttype dlttype,
netwib_constbuf *ppkt,
netwib_linkhdr *plinkhdr,
netwib_ip4hdr *pip4hdr,
netwib_bufext *pip4opt,
netwib_bufext *pdata);
#define netwib_pkt_append_ip4data(pip4hdr,pdata,pbuf) netwib_pkt_append_ip4optdata(pip4hdr,NULL,pdata,pbuf)
#define netwib_pkt_decode_ip4data(pkt,pip4hdr,pdata) netwib_pkt_decode_ip4optdata(pkt,pip4hdr,NULL,pdata)
#define netwib_pkt_append_linkip4data(plinkhdr,pip4hdr,pdata,pbuf) netwib_pkt_append_linkip4optdata(plinkhdr,pip4hdr,NULL,pdata,pbuf)
#define netwib_pkt_decode_linkip4data(dlttype,pkt,plinkhdr,pip4hdr,pdata) netwib_pkt_decode_linkip4optdata(dlttype,pkt,plinkhdr,pip4hdr,NULL,pdata)
/*-------------------------------------------------------------*/
netwib_err netwib_pkt_append_ip4optudpdata(netwib_constip4hdr *pip4hdr,
netwib_constbuf *pip4opt,
netwib_constudphdr *pudphdr,
netwib_constbuf *pdata,
netwib_buf *pbuf);
netwib_err netwib_pkt_decode_ip4optudpdata(netwib_constbuf *ppkt,
netwib_ip4hdr *pip4hdr,
netwib_bufext *pip4opt,
netwib_udphdr *pudphdr,
netwib_bufext *pdata);
netwib_err netwib_pkt_append_linkip4optudpdata(netwib_constlinkhdr *plinkhdr,
netwib_constip4hdr *pip4hdr,
netwib_constbuf *pip4opt,
netwib_constudphdr *pudphdr,
netwib_constbuf *pdata,
netwib_buf *pbuf);
netwib_err netwib_pkt_decode_linkip4optudpdata(netwib_device_dlttype dlttype,
netwib_constbuf *ppkt,
netwib_linkhdr *plinkhdr,
netwib_ip4hdr *pip4hdr,
netwib_bufext *pip4opt,
netwib_udphdr *pudphdr,
netwib_bufext *pdata);
#define netwib_pkt_append_ip4udpdata(pip4hdr,pudphdr,pdata,pbuf) netwib_pkt_append_ip4optudpdata(pip4hdr,NULL,pudphdr,pdata,pbuf)
#define netwib_pkt_decode_ip4udpdata(pkt,pip4hdr,pudphdr,pdata) netwib_pkt_decode_ip4optudpdata(pkt,pip4hdr,NULL,pudphdr,pdata)
#define netwib_pkt_append_linkip4udpdata(plinkhdr,pip4hdr,pudphdr,pdata,pbuf) netwib_pkt_append_linkip4optudpdata(plinkhdr,pip4hdr,NULL,pudphdr,pdata,pbuf)
#define netwib_pkt_decode_linkip4udpdata(dlttype,pkt,plinkhdr,pip4hdr,pudphdr,pdata) netwib_pkt_decode_linkip4optudpdata(dlttype,pkt,plinkhdr,pip4hdr,NULL,pudphdr,pdata)
/*-------------------------------------------------------------*/
netwib_err netwib_pkt_append_ip4opttcpoptdata(netwib_constip4hdr *pip4hdr,
netwib_constbuf *pip4opt,
netwib_consttcphdr *ptcphdr,
netwib_constbuf *ptcpopt,
netwib_constbuf *pdata,
netwib_buf *pbuf);
netwib_err netwib_pkt_decode_ip4opttcpoptdata(netwib_constbuf *ppkt,
netwib_ip4hdr *pip4hdr,
netwib_bufext *pip4opt,
netwib_tcphdr *ptcphdr,
netwib_bufext *ptcpopt,
netwib_bufext *pdata);
netwib_err netwib_pkt_append_linkip4opttcpoptdata(netwib_constlinkhdr *plinkhdr,
netwib_constip4hdr *pip4hdr,
netwib_constbuf *pip4opt,
netwib_consttcphdr *ptcphdr,
netwib_constbuf *ptcpopt,
netwib_constbuf *pdata,
netwib_buf *pbuf);
netwib_err netwib_pkt_decode_linkip4opttcpoptdata(netwib_device_dlttype dlttype,
netwib_constbuf *ppkt,
netwib_linkhdr *plinkhdr,
netwib_ip4hdr *pip4hdr,
netwib_bufext *pip4opt,
netwib_tcphdr *ptcphdr,
netwib_bufext *ptcpopt,
netwib_bufext *pdata);
#define netwib_pkt_append_ip4tcpdata(pip4hdr,ptcphdr,pdata,pbuf) netwib_pkt_append_ip4opttcpoptdata(pip4hdr,NULL,ptcphdr,NULL,pdata,pbuf)
#define netwib_pkt_append_ip4opttcpdata(pip4hdr,pip4opt,ptcphdr,pdata,pbuf) netwib_pkt_append_ip4opttcpoptdata(pip4hdr,pip4opt,ptcphdr,NULL,pdata,pbuf)
#define netwib_pkt_append_ip4tcpoptdata(pip4hdr,ptcphdr,ptcpopt,pdata,pbuf) netwib_pkt_append_ip4opttcpoptdata(pip4hdr,NULL,ptcphdr,ptcpopt,pdata,pbuf)
#define netwib_pkt_decode_ip4tcpdata(pkt,pip4hdr,ptcphdr,pdata) netwib_pkt_decode_ip4opttcpoptdata(pkt,pip4hdr,NULL,ptcphdr,NULL,pdata)
#define netwib_pkt_decode_ip4opttcpdata(pkt,pip4opt,ppip4hdr,ptcphdr,pdata) netwib_pkt_decode_ip4opttcpoptdata(pkt,pip4hdr,pip4opt,pptcphdr,NULL,pdata)
#define netwib_pkt_decode_ip4tcpoptdata(pkt,pip4hdr,ptcphdr,ptcpopt,pdata) netwib_pkt_decode_ip4opttcpoptdata(pkt,pip4hdr,NULL,ptcphdr,ptcpopt,pdata)
#define netwib_pkt_append_linkip4tcpdata(plinkhdr,pip4hdr,ptcphdr,pdata,pbuf) netwib_pkt_append_linkip4opttcpoptdata(plinkhdr,pip4hdr,NULL,ptcphdr,NULL,pdata,pbuf)
#define netwib_pkt_append_linkip4opttcpdata(plinkhdr,pip4hdr,pip4opt,ptcphdr,pdata,pbuf) netwib_pkt_append_linkip4opttcpoptdata(plinkhdr,pip4hdr,pip4opt,ptcphdr,NULL,pdata,pbuf)
#define netwib_pkt_append_linkip4tcpoptdata(plinkhdr,pip4hdr,ptcphdr,ptcpopt,pdata,pbuf) netwib_pkt_append_linkip4opttcpoptdata(plinkhdr,pip4hdr,NULL,ptcphdr,tcpopt,pdata,pbuf)
#define netwib_pkt_decode_linkip4tcpdata(dlttype,pkt,plinkhdr,pip4hdr,ptcphdr,pdata) netwib_pkt_decode_linkip4opttcpoptdata(dlttype,pkt,plinkhdr,pip4hdr,NULL,ptcphdr,NULL,pdata)
#define netwib_pkt_decode_linkip4opttcpdata(dlttype,pkt,plinkhdr,ip4opt,ppip4hdr,ptcphdr,pdata) netwib_pkt_decode_linkip4opttcpoptdata(dlttype,pkt,plinkhdr,pip4hdr,ip4opt,pptcphdr,NULL,pdata)
#define netwib_pkt_decode_linkip4tcpoptdata(dlttype,pkt,plinkhdr,pip4hdr,ptcphdr,tcpopt,pdata) netwib_pkt_decode_linkip4opttcpoptdata(dlttype,pkt,plinkhdr,pip4hdr,NULL,ptcphdr,tcpopt,pdata)
/*-------------------------------------------------------------*/
netwib_err netwib_pkt_append_ip4opticmp4data(netwib_constip4hdr *pip4hdr,
netwib_constbuf *pip4opt,
netwib_consticmp4hdr *picmp4hdr,
netwib_constbuf *pdata,
netwib_buf *pbuf);
netwib_err netwib_pkt_decode_ip4opticmp4data(netwib_constbuf *ppkt,
netwib_ip4hdr *pip4hdr,
netwib_bufext *pip4opt,
netwib_icmp4hdr *picmp4hdr,
netwib_bufext *pdata);
netwib_err netwib_pkt_append_linkip4opticmp4data(netwib_constlinkhdr *plinkhdr,
netwib_constip4hdr *pip4hdr,
netwib_constbuf *pip4opt,
netwib_consticmp4hdr *picmp4hdr,
netwib_constbuf *pdata,
netwib_buf *pbuf);
netwib_err netwib_pkt_decode_linkip4opticmp4data(netwib_device_dlttype dlttype,
netwib_constbuf *ppkt,
netwib_linkhdr *plinkhdr,
netwib_ip4hdr *pip4hdr,
netwib_bufext *pip4opt,
netwib_icmp4hdr *picmp4hdr,
netwib_bufext *pdata);
#define netwib_pkt_append_ip4icmp4data(pip4hdr,picmp4hdr,pdata,pbuf) netwib_pkt_append_ip4opticmp4data(pip4hdr,NULL,picmp4hdr,pdata,pbuf)
#define netwib_pkt_decode_ip4icmp4data(pkt,pip4hdr,picmp4hdr,pdata) netwib_pkt_decode_ip4opticmp4data(pkt,pip4hdr,NULL,picmp4hdr,pdata)
#define netwib_pkt_append_linkip4icmp4data(plinkhdr,pip4hdr,picmp4hdr,pdata,pbuf) netwib_pkt_append_linkip4opticmp4data(plinkhdr,pip4hdr,NULL,picmp4hdr,pdata,pbuf)
#define netwib_pkt_decode_linkip4icmp4data(dlttype,pkt,plinkhdr,pip4hdr,picmp4hdr,pdata) netwib_pkt_decode_linkip4opticmp4data(dlttype,pkt,plinkhdr,pip4hdr,NULL,picmp4hdr,pdata)
/*-------------------------------------------------------------*/
/* before calling this function, user has to set plinkhdr->type
to ARP or RARP */
netwib_err netwib_pkt_append_linkarp(netwib_constlinkhdr *plinkhdr,
netwib_constarphdr *parphdr,
netwib_buf *pbuf);
netwib_err netwib_pkt_decode_linkarp(netwib_device_dlttype dlttype,
netwib_constbuf *ppkt,
netwib_linkhdr *plinkhdr,
netwib_arphdr *parphdr);