Rawsock library  v0.3.4
Library to make the use of raw sockets easier, under Linux. Currently supporting IPv4, UDP and a custom latency measurement protocol (LaMP - supported both in raw and non-raw sockets).
rawsock.h
Go to the documentation of this file.
1 
12 #ifndef RAWSOCK_H_INCLUDED
13 #define RAWSOCK_H_INCLUDED
14 
15 #include <net/ethernet.h>
16 #include <linux/udp.h>
17 #include <linux/ip.h>
18 #include <arpa/inet.h>
19 #include <stdio.h>
20 #include <stdbool.h>
21 #include <string.h>
22 
23 #ifdef __ANDROID__
24  #define udphdr __kernel_udphdr
25 #endif
26 
27 #define MAC_FILE_PATH_SIZE 23
28 #define MAC_ADDR_SIZE 6
30 // Errors
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
45 // wlanLookup() modes
46 #define WLANLOOKUP_WLAN 0
47 #define WLANLOOKUP_NONWLAN 1
49 // Names
50 #define MAC_NULL 0x00
51 #define MAC_BROADCAST 0x01
52 #define MAC_UNICAST 0x02
53 #define MAC_MULTICAST 0x03
54 #define MAC_ZERO 0x04
56 // Useful constants
57 // Additional EtherTypes
58 #define ETHERTYPE_GEONET 0x8947
59 #define ETHERTYPE_WSMP 0x88DC
61 // Special wlanLookup index values
62 #define WLANLOOKUP_LOOPBACK -1
64 // IP constants
65 #define BASIC_IHL 5
66 #define IPV4 4
67 #define BASIC_UDP_TTL 64
69 // UDP constant
70 #define UDPHEADERLEN 8
72 // Useful masks
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
78 // (0x00->0x7F should be simple types, 0x80->0xFF should be combined types)
79 #define CSUM_IP 0x00
80 #define CSUM_UDP 0x01
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
100 #ifndef BYTE_TYPE
101 #define BYTE_TYPE
102 typedef uint8_t byte_t;
103 #endif
104 
105 typedef uint8_t * macaddr_t;
106 typedef unsigned short ethertype_t;
107 typedef int rawsockerr_t;
108 typedef unsigned char csumt_t;
109 typedef __sum16 csum16_t;
115 struct ipaddrs {
116  in_addr_t src;
117  in_addr_t dst;
118 };
119 
125 typedef enum {
127  UDP,
130 } protocol_t;
131 
132 // General utilities
133 rawsockerr_t wlanLookup(char *devname, int *ifindex, macaddr_t mac, struct in_addr *srcIP, int index, int mode);
134 rawsockerr_t vifPrinter(FILE *stream);
136 unsigned int macAddrTypeGet(macaddr_t mac);
137 void freeMacAddrT(macaddr_t mac);
138 void rs_printerror(FILE *stream,rawsockerr_t code);
139 void display_packet(const char *text,byte_t *packet,unsigned int len);
140 void display_packetc(const char *text,byte_t *packet,unsigned int len);
141 uint64_t hton64 (uint64_t hostu64); // Like 'htonl()' but for 64-bits unsigned integers
142 uint64_t ntoh64 (uint64_t netu64); // Like 'ntohl()' but for 64-bits unsigned integers
143 
144 // Ethernet level functions
145 void etherheadPopulateB(struct ether_header *etherHeader, macaddr_t mac, ethertype_t type);
146 void etherheadPopulate(struct ether_header *etherHeader, macaddr_t macsrc, macaddr_t macdst, ethertype_t type);
147 size_t etherEncapsulate(byte_t *packet,struct ether_header *header,byte_t *sdu,size_t sdusize);
148 void getSrcMAC(struct ether_header *etherHeader, macaddr_t macsrc);
149 
150 // IP level functions
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);
155 void IP4headAddTotLen(struct iphdr *IPhead, unsigned short len);
156 size_t IP4Encapsulate(byte_t *packet,struct iphdr *header,byte_t *sdu,size_t sdusize);
157 
158 // UDP level functions
159 void UDPheadPopulate(struct udphdr *UDPhead, unsigned short sourceport, unsigned short destport);
160 size_t UDPencapsulate(byte_t *packet,struct udphdr *header,byte_t *data,size_t payloadsize,struct ipaddrs addrs);
161 
162 // Receiving device functions
163 byte_t *UDPgetpacketpointers(byte_t *pktbuf,struct ether_header **etherHeader, struct iphdr **IPheader,struct udphdr **UDPheader);
164 unsigned short UDPgetpayloadsize(struct udphdr *UDPheader);
165 bool validateEthCsum(byte_t *packet, csum16_t csum, csum16_t *combinedcsum, csumt_t type, void *args);
166 
167 // Test functions, to inject errors inside packets - should never be used under normal circumstances
168 void test_injectIPCsumError(byte_t *IPpacket);
169 void test_injectUDPCsumError(byte_t *UDPpacket);
170 
171 #endif
void display_packet(const char *text, byte_t *packet, unsigned int len)
Display packet in hexadecimal form.
Definition: rawsock.c:459
size_t etherEncapsulate(byte_t *packet, struct ether_header *header, byte_t *sdu, size_t sdusize)
Combine Ethernet SDU and PCI.
Definition: rawsock.c:612
unsigned char csumt_t
Definition: rawsock.h:108
void etherheadPopulate(struct ether_header *etherHeader, macaddr_t macsrc, macaddr_t macdst, ethertype_t type)
Populate Ethernet header.
Definition: rawsock.c:587
size_t IP4Encapsulate(byte_t *packet, struct iphdr *header, byte_t *sdu, size_t sdusize)
Combine IPv4 SDU and PCI.
Definition: rawsock.c:926
void etherheadPopulateB(struct ether_header *etherHeader, macaddr_t mac, ethertype_t type)
Populate broadcast Ethernet header (variant of etherheadPopulate())
Definition: rawsock.c:556
void getSrcMAC(struct ether_header *etherHeader, macaddr_t macsrc)
Retrieve source MAC address field from Ethernet header.
Definition: rawsock.c:633
unsigned int macAddrTypeGet(macaddr_t mac)
Get the MAC address type.
Definition: rawsock.c:96
uint64_t ntoh64(uint64_t netu64)
Convert a 64-bit unsigned value between network and host byte order.
Definition: rawsock.c:532
Structure to store a couple of source and destinaion IPv4 addresses.
Definition: rawsock.h:115
macaddr_t prepareMacAddrT()
Prepare a macaddr_t variable.
Definition: rawsock.c:54
uint8_t * macaddr_t
Definition: rawsock.h:105
void freeMacAddrT(macaddr_t mac)
Free a macaddr_t variable.
Definition: rawsock.c:78
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...
Definition: rawsock.c:1099
uint64_t hton64(uint64_t hostu64)
Convert a 64-bit unsigned value between host and network byte order.
Definition: rawsock.c:513
void rs_printerror(FILE *stream, rawsockerr_t code)
Print more detailed error messages.
Definition: rawsock.c:399
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())
Definition: rawsock.c:830
__sum16 csum16_t
Definition: rawsock.h:109
rawsockerr_t vifPrinter(FILE *stream)
Print information about available interfaces.
Definition: rawsock.c:327
protocol_t
Protocol type enumerator.
Definition: rawsock.h:125
void UDPheadPopulate(struct udphdr *UDPhead, unsigned short sourceport, unsigned short destport)
Populate UDP header.
Definition: rawsock.c:960
void test_injectIPCsumError(byte_t *IPpacket)
Test function: inject a checksum error in an IP packet.
Definition: rawsock.c:1185
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.
Definition: rawsock.c:149
unsigned short UDPgetpayloadsize(struct udphdr *UDPheader)
Get UDP payload size, given a UDP header.
Definition: rawsock.c:1060
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()) ...
Definition: rawsock.c:755
Definition: rawsock.h:127
uint8_t byte_t
Definition: rawsock.h:102
in_addr_t src
Definition: rawsock.h:116
size_t UDPencapsulate(byte_t *packet, struct udphdr *header, byte_t *data, size_t payloadsize, struct ipaddrs addrs)
Combine UDP payload and header.
Definition: rawsock.c:988
void IP4headAddTotLen(struct iphdr *IPhead, unsigned short len)
Add Total Length to a given IPv4 header.
Definition: rawsock.c:904
unsigned short ethertype_t
Definition: rawsock.h:106
int rawsockerr_t
Definition: rawsock.h:107
in_addr_t dst
Definition: rawsock.h:117
void IP4headAddID(struct iphdr *IPhead, unsigned short id)
Add ID to a given IPv4 header.
Definition: rawsock.c:886
void test_injectUDPCsumError(byte_t *UDPpacket)
Test function: inject a checksum error in an UDP packet.
Definition: rawsock.c:1211
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.
Definition: rawsock.c:678
void display_packetc(const char *text, byte_t *packet, unsigned int len)
Display packet in character form.
Definition: rawsock.c:487
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.
Definition: rawsock.c:1034