diff --git a/Makefile b/Makefile index 1970b0b..2cf87ef 100644 --- a/Makefile +++ b/Makefile @@ -69,7 +69,7 @@ libbpf: # Build and install the Packet Batch common submodule (this includes libyaml). common: $(MAKE) -C $(COMMON_DIR)/ - + common_install: $(MAKE) -C $(COMMON_DIR)/ install diff --git a/src/af_xdp.c b/src/af_xdp.c index 0ed01c2..9ccf4c8 100644 --- a/src/af_xdp.c +++ b/src/af_xdp.c @@ -1,26 +1,11 @@ -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include -#include - #include "af_xdp.h" /* Global variables */ // The XDP flags to load the AF_XDP/XSK sockets with. -__u32 xdp_flags = XDP_FLAGS_DRV_MODE; -__u32 bind_flags = XDP_USE_NEED_WAKEUP; +u32 xdp_flags = XDP_FLAGS_DRV_MODE; +u32 bind_flags = XDP_USE_NEED_WAKEUP; int is_shared_umem = 0; -__u16 batch_size = 1; +u16 batch_size = 1; int static_queue_id = 0; int queue_id = 0; @@ -28,7 +13,7 @@ int queue_id = 0; static unsigned int global_frame_idx = 0; // Pointers to the umem and XSK sockets for each thread. -struct xsk_umem_info *shared_umem = NULL; +xsk_umem_info_t *shared_umem = NULL; /** * Completes the TX call via a syscall and also checks if we need to free the TX buffer. @@ -37,7 +22,7 @@ struct xsk_umem_info *shared_umem = NULL; * * @return Void **/ -static void complete_tx(struct xsk_socket_info *xsk) +static void complete_tx(xsk_socket_info_t *xsk) { // Initiate starting variables (completed amount and completion ring index). unsigned int completed; @@ -75,10 +60,10 @@ static void complete_tx(struct xsk_socket_info *xsk) * * @return Returns a pointer to the UMEM area instead of the XSK UMEM information structure (struct xsk_umem_info). **/ -static struct xsk_umem_info *configure_xsk_umem(void *buffer, __u64 size) +static xsk_umem_info_t *configure_xsk_umem(void *buffer, u64 size) { // Create umem pointer and return variable. - struct xsk_umem_info *umem; + xsk_umem_info_t *umem; int ret; // Allocate memory space to the umem pointer and check. @@ -115,12 +100,12 @@ static struct xsk_umem_info *configure_xsk_umem(void *buffer, __u64 size) * * @return Returns a pointer to the AF_XDP/XSK socket inside of a the XSK socket info structure (struct xsk_socket_info). **/ -static struct xsk_socket_info *xsk_configure_socket(struct xsk_umem_info *umem, int queue_id, const char *dev) +static xsk_socket_info_t *xsk_configure_socket(xsk_umem_info_t *umem, int queue_id, const char *dev) { // Initialize starting variables. struct xsk_socket_config xsk_cfg; struct xsk_socket_info *xsk_info; - __u32 idx; + u32 idx; int i; int ret; @@ -190,10 +175,10 @@ static struct xsk_socket_info *xsk_configure_socket(struct xsk_umem_info *umem, * * @return Returns 0 on success and -1 on failure. **/ -int send_packet(struct xsk_socket_info *xsk, int thread_id, void *pckt, __u16 length, __u8 verbose) +int send_packet(xsk_socket_info_t *xsk, int thread_id, void *pckt, u16 length, u8 verbose) { // This represents the TX index. - __u32 tx_idx = 0; + u32 tx_idx = 0; // Retrieve the TX index from the TX ring to fill. while (xsk_ring_prod__reserve(&xsk->tx, batch_size, &tx_idx) < batch_size) @@ -223,7 +208,7 @@ int send_packet(struct xsk_socket_info *xsk, int thread_id, void *pckt, __u16 le } // We must retrieve the next available address in the UMEM. - __u64 addrat = get_umem_addr(xsk, idx); + u64 addrat = get_umem_addr(xsk, idx); // We must copy our packet data to the UMEM area at the specific index (idx * frame size). We did this earlier. memcpy(get_umem_loc(xsk, addrat), pckt, length); @@ -262,7 +247,7 @@ int send_packet(struct xsk_socket_info *xsk, int thread_id, void *pckt, __u16 le * * @return The socket FD (-1 on failure) */ -int get_socket_fd(struct xsk_socket_info *xsk) +int get_socket_fd(xsk_socket_info_t *xsk) { return xsk_socket__fd(xsk->xsk); } @@ -275,7 +260,7 @@ int get_socket_fd(struct xsk_socket_info *xsk) * * @return 64-bit address of location. **/ -__u64 get_umem_addr(struct xsk_socket_info *xsk, int idx) +u64 get_umem_addr(xsk_socket_info_t *xsk, int idx) { return xsk->umem_frame_addr[idx]; } @@ -288,7 +273,7 @@ __u64 get_umem_addr(struct xsk_socket_info *xsk, int idx) * * @return Pointer to address in memory of UMEM. **/ -void *get_umem_loc(struct xsk_socket_info *xsk, __u64 addr) +void *get_umem_loc(xsk_socket_info_t *xsk, u64 addr) { return xsk_umem__get_data(xsk->umem->buffer, addr); } @@ -301,7 +286,7 @@ void *get_umem_loc(struct xsk_socket_info *xsk, __u64 addr) * * @return Void **/ -void setup_af_xdp_variables(struct cmd_line_af_xdp *cmd_af_xdp, int verbose) +void setup_af_xdp_variables(cmd_line_af_xdp_t *cmd_af_xdp, int verbose) { // Check for zero-copy or copy modes. if (cmd_af_xdp->zero_copy) @@ -386,11 +371,11 @@ void setup_af_xdp_variables(struct cmd_line_af_xdp *cmd_af_xdp, int verbose) * * @return 0 on success and -1 on failure. **/ -struct xsk_umem_info *setup_umem(int thread_id) +xsk_umem_info_t *setup_umem(int thread_id) { // This indicates the buffer for frames and frame size for the UMEM area. void *frame_buffer; - __u64 frame_buffer_size = NUM_FRAMES * FRAME_SIZE; + u64 frame_buffer_size = NUM_FRAMES * FRAME_SIZE; // Allocate blank memory space for the UMEM (aligned in chunks). Check as well. if (posix_memalign(&frame_buffer, getpagesize(), frame_buffer_size)) @@ -412,7 +397,7 @@ struct xsk_umem_info *setup_umem(int thread_id) * * @return Returns the AF_XDP's socket FD or -1 on failure. **/ -struct xsk_socket_info* setup_socket(const char *dev, __u16 thread_id, int verbose) +xsk_socket_info_t *setup_socket(const char *dev, u16 thread_id, int verbose) { // Verbose message. if (verbose) @@ -421,7 +406,7 @@ struct xsk_socket_info* setup_socket(const char *dev, __u16 thread_id, int verbo } // Configure and create the AF_XDP/XSK socket. - struct xsk_umem_info *umem; + xsk_umem_info_t *umem; // Check for shared UMEM. if (is_shared_umem) @@ -455,7 +440,7 @@ struct xsk_socket_info* setup_socket(const char *dev, __u16 thread_id, int verbo return NULL; } - struct xsk_socket_info *xsk = xsk_configure_socket(umem, (static_queue_id) ? queue_id : thread_id, (const char *)dev); + xsk_socket_info_t *xsk = xsk_configure_socket(umem, (static_queue_id) ? queue_id : thread_id, (const char *)dev); // Check to make sure it's valid. if (xsk == NULL) @@ -484,7 +469,7 @@ struct xsk_socket_info* setup_socket(const char *dev, __u16 thread_id, int verbo * * @return Void **/ -void cleanup_socket(struct xsk_socket_info *xsk) +void cleanup_socket(xsk_socket_info_t *xsk) { // If the AF_XDP/XSK socket isn't NULL, delete it. if (xsk->xsk != NULL) diff --git a/src/af_xdp.h b/src/af_xdp.h index fd0b897..d1209c1 100644 --- a/src/af_xdp.h +++ b/src/af_xdp.h @@ -1,8 +1,22 @@ #pragma once -#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include + #include +#include + #include "cmd_line.h" #define MAX_CPUS 256 @@ -11,42 +25,42 @@ #define INVALID_UMEM_FRAME UINT64_MAX //#define DEBUG -struct xsk_umem_info +typedef struct xsk_umem_info { struct xsk_ring_prod fq; struct xsk_ring_cons cq; struct xsk_umem *umem; void *buffer; -}; +} xsk_umem_info_t; -struct xsk_socket +typedef struct xsk_socket { struct xsk_ring_cons *rx; struct xsk_ring_prod *tx; - __u64 outstanding_tx; + u64 outstanding_tx; struct xsk_ctx *ctx; struct xsk_socket_config config; int fd; -}; +} xsk_socket_t; -struct xsk_socket_info +typedef struct xsk_socket_info { struct xsk_ring_cons rx; struct xsk_ring_prod tx; struct xsk_umem_info *umem; struct xsk_socket *xsk; - __u64 umem_frame_addr[NUM_FRAMES]; - __u32 umem_frame_free; + u64 umem_frame_addr[NUM_FRAMES]; + u32 umem_frame_free; - __u32 outstanding_tx; -}; + u32 outstanding_tx; +} xsk_socket_info_t; -int send_packet(struct xsk_socket_info *xsk, int thread_id, void *pckt, __u16 length, __u8 verbose); -__u64 get_umem_addr(struct xsk_socket_info *xsk, int idx); -void *get_umem_loc(struct xsk_socket_info *xsk, __u64 addr); +int send_packet(struct xsk_socket_info *xsk, int thread_id, void *pckt, u16 length, u8 verbose); +u64 get_umem_addr(struct xsk_socket_info *xsk, int idx); +void *get_umem_loc(struct xsk_socket_info *xsk, u64 addr); void setup_af_xdp_variables(struct cmd_line_af_xdp *cmd_af_xdp, int verbose); struct xsk_umem_info *setup_umem(int index); -struct xsk_socket_info *setup_socket(const char *dev, __u16 thread_id, int verbose); +struct xsk_socket_info *setup_socket(const char *dev, u16 thread_id, int verbose); void cleanup_socket(struct xsk_socket_info *xsk); int get_socket_fd(struct xsk_socket_info *xsk); \ No newline at end of file diff --git a/src/cmd_line.c b/src/cmd_line.c index a5b9d59..119015d 100644 --- a/src/cmd_line.c +++ b/src/cmd_line.c @@ -1,7 +1,3 @@ -#include -#include -#include - #include "cmd_line.h" static const struct option long_opts[] = @@ -25,7 +21,7 @@ static const struct option long_opts[] = * * @return Void **/ -void parse_cmd_line_af_xdp(struct cmd_line_af_xdp *cmd_af_xdp, int argc, char **argv) +void parse_cmd_line_af_xdp(cmd_line_af_xdp_t *cmd_af_xdp, int argc, char **argv) { int c = -1; diff --git a/src/cmd_line.h b/src/cmd_line.h index 4255478..e0d79cf 100644 --- a/src/cmd_line.h +++ b/src/cmd_line.h @@ -1,6 +1,10 @@ #pragma once -struct cmd_line_af_xdp +#include +#include +#include + +typedef struct cmd_line_af_xdp { unsigned int queue_set : 1; int queue; @@ -11,6 +15,6 @@ struct cmd_line_af_xdp unsigned int skb_mode : 1; unsigned int zero_copy : 1; unsigned int copy : 1; -}; +} cmd_line_af_xdp_t; void parse_cmd_line_af_xdp(struct cmd_line_af_xdp *cmd_af_xdp, int argc, char **argv); \ No newline at end of file diff --git a/src/main.c b/src/main.c index 69a173e..ac2b62b 100644 --- a/src/main.c +++ b/src/main.c @@ -1,19 +1,3 @@ -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include "sequence.h" -#include "cmd_line.h" -#include "af_xdp.h" #include "main.h" struct config *cfg = NULL; @@ -90,7 +74,7 @@ int main(int argc, char *argv[]) } // Attempt to parse config. - __u8 log = 1; + u8 log = 1; if (cmd.cli) { diff --git a/src/main.h b/src/main.h index c257c81..c3a4682 100644 --- a/src/main.h +++ b/src/main.h @@ -1,5 +1,20 @@ #pragma once -#define MAX_NAME_LEN 64 +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "sequence.h" +#include "cmd_line.h" +#include "af_xdp.h" extern int errno; \ No newline at end of file diff --git a/src/sequence.c b/src/sequence.c index ad23cec..cdc6e59 100644 --- a/src/sequence.c +++ b/src/sequence.c @@ -1,33 +1,4 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - #include "sequence.h" -#include "af_xdp.h" #include @@ -35,18 +6,18 @@ pthread_t threads[MAX_THREADS]; int thread_cnt = 0; // Total counters. -__u64 total_bytes[MAX_SEQUENCES] = {0}; -__u64 total_pckts[MAX_SEQUENCES] = {0}; +u64 total_bytes[MAX_SEQUENCES] = {0}; +u64 total_pckts[MAX_SEQUENCES] = {0}; // Per second counters and variables. time_t last_updated[MAX_SEQUENCES] = {0}; -__u64 cur_pps[MAX_SEQUENCES] = {0}; -__u64 cur_bps[MAX_SEQUENCES] = {0}; +u64 cur_pps[MAX_SEQUENCES] = {0}; +u64 cur_bps[MAX_SEQUENCES] = {0}; time_t start_time[MAX_SEQUENCES] = {0}; time_t end_time[MAX_SEQUENCES] = {0}; -__u16 seq_cnt; +u16 seq_cnt; /** * The thread handler for sending/receiving. @@ -58,27 +29,27 @@ __u16 seq_cnt; void *thread_hdl(void *temp) { // Cast data as thread info. - struct thread_info *ti = (struct thread_info *)temp; + thread_info_t *ti = (thread_info_t *)temp; // Get human-friendly sequence ID (id + 1). int seq_num = ti->seq_cnt + 1; // Let's parse some config values before creating the socket so we know what we're doing. - __u8 protocol = IPPROTO_UDP; - __u8 src_mac[ETH_ALEN] = {0}; - __u8 dst_mac[ETH_ALEN] = {0}; - __u16 data_len[MAX_PAYLOADS] = {0}; - __u16 pckt_len[MAX_PAYLOADS] = {0}; + u8 protocol = IPPROTO_UDP; + u8 src_mac[ETH_ALEN] = {0}; + u8 dst_mac[ETH_ALEN] = {0}; + u16 data_len[MAX_PAYLOADS] = {0}; + u16 pckt_len[MAX_PAYLOADS] = {0}; // Payloads. - __u8 **payloads; - payloads = malloc(MAX_PAYLOADS * sizeof(__u8 *)); + u8 **payloads; + payloads = malloc(MAX_PAYLOADS * sizeof(u8 *)); if (payloads != NULL) { for (int i = 0; i < MAX_PAYLOADS; i++) { - payloads[i] = malloc(MAX_PCKT_LEN * sizeof(__u8)); + payloads[i] = malloc(MAX_PCKT_LEN * sizeof(u8)); } } else @@ -114,7 +85,7 @@ void *thread_hdl(void *temp) int sock_fd; // Create AF_XDP socket and check. - struct xsk_socket_info *xsk = setup_socket(ti->device, ti->id, ti->cmd.verbose); + xsk_socket_info_t *xsk = setup_socket(ti->device, ti->id, ti->cmd.verbose); sock_fd = get_socket_fd(xsk); @@ -151,7 +122,7 @@ void *thread_hdl(void *temp) if (dst_mac[0] == 0 && dst_mac[1] == 0 && dst_mac[2] == 0 && dst_mac[3] == 0 && dst_mac[4] == 0 && dst_mac[5] == 0) { // Retrieve the default gateway's MAC address and store it in dst_mac. - get_gw_mac((__u8 *) &dst_mac); + get_gw_mac((u8 *) &dst_mac); } if (ti->cmd.verbose) @@ -167,7 +138,7 @@ void *thread_hdl(void *temp) char buffer[MAX_PCKT_LEN]; // Common packet characteristics. - __u8 l4_len; + u8 l4_len; // Source IP string for a random-generated IP address. char s_ip[32]; @@ -289,7 +260,7 @@ void *thread_hdl(void *temp) for (int i = 0; i < ti->seq.pl_cnt; i++) { struct payload_opt *pl = &ti->seq.pls[i]; - __u8 *pl_buff = payloads[i]; + u8 *pl_buff = payloads[i]; if (pl->exact != NULL) { @@ -301,7 +272,7 @@ void *thread_hdl(void *temp) if (pl->is_file) { FILE *fp = fopen(pl->exact, "rb"); - __u64 len = 0; + u64 len = 0; // Check if our file is invalid. If so, print error and set empty payload string. if (fp == NULL) @@ -371,7 +342,7 @@ void *thread_hdl(void *temp) pckt_len[i] = sizeof(struct ethhdr) + (iph->ihl * 4) + l4_len + data_len[i]; // Fill out payload with random characters. - for (__u16 i = 0; i < data_len[i]; i++) + for (u16 i = 0; i < data_len[i]; i++) { *(pl_buff + i) = rand_r(&seed); } @@ -479,7 +450,7 @@ void *thread_hdl(void *temp) // Check if there are ranges. if (ti->seq.ip.range_count > 0) { - __u16 ran = rand_num(0, (ti->seq.ip.range_count - 1), seed); + u16 ran = rand_num(0, (ti->seq.ip.range_count - 1), seed); // Ensure this range is valid. if (ti->seq.ip.ranges[ran] != NULL) @@ -571,7 +542,7 @@ void *thread_hdl(void *temp) pckt_len[i] = sizeof(struct ethhdr) + (iph->ihl * 4) + l4_len + data_len[i]; // Fill out payload with random characters. - for (__u16 i = 0; i < data_len[i]; i++) + for (u16 i = 0; i < data_len[i]; i++) { *(data + i) = rand_r(&seed); } @@ -609,7 +580,7 @@ void *thread_hdl(void *temp) if (ti->seq.l4_csum) { icmph->checksum = 0; - icmph->checksum = icmp_csum((__u16 *)icmph, l4_len + data_len[i]); + icmph->checksum = icmp_csum((u16 *)icmph, l4_len + data_len[i]); } break; @@ -635,8 +606,8 @@ void *thread_hdl(void *temp) if (ti->cmd.verbose && ret == 0) { // Retrieve source and destination ports for UDP/TCP protocols. - __u16 srcport = 0; - __u16 dstport = 0; + u16 srcport = 0; + u16 dstport = 0; if (protocol == IPPROTO_UDP) { @@ -731,7 +702,7 @@ void *thread_hdl(void *temp) * * @return Void **/ -void seq_send(const char *interface, struct sequence seq, __u16 seq_cnt2, struct cmd_line cmd) +void seq_send(const char *interface, struct sequence seq, u16 seq_cnt2, struct cmd_line cmd) { // First, let's check if the destination IP is set. if (seq.ip.dst_ip == NULL) @@ -742,7 +713,7 @@ void seq_send(const char *interface, struct sequence seq, __u16 seq_cnt2, struct } // Create new thread_info structure to pass to threads. - struct thread_info ti = {0}; + thread_info_t ti = {0}; // Assign correct values to thread info. strcpy((char *)&ti.device, interface); @@ -767,8 +738,8 @@ void seq_send(const char *interface, struct sequence seq, __u16 seq_cnt2, struct ti.id = i; // Create a duplicate of thread info structure to send to each thread. - struct thread_info *ti_dup = malloc(sizeof(struct thread_info)); - memcpy(ti_dup, &ti, sizeof(struct thread_info)); + thread_info_t *ti_dup = malloc(sizeof(thread_info_t)); + memcpy(ti_dup, &ti, sizeof(thread_info_t)); pthread_create(&threads[thread_cnt], NULL, thread_hdl, (void *)ti_dup); @@ -821,8 +792,8 @@ void shutdown_prog(struct config *cfg) } // Calculate average per-second stats. - __u64 pps = total_pckts[i] > 0 ? total_pckts[i] / total_secs : 0; - __u64 bps = total_bytes[i] > 0 ? total_bytes[i] / total_secs : 0; + u64 pps = total_pckts[i] > 0 ? total_pckts[i] / total_secs : 0; + u64 bps = total_bytes[i] > 0 ? total_bytes[i] / total_secs : 0; fprintf(stdout, "[%d] Completed sequence with a total of %llu packets and %llu bytes. Average PPS => %llu. Average BPS => %llu. Total seconds => %ld.\n", i + 1, total_pckts[i], total_bytes[i], pps, bps, total_secs); } diff --git a/src/sequence.h b/src/sequence.h index 65879ea..e439471 100644 --- a/src/sequence.h +++ b/src/sequence.h @@ -1,25 +1,51 @@ #pragma once -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include #include +#include #include "cmd_line.h" +#include "af_xdp.h" #include "main.h" #define MAX_PCKT_LEN 0xFFFF #define MAX_THREADS 4096 +#define MAX_NAME_LEN 64 -struct thread_info +typedef struct thread_info { const char device[MAX_NAME_LEN]; struct sequence seq; - __u16 seq_cnt; + u16 seq_cnt; struct cmd_line cmd; int id; struct xsk_socket_info *xsk_info; -}; +} thread_info_t; -void seq_send(const char *interface, struct sequence seq, __u16 seqc, struct cmd_line cmd); +void seq_send(const char *interface, struct sequence seq, u16 seqc, struct cmd_line cmd); void shutdown_prog(struct config *cfg); \ No newline at end of file