defines.h.in 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412
  1. #pragma once
  2. #include "config.h"
  3. #ifdef HAVE_STDDEF_H
  4. #include <stddef.h>
  5. #endif
  6. #ifdef HAVE_SYS_TYPES_H
  7. #include <sys/types.h>
  8. #endif
  9. #ifdef HAVE_ARPA_INET_H
  10. #include <arpa/inet.h>
  11. #endif
  12. #ifdef WIN32
  13. #include "msvc_inttypes.h"
  14. #include "msvc_stdint.h"
  15. #else
  16. #ifdef HAVE_INTTYPES_H
  17. #include <inttypes.h>
  18. #endif
  19. #ifdef HAVE_STDINT_H
  20. #include <stdint.h>
  21. #endif
  22. #endif /* WIN32 */
  23. #ifdef HAVE_SYS_SOCKET_H
  24. #include <sys/socket.h>
  25. #endif
  26. #ifdef HAVE_NETINET_IN_H
  27. #include <netinet/in.h>
  28. #endif
  29. #ifdef HAVE_NETINET_IN_SYSTM_H
  30. #include <netinet/in_systm.h>
  31. #endif
  32. #ifdef HAVE_SCHED_H
  33. #include <sched.h>
  34. #endif
  35. #include "tcpr.h"
  36. #ifdef HAVE_BPF
  37. #include <net/bpf.h>
  38. #define PCAP_DONT_INCLUDE_PCAP_BPF_H 1
  39. #endif
  40. #ifdef HAVE_LIBBPF
  41. #undef HAVE_BPF
  42. #include <bpf/bpf.h>
  43. #include <bpf/libbpf.h>
  44. #define PCAP_DONT_INCLUDE_PCAP_BPF_H 1
  45. struct bpf_program {
  46. char dummy[0];
  47. };
  48. #endif
  49. #ifdef HAVE_LIBXDP
  50. #include <xdp/libxdp.h>
  51. #endif
  52. #if defined INCLUDE_PCAP_BPF_H_FILE && !defined PCAP_DONT_INCLUDE_PCAP_BPF_H
  53. #include <@INCLUDE_PCAP_BPF_HEADER@>
  54. #define PCAP_DONT_INCLUDE_PCAP_BPF_H 1 /* don't re-include it in pcap.h */
  55. #endif
  56. #include <@LPCAPINC@>
  57. /* include our own strlcat/strlcpy? */
  58. #ifndef HAVE_STRLCPY
  59. #include <lib/strlcpy.h>
  60. #endif
  61. /*
  62. * net/bpf.h doesn't include DLT types, but pcap-bpf.h does.
  63. * Unfortunately, pcap-bpf.h also includes things in net/bpf.h
  64. * while also missing some key things (wow, that sucks)
  65. * The result is that I stole the DLT types from pcap-bpf.h and
  66. * put them in here.
  67. */
  68. #include <common/dlt_names.h>
  69. #ifdef HAVE_BOOL_H
  70. #include <bool.h>
  71. #endif
  72. #ifdef HAVE_STDBOOL_H
  73. #include <stdbool.h>
  74. #endif
  75. /* should packet counters be 32 or 64 bit? --enable-64bit */
  76. #ifdef ENABLE_64BITS
  77. #define COUNTER unsigned long long
  78. #define COUNTER_SPEC "%llu"
  79. #else
  80. #define COUNTER unsigned long
  81. #define COUNTER_SPEC "%lu"
  82. #endif
  83. #define COUNTER_OVERFLOW_RISK (((COUNTER)~0) >> 23)
  84. #include <common/cidr.h>
  85. #include <common/list.h>
  86. typedef struct tcpr_ipv4_hdr ipv4_hdr_t;
  87. typedef struct tcpr_ipv6_hdr ipv6_hdr_t;
  88. typedef struct tcpr_tcp_hdr tcp_hdr_t;
  89. typedef struct tcpr_udp_hdr udp_hdr_t;
  90. typedef struct tcpr_icmpv4_hdr icmpv4_hdr_t;
  91. typedef struct tcpr_icmpv6_hdr icmpv6_hdr_t;
  92. typedef struct tcpr_ethernet_hdr eth_hdr_t;
  93. typedef struct tcpr_802_1q_hdr vlan_hdr_t;
  94. typedef struct sll_header sll_hdr_t;
  95. typedef struct sll2_header sll2_hdr_t;
  96. typedef struct tcpr_arp_hdr arp_hdr_t;
  97. typedef struct tcpr_dnsv4_hdr dnsv4_hdr_t;
  98. /* our custom typdefs/structs */
  99. typedef u_char tcpr_macaddr_t[TCPR_ETH_H];
  100. typedef struct tcpr_bpf_s {
  101. char *filter;
  102. int optimize;
  103. struct bpf_program program;
  104. } tcpr_bpf_t;
  105. typedef struct tcpr_xX_s {
  106. #define xX_MODE_INCLUDE 'x'
  107. #define xX_MODE_EXCLUDE 'X'
  108. int mode;
  109. tcpr_list_t *list;
  110. tcpr_cidr_t *cidr;
  111. #define xX_TYPE_LIST 1
  112. #define xX_TYPE_CIDR 2
  113. int type;
  114. } tcpr_xX_t;
  115. /* number of ports 0-65535 */
  116. #define NUM_PORTS 65536
  117. typedef struct tcpr_services_s {
  118. char tcp[NUM_PORTS];
  119. char udp[NUM_PORTS];
  120. } tcpr_services_t;
  121. typedef struct tcpr_speed_s {
  122. /* speed modifiers */
  123. int mode;
  124. #define SPEED_MULTIPLIER 1
  125. #define SPEED_MBPSRATE 2
  126. #define SPEED_PACKETRATE 3
  127. #define SPEED_TOPSPEED 4
  128. #define SPEED_ONEATATIME 5
  129. COUNTER speed;
  130. float multiplier;
  131. int pps_multi;
  132. } tcpr_speed_t;
  133. #define MAX_FILES 1024 /* Max number of files we can pass to tcpreplay */
  134. /* Max Transmission Unit of standard ethernet don't forget *frames* are MTU + L2 header! */
  135. #define DEFAULT_MTU 1500
  136. /* tell libpcap to capture the entire packet
  137. * this is the maximum size supported by libpcap
  138. * (https://github.com/the-tcpdump-group/libpcap/blob/master/pcap-int.h#L99-L125)
  139. */
  140. #define MAX_SNAPLEN 262144
  141. /* snap length plus some room for adding a
  142. * couple VLAN headers or a L2 header
  143. */
  144. #define MAXPACKET (MAX_SNAPLEN + 22)
  145. #define PACKET_HEADROOM 512 /* additional headroom allocated for packets to accommodate editing */
  146. #define DNS_RESOLVE 1
  147. #define DNS_DONT_RESOLVE 0
  148. #define RESOLVE 0 /* disable dns lookups */
  149. #define BPF_OPTIMIZE 1 /* default is to optimize bpf program */
  150. #define PCAP_TIMEOUT 100 /* 100ms pcap_open_live timeout */
  151. #define DEFAULT_FUZZ_FACTOR 8
  152. /* HP-UX already defines TRUE/FALSE */
  153. #ifndef TRUE
  154. typedef enum bool_e { FALSE = 0, TRUE } bool_t;
  155. #endif
  156. #define EBUF_SIZE 1024 /* size of our error buffers */
  157. #define MAC_SIZE 7 /* size of the mac[] buffer */
  158. typedef enum pad_e { PAD_PACKET, TRUNC_PACKET } pad_t;
  159. #define DNS_QUERY_FLAG 0x8000
  160. typedef enum direction_e { DIR_UNKNOWN = -1, DIR_CLIENT = 0, DIR_SERVER = 1, DIR_ANY = 2 } direction_t;
  161. typedef enum tcpprep_mode_e {
  162. ERROR_MODE, /* Some kind of error has occurred */
  163. CIDR_MODE, /* single pass, CIDR netblock */
  164. REGEX_MODE, /* single pass, regex */
  165. PORT_MODE, /* single pass, use src/dst ports to split */
  166. MAC_MODE, /* single pass, use src mac to split */
  167. FIRST_MODE, /* single pass, use first seen to split */
  168. AUTO_MODE, /* first pass through in auto mode */
  169. ROUTER_MODE, /* second pass through in router mode */
  170. BRIDGE_MODE, /* second pass through in bridge mode */
  171. SERVER_MODE, /* second pass through in server (router) mode */
  172. CLIENT_MODE /* second pass through in client (router) mode */
  173. } tcpprep_mode_t;
  174. #define BROADCAST_MAC "\xff\xff\xff\xff\xff\xff"
  175. #define IPV4_MULTICAST_MAC "\x01\x00\x5e\x00\x00\x00"
  176. #define IPV6_MULTICAST_MAC "\x33\x33\x00\x00\x00\x00"
  177. #define IPV4_VRRP "\x00\x00\x50\x00\x01\x00"
  178. #define IPV6_VRRP "\x00\x00\x50\x00\x02\x00"
  179. /* MAC macros for printf */
  180. #define MAC_FORMAT "%02X:%02X:%02X:%02X:%02X:%02X"
  181. #define MAC_STR(x) x[0], x[1], x[2], x[3], x[4], x[5]
  182. /* struct timeval print structs */
  183. #ifdef HAVE_DARWIN
  184. /* Darwin defines usec as an __int32_t, not unsigned long. */
  185. #define TIMEVAL_FORMAT "%lus %dusec"
  186. #else
  187. #define TIMEVAL_FORMAT "%lus %luusec"
  188. #endif
  189. #define TIMESPEC_FORMAT "%lus %lunsec"
  190. /* force a word or half-word swap on both Big and Little endian systems */
  191. #ifndef SWAPLONG
  192. #define SWAPLONG(y) ((((y)&0xff) << 24) | (((y)&0xff00) << 8) | (((y)&0xff0000) >> 8) | (((y) >> 24) & 0xff))
  193. #endif
  194. #ifndef SWAPSHORT
  195. #define SWAPSHORT(y) ((((y)&0xff) << 8) | ((u_short)((y)&0xff00) >> 8))
  196. #endif
  197. /* converts a 64bit int to network byte order */
  198. #if !defined ntohll && !defined htonll
  199. #ifndef HAVE_NTOHLL
  200. #ifdef WORDS_BIGENDIAN
  201. #define ntohll(x) (x)
  202. #define htonll(x) (x)
  203. #else
  204. /* stolen from http://www.codeproject.com/cpp/endianness.asp */
  205. #define ntohll(x) (((u_int64_t)(ntohl((int)((x << 32) >> 32))) << 32) | (unsigned int)ntohl(((int)(x >> 32))))
  206. #define htonll(x) ntohll(x)
  207. #endif /* WORDS_BIGENDIAN */
  208. #endif /* HAVE_NTOHLL */
  209. #endif /* !ntohll && !htonll */
  210. #define DEBUG_INFO 1 /* informational only, lessthan 1 line per packet */
  211. #define DEBUG_BASIC 2 /* limited debugging, one line per packet */
  212. #define DEBUG_DETAIL 3 /* more detailed, a few lines per packet */
  213. #define DEBUG_MORE 4 /* even more detail */
  214. #define DEBUG_CODE 5 /* examines code & values, many lines per packet */
  215. #if defined HAVE_IOPERM && defined __i386_
  216. #define HAVE_IOPORT_SLEEP
  217. #endif
  218. /* Win32 doesn't know about PF_INET6 */
  219. #ifndef PF_INET6
  220. #ifdef AF_INET6
  221. #define PF_INET6 AF_INET6
  222. #else
  223. #define PF_INET6 30 /* stolen from OS/X */
  224. #endif
  225. #endif
  226. /* convert IPv6 Extension Header Len value to bytes */
  227. #define IPV6_EXTLEN_TO_BYTES(x) ((x * 4) + 8)
  228. #ifndef HAVE_UINT8_T
  229. typedef u_int8_t uint8_t typedef u_int16_t uint16_t typedef u_int32_t uint32_t
  230. #endif
  231. /* Support for flexible arrays. */
  232. #undef __flexarr
  233. #if defined(__GNUC__) && ((__GNUC__ > 2) || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97))
  234. /* GCC 2.97 supports C99 flexible array members. */
  235. #define __flexarr []
  236. #else
  237. #ifdef __GNUC__
  238. #define __flexarr [0]
  239. #else
  240. #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
  241. #define __flexarr []
  242. #elif defined(_WIN32)
  243. /* MS VC++ */
  244. #define __flexarr []
  245. #else
  246. /* Some other non-C99 compiler. Approximate with [1]. */
  247. #define __flexarr [1]
  248. #endif
  249. #endif
  250. #endif
  251. /* Time converters */
  252. #define SEC_TO_MILLISEC(x) (x * 1000)
  253. #define SEC_TO_MICROSEC(x) (x * 1000000)
  254. #define SEC_TO_NANOSEC(x) ((u_int64_t)x * 1000000000)
  255. #define MILLISEC_TO_SEC(x) (x / 1000)
  256. #define MICROSEC_TO_SEC(x) (x / 1000000)
  257. #define NANOSEC_TO_SEC(x) ((u_int64_t)x / 1000000000)
  258. #define TIMEVAL_TO_MILLISEC(x) (((x)->tv_sec * 1000) + ((x)->tv_usec / 1000))
  259. #define TIMEVAL_TO_MICROSEC(x) (((x)->tv_sec * 1000000) + (x)->tv_usec)
  260. #define TIMEVAL_TO_NANOSEC(x) ((u_int64_t)((x)->tv_sec * 1000000000) + ((u_int64_t)(x)->tv_usec * 1000))
  261. #define MILLISEC_TO_TIMEVAL(x, tv) \
  262. do { \
  263. (tv)->tv_sec = (x) / 1000; \
  264. (tv)->tv_usec = (x * 1000) - ((tv)->tv_sec * 1000000); \
  265. } while (0)
  266. #define MICROSEC_TO_TIMEVAL(x, tv) \
  267. do { \
  268. (tv)->tv_sec = (x) / 1000000; \
  269. (tv)->tv_usec = (x) - ((tv)->tv_sec * 1000000); \
  270. } while (0)
  271. #define NANOSEC_TO_TIMEVAL(x, tv) \
  272. do { \
  273. (tv)->tv_sec = (x) / 1000000000; \
  274. (tv)->tv_usec = ((x) % 1000000000) / 1000; \
  275. } while (0)
  276. #define NANOSEC_TO_TIMESPEC(x, ts) \
  277. do { \
  278. (ts)->tv_sec = (x) / 1000000000; \
  279. (ts)->tv_nsec = (x) % 1000000000; \
  280. } while (0)
  281. #define TIMESPEC_TO_MILLISEC(x) (((x)->tv_sec * 1000) + ((x)->tv_nsec / 1000000))
  282. #define TIMESPEC_TO_MICROSEC(x) (((x)->tv_sec * 1000000) + (x)->tv_nsec / 1000)
  283. #define TIMESPEC_TO_NANOSEC(x) ((u_int64_t)((x)->tv_sec * 1000000000) + ((u_int64_t)(x)->tv_nsec))
  284. #define TIMEVAL_SET(a, b) \
  285. do { \
  286. (a)->tv_sec = (b)->tv_sec; \
  287. (a)->tv_usec = (b)->tv_usec; \
  288. } while (0)
  289. #define TIMESPEC_SET(a, b) \
  290. do { \
  291. (a)->tv_sec = (b)->tv_sec; \
  292. (a)->tv_nsec = (b)->tv_nsec; \
  293. } while (0)
  294. /* libpcap that supports it, puts nanosecond values in tv_usec when pcap file is read with nanosec precision,
  295. * and so tv_usec is directly copied to tv_nsec.
  296. * But older versions do that do not support nanosecond precision need to multiply tv_usec by 1000 to convert
  297. * to tv_nsec.
  298. */
  299. #define PCAP_TIMEVAL_TO_TIMESPEC_SET(a, b) \
  300. do { \
  301. (b)->tv_sec = (a)->tv_sec; \
  302. (b)->tv_nsec = (a)->tv_usec * PCAP_TSTAMP_US_TO_NS_MULTIPLIER; \
  303. } while(0)
  304. #define PCAP_TIMEVAL_TO_TIMEVAL_SET(a, b) \
  305. do { \
  306. (b)->tv_sec = (a)->tv_sec; \
  307. (b)->tv_usec = (a)->tv_usec / PCAP_TSTAMP_US_TO_US_DIVISOR; \
  308. } while(0)
  309. /*
  310. * Help suppress some compiler warnings
  311. * No problem if variable is actually used
  312. */
  313. #ifdef UNUSED
  314. #elif defined(__GNUC__)
  315. #define UNUSED(x) x __attribute__((unused))
  316. #elif defined(__LCLINT__)
  317. #define UNUSED(x) /*@unused@*/ x
  318. #else
  319. #define UNUSED(x) x
  320. #endif
  321. #ifndef max
  322. #define max(a, b) \
  323. ({ \
  324. __typeof__(a) _a = (a); \
  325. __typeof__(b) _b = (b); \
  326. _a > _b ? _a : _b; \
  327. })
  328. #endif
  329. #ifndef min
  330. #define min(a, b) \
  331. ({ \
  332. __typeof__(a) _a = (a); \
  333. __typeof__(b) _b = (b); \
  334. _a > _b ? _b : _a; \
  335. })
  336. #endif