#ifndef IPTRAF_NG_PACKET_H
#define IPTRAF_NG_PACKET_H
/***
packet.h - external declarations for packet.c
***/
/*
* Number of bytes from captured packet to move into a buffer.
* 96 bytes should be enough for the IP header, TCP/UDP/ICMP/whatever header
* with reasonable numbers of options.
*/
#define MAX_PACKET_SIZE 96
#define INVALID_PACKET 0
#define PACKET_OK 1
#define CHECKSUM_ERROR 2
#define PACKET_FILTERED 3
#define MORE_FRAGMENTS 4
struct pkt_hdr {
size_t pkt_bufsize;
char *pkt_payload;
size_t pkt_caplen; /* bytes captured */
size_t pkt_len; /* bytes on-the-wire */
int pkt_ifindex; /* Interface number */
unsigned short pkt_protocol; /* Physical layer protocol: ETH_P_* */
unsigned short pkt_hatype; /* Header type: ARPHRD_* */
unsigned char pkt_pkttype; /* Packet type: PACKET_OUTGOING, PACKET_BROADCAST, ... */
unsigned char pkt_halen; /* Length of address */
unsigned char pkt_addr[8]; /* Physical layer address */
struct ethhdr *ethhdr;
struct fddihdr *fddihdr;
struct iphdr *iphdr;
struct ip6_hdr *ip6_hdr;
char pkt_buf[MAX_PACKET_SIZE];
};
static inline void PACKET_INIT_STRUCT(struct pkt_hdr *p)
{
p->pkt_bufsize = MAX_PACKET_SIZE;
p->pkt_payload = NULL;
p->ethhdr = NULL;
p->fddihdr = NULL;
p->iphdr = NULL;
p->ip6_hdr = NULL;
p->pkt_len = 0; /* signalize we have no packet prepared */
}
#define PACKET_INIT(packet) \
struct pkt_hdr packet; \
PACKET_INIT_STRUCT(&packet)
static inline __u8 pkt_iph_len(const struct pkt_hdr *pkt)
{
switch (pkt->pkt_protocol) {
case ETH_P_IP:
return pkt->iphdr->ihl * 4;
case ETH_P_IPV6:
return 40;
default:
return 0;
}
}
static inline __u8 pkt_ip_protocol(const struct pkt_hdr *p)
{
switch (p->pkt_protocol) {
case ETH_P_IP:
return p->iphdr->protocol;
case ETH_P_IPV6:
return p->ip6_hdr->ip6_nxt; /* FIXME: extension headers ??? */
};
return 0;
}
int packet_get(int fd, struct pkt_hdr *pkt, int *ch, WINDOW *win);
int packet_process(struct pkt_hdr *pkt, unsigned int *total_br,
in_port_t *sport, in_port_t *dport,
int match_opposite, int v6inv4asv6);
void pkt_cleanup(void);
#endif /* IPTRAF_NG_PACKET_H */