12 #ifndef RAWSOCK_H_INCLUDED 13 #define RAWSOCK_H_INCLUDED 15 #include <net/ethernet.h> 16 #include <linux/udp.h> 18 #include <arpa/inet.h> 24 #define udphdr __kernel_udphdr 27 #define MAC_FILE_PATH_SIZE 23 28 #define MAC_ADDR_SIZE 6 31 #define ERR_WLAN_NOIF 0 32 #define ERR_WLAN_SOCK -1 33 #define ERR_WLAN_GETIFADDRS -2 34 #define ERR_WLAN_INDEX -3 35 #define ERR_WLAN_GETSRCMAC -4 36 #define ERR_WLAN_GETIFINDEX -5 37 #define ERR_WLAN_GETSRCIP -6 39 #define ERR_IPHEAD_SOCK -10 40 #define ERR_IPHEAD_NOSRCADDR -11 42 #define ERR_VIFPRINTER_SOCK -20 43 #define ERR_VIFPRINTER_GETIFADDRS -21 46 #define WLANLOOKUP_WLAN 0 47 #define WLANLOOKUP_NONWLAN 1 51 #define MAC_BROADCAST 0x01 52 #define MAC_UNICAST 0x02 53 #define MAC_MULTICAST 0x03 58 #define ETHERTYPE_GEONET 0x8947 59 #define ETHERTYPE_WSMP 0x88DC 61 // Special wlanLookup index values 62 #define WLANLOOKUP_LOOPBACK -1 67 #define BASIC_UDP_TTL 64 70 #define UDPHEADERLEN 8 73 #define FLAG_NOFRAG_MASK (1<<6) 74 #define FLAG_RESERVED_MASK (1<<7) 75 #define FLAG_MOREFRAG_MASK (1<<5) 77 // Checksum protocols, to be used inside the validateEthCsum() function 81 #define CSUM_UDPIP 0x80 83 // Useful macros for printing MAC addresses inside the printf() familty of functions 84 #define PRI_MAC "%02x:%02x:%02x:%02x:%02x:%02x" 85 #define MAC_PRINTER(mac_array) mac_array[0], mac_array[1], mac_array[2], mac_array[3], mac_array[4], mac_array[5] 87 // Useful macros for reading MAC addresses inside the scanf() familty of functions 88 #define SCN_MAC "%x:%x:%x:%x:%x:%x%*c" 89 #define MAC_SCANNER(mac_array) &mac_array[0], &mac_array[1], &mac_array[2], &mac_array[3], &mac_array[4], &mac_array[5] 91 // Size definitions (macros) 92 #define UDP_PACKET_SIZE(data) sizeof(struct udphdr)+sizeof(data) 93 #define IP_UDP_PACKET_SIZE(data) sizeof(struct iphdr)+sizeof(struct udphdr)+sizeof(data) 94 #define ETH_IP_UDP_PACKET_SIZE(data) sizeof(struct ether_header)+sizeof(struct iphdr)+sizeof(struct udphdr)+sizeof(data) 96 #define UDP_PACKET_SIZE_S(size) sizeof(struct udphdr)+size 97 #define IP_UDP_PACKET_SIZE_S(size) sizeof(struct iphdr)+sizeof(struct udphdr)+size 98 #define ETH_IP_UDP_PACKET_SIZE_S(size) sizeof(struct ether_header)+sizeof(struct iphdr)+sizeof(struct udphdr)+size 141 uint64_t
hton64 (uint64_t hostu64);
142 uint64_t
ntoh64 (uint64_t netu64);
151 rawsockerr_t IP4headPopulateB(
struct iphdr *IPhead,
char *devname,
unsigned char tos,
unsigned short frag_offset,
unsigned char ttl,
unsigned char protocol,
unsigned int flags,
struct ipaddrs *addrs);
152 rawsockerr_t IP4headPopulateS(
struct iphdr *IPhead,
char *devname,
struct in_addr destIP,
unsigned char tos,
unsigned short frag_offset,
unsigned char ttl,
unsigned char protocol,
unsigned int flags,
struct ipaddrs *addrs);
153 rawsockerr_t IP4headPopulate(
struct iphdr *IPhead,
char *devname,
char *destIP,
unsigned char tos,
unsigned short frag_offset,
unsigned char ttl,
unsigned char protocol,
unsigned int flags,
struct ipaddrs *addrs);
154 void IP4headAddID(
struct iphdr *IPhead,
unsigned short id);
159 void UDPheadPopulate(
struct udphdr *UDPhead,
unsigned short sourceport,
unsigned short destport);
void display_packet(const char *text, byte_t *packet, unsigned int len)
Display packet in hexadecimal form.
size_t etherEncapsulate(byte_t *packet, struct ether_header *header, byte_t *sdu, size_t sdusize)
Combine Ethernet SDU and PCI.
void etherheadPopulate(struct ether_header *etherHeader, macaddr_t macsrc, macaddr_t macdst, ethertype_t type)
Populate Ethernet header.
size_t IP4Encapsulate(byte_t *packet, struct iphdr *header, byte_t *sdu, size_t sdusize)
Combine IPv4 SDU and PCI.
void etherheadPopulateB(struct ether_header *etherHeader, macaddr_t mac, ethertype_t type)
Populate broadcast Ethernet header (variant of etherheadPopulate())
void getSrcMAC(struct ether_header *etherHeader, macaddr_t macsrc)
Retrieve source MAC address field from Ethernet header.
unsigned int macAddrTypeGet(macaddr_t mac)
Get the MAC address type.
uint64_t ntoh64(uint64_t netu64)
Convert a 64-bit unsigned value between network and host byte order.
Structure to store a couple of source and destinaion IPv4 addresses.
macaddr_t prepareMacAddrT()
Prepare a macaddr_t variable.
void freeMacAddrT(macaddr_t mac)
Free a macaddr_t variable.
bool validateEthCsum(byte_t *packet, csum16_t csum, csum16_t *combinedcsum, csumt_t type, void *args)
Validate the checksum of a raw "Ethernet" packet, i.e. of any packet containing a struct ether_header...
uint64_t hton64(uint64_t hostu64)
Convert a 64-bit unsigned value between host and network byte order.
void rs_printerror(FILE *stream, rawsockerr_t code)
Print more detailed error messages.
rawsockerr_t IP4headPopulateB(struct iphdr *IPhead, char *devname, unsigned char tos, unsigned short frag_offset, unsigned char ttl, unsigned char protocol, unsigned int flags, struct ipaddrs *addrs)
Populate broadcast IP version 4 header (variant of IP4headPopulate())
rawsockerr_t vifPrinter(FILE *stream)
Print information about available interfaces.
protocol_t
Protocol type enumerator.
void UDPheadPopulate(struct udphdr *UDPhead, unsigned short sourceport, unsigned short destport)
Populate UDP header.
void test_injectIPCsumError(byte_t *IPpacket)
Test function: inject a checksum error in an IP packet.
rawsockerr_t wlanLookup(char *devname, int *ifindex, macaddr_t mac, struct in_addr *srcIP, int index, int mode)
Automatically look for available WLAN, non-WLAN or loopback interfaces.
unsigned short UDPgetpayloadsize(struct udphdr *UDPheader)
Get UDP payload size, given a UDP header.
rawsockerr_t IP4headPopulateS(struct iphdr *IPhead, char *devname, struct in_addr destIP, unsigned char tos, unsigned short frag_offset, unsigned char ttl, unsigned char protocol, unsigned int flags, struct ipaddrs *addrs)
Populate IP version 4 header with struct in_addr addresses (variant of IP4headPopulate()) ...
size_t UDPencapsulate(byte_t *packet, struct udphdr *header, byte_t *data, size_t payloadsize, struct ipaddrs addrs)
Combine UDP payload and header.
void IP4headAddTotLen(struct iphdr *IPhead, unsigned short len)
Add Total Length to a given IPv4 header.
unsigned short ethertype_t
void IP4headAddID(struct iphdr *IPhead, unsigned short id)
Add ID to a given IPv4 header.
void test_injectUDPCsumError(byte_t *UDPpacket)
Test function: inject a checksum error in an UDP packet.
rawsockerr_t IP4headPopulate(struct iphdr *IPhead, char *devname, char *destIP, unsigned char tos, unsigned short frag_offset, unsigned char ttl, unsigned char protocol, unsigned int flags, struct ipaddrs *addrs)
Populate IP version 4 header.
void display_packetc(const char *text, byte_t *packet, unsigned int len)
Display packet in character form.
byte_t * UDPgetpacketpointers(byte_t *pktbuf, struct ether_header **etherHeader, struct iphdr **IPheader, struct udphdr **UDPheader)
Get pointers to headers and payload in UDP packet buffer.