
/* cutredump_banzai.h
 * Guillem Cantallops Ramis, BkP 2002
 * GNU GPL */


/* Constants varies */

#define TV(T)			((float)T.tv_sec+((float)T.tv_usec*1E-6))	/* Calcul del temps total */
#define DEFAULT_DEVICE	"eth0"
#define MAX_FRAME_LEN	1518


/* Gestió d'errors a algunes system calls */

#define PANIC(SCALL)	{ printf("%s[%d]: %s: %s\n", __FILE__, __LINE__, SCALL, strerror(errno)); exit(-1); }


/* Format de la capçalera d'una trama Ethernet, i identificadors de protocol */

typedef struct {
	/* Preamble ... */
	unsigned char		t_ha[6];		/* Adreça Ethernet del destinatari */
	unsigned char		s_ha[6];		/* Adreça Ethernet del remitent */
	unsigned short int	type;			/* Tipus de dades que transporta */
	/* ... dades i CRC */
} eth_hdr;

#define ETH_HDR_LEN	sizeof(eth_hdr)

#define ETH_P_IP	0x0800
#define ETH_P_ARP	0x0806
#define ETH_P_RARP	0x8035
#define ETH_P_ALL	0x0003


/* Format de la capçalera d'un paquet IP, i identificadors de protocol */

typedef struct {
	unsigned char		ihl:4,			/* Longitud de la capçalera, en paraules de 32 bits */
						ver:4;			/* Versió. Actualment fem servir IPv4 */
	unsigned char		tos;			/* Type Of Service */
	unsigned short int	tot_len;		/* Longitud total en bytes */
	unsigned short int	id;				/* Identificador */
	unsigned short int	frag_off;		/* Offset del paquet, si hi ha hagut fragmentació */
	unsigned char		ttl;			/* Time To Live */
	unsigned char		proto;			/* Protocol: indica què hi ha al camp de dades */
	unsigned short int	cksum;			/* CheckSum de la capçalera */
	unsigned char		s_ip[4];		/* Adreça IP d'origen */
	unsigned char		t_ip[4];		/* Adreça IP de destí */
	/* ... opcions, padding i dades */                                             
} ip_hdr;

#define IP_HDR_LEN	sizeof(ip_hdr)

#define IP_P_TCP	6
#define IP_P_UDP	17



/* Format de la capçalera d'un segment TCP */

typedef struct {
	unsigned short int	s_port;			/* Port TCP d'origen */
	unsigned short int	t_port;			/* Port TCP de destí */
	unsigned int		seq;			/* Numero de seqüència */
	unsigned int		ack_seq;		/* Numero d'ACK */
	unsigned short int	res1:4,			/* Bits reservats per us futur */
						doff:4,			/* Offset de les dades dins el segment (i.e. longitud de la capçalera) */
						fin:1,			/* FIN */
						syn:1,			/* SYN */
						rst:1,			/* RST */
						psh:1,			/* PSH */
						ack:1,			/* ACK */
						urg:1,			/* URG */
						res2:2;			/* Bits reservats per us futur */
	unsigned short int	window;			/* Tamany de la finestra */
	unsigned short int	cksum;			/* CheckSum d'una pseudo-capçalera IP i tot el segment TCP */
	unsigned short int	urgptr;			/* Punter a les dades urgents (dins el segment) */
	/* ... opcions, padding i dades */
} tcp_hdr;

#define TCP_FLAGS(S)	(S->urg<<5|S->ack<<4|S->psh<<3|S->rst<<2|S->syn<<1|S->fin)

#define TCP_URG			32
#define TCP_ACK			16
#define TCP_PSH			8
#define TCP_RST			4
#define TCP_SYN			2
#define TCP_FIN			1

#define TCP_HDR_LEN		sizeof(tcp_hdr)



/* Format de la capçalera d'un datagrama UDP */

typedef struct {
	unsigned short int	s_port;			/* Port UDP d'origen */
	unsigned short int	t_port;			/* Port UDP de destí */
	unsigned short int	msglen;			/* Longitud del datagrama */
	unsigned short int	cksum;			/* CheckSum d'una pseudo-capçalera IP i tot el datagrama UDP */
} udp_hdr;

#define UDP_HDR_LEN sizeof(udp_hdr)



/* Format dels missatges ARP (si usam IP sobre Ethernet) */

typedef	struct {
	unsigned short int	hw_type;		/* Sempre val 0x0001=ETHERNET */
	unsigned short int	pr_type;		/* Sempre val 0x0800=IP */
	unsigned char		hlen;			/* Sempre HLEN=6, les adreces MAC son de 48 bits!!! */
	unsigned char		plen;			/* Sempre PLEN=4, les adreces IP son de 32 bits!!! */
	unsigned short int	op;				/* arp_request=1, arp_response=2 */
	unsigned char		s_ha[6];		/* Adreça MAC del remitent */
	unsigned char		s_ip[4];		/* Adreça IP del remitent */
	unsigned char		t_ha[6];		/* Adreça MAC del destinatari */
	unsigned char		t_ip[4];		/* Adreça IP del destinatari */
} arp_message;

#define ARP_MSG_LEN	sizeof(arp_message)



/* Macros utils per manejar les adreces */

#define S_IP(A)		A->s_ip[0],A->s_ip[1],A->s_ip[2],A->s_ip[3]
#define S_HA(B)		B->s_ha[0],B->s_ha[1],B->s_ha[2],B->s_ha[3],B->s_ha[4],B->s_ha[5]
#define B_S_IP(C)	((u_int)C->s_ip[0]<<24|(u_int)C->s_ip[1]<<16|(u_int)C->s_ip[2]<<8|(u_int)C->s_ip[3])
#define B_S_MACH(D)	((u_int)D->s_ha[0]<<16|(u_int)D->s_ha[1]<<8|(u_int)D->s_ha[2])
#define B_S_MACL(E)	((u_int)E->s_ha[3]<<16|(u_int)E->s_ha[4]<<8|(u_int)E->s_ha[5])

#define T_IP(F)		F->t_ip[0],F->t_ip[1],F->t_ip[2],F->t_ip[3]
#define T_HA(G)		G->t_ha[0],G->t_ha[1],G->t_ha[2],G->t_ha[3],G->t_ha[4],G->t_ha[5]
#define B_T_IP(H)	((u_int)H->t_ip[0]<<24|(u_int)H->t_ip[1]<<16|(u_int)H->t_ip[2]<<8|(u_int)H->t_ip[3])
#define B_T_MACH(I)	((u_int)I->t_ha[0]<<16|(u_int)I->t_ha[1]<<8|(u_int)I->t_ha[2])
#define B_T_MACL(J)	((u_int)J->t_ha[3]<<16|(u_int)J->t_ha[4]<<8|(u_int)J->t_ha[5])



/* Constants referents al format "imprimible" de les adreces */

#define IP_TXT_LEN	15				/* Long. max. d'una adreça IP en text: "255.255.255.255" */
#define HA_TXT_LEN	17				/* Long. max. d'una adreça Ethernet en text: "ff-ff-ff-ff-ff-ff" */
#define IP_FORMAT	"%d.%d.%d.%d"						/* Format d'una adreça IP */
#define HA_FORMAT	"%02x:%02x:%02x:%02x:%02x:%02x"		/* Format d'una adreça Ethernet */



