| #ifndef _PACKETIZER_H | 
 | #define _PACKETIZER_H | 
 |  | 
 | #include <sys/socket.h> | 
 | #include <netinet/in.h> | 
 | #include <string.h> | 
 | #include <netpacket/packet.h> | 
 |  | 
 | #define PACKETIZER_ETHERTYPE 0xabcd | 
 | #define MAX_PAYLOAD_SIZE 1024 | 
 | #define MAX_PACKET_SIZE (MAX_PAYLOAD_SIZE+sizeof(packet_header)) | 
 | struct packet_header | 
 | { | 
 | 	uint8_t dst_mac[6]; | 
 | 	uint8_t src_mac[6]; | 
 | 	uint16_t ethertype; | 
 | 	uint16_t seqno; | 
 | 	uint32_t payload_size; | 
 | }; | 
 |  | 
 | struct packet | 
 | { | 
 | 	packet_header header; | 
 | 	char payload[MAX_PAYLOAD_SIZE]; | 
 | 	uint32_t packet_size; | 
 |  | 
 | 	uint32_t size() | 
 | 	{ | 
 | 	  return packet_size; | 
 | 	} | 
 |  | 
 | 	packet() {} | 
 | 	packet(const char* dst_mac, const char* src_mac,  | 
 | 	       char seqno,int payload_size, const uint8_t* bytes) | 
 | 	{ | 
 | 	  header.ethertype = htons(PACKETIZER_ETHERTYPE); | 
 | 	  memcpy(header.dst_mac,dst_mac,6); | 
 | 	  memcpy(header.src_mac,src_mac,6); | 
 | 	  header.seqno = htons(seqno); | 
 | 	  header.payload_size = ntohl(payload_size); | 
 | 	  if(bytes) | 
 | 	    memcpy(payload,bytes,payload_size); | 
 | 	  packet_size = sizeof(header)+payload_size; | 
 | 	} | 
 | }; | 
 |  | 
 | class packetizer | 
 | { | 
 | public: | 
 | 	 | 
 | 	packetizer(const char *target_mac, const char *eth_device,  | 
 | 	           const char *filename); | 
 | 	int start(void);  | 
 |  | 
 | protected: | 
 |  | 
 | 	sockaddr_ll myaddr; | 
 | 	int sock; | 
 | 	char host_mac[6]; | 
 | 	char target_mac[6]; | 
 | 	char eth_device[64]; | 
 | 	char filename[256]; | 
 |  | 
 | 	void send_packet(packet* packet); | 
 |  | 
 | 	uint16_t seqno; | 
 | 	uint16_t next_seqno() { return seqno++; } | 
 | }; | 
 |  | 
 | #endif // _PACKETIZER_H |