/** * cork(): Cork socket to CORK_SIZE bytes. */ static inline void cork(int s) { int rc, one = 1; rc = is_xia ? setsockopt(s, get_xdp_type(), XDP_CORK, &one, sizeof(int)): setsockopt(s, IPPROTO_UDP, UDP_CORK, &one, sizeof(int)); assert(!rc); }
/** * uncork(): Uncork socket. */ static inline void uncork(int s) { int rc, zero = 0; rc = is_xia ? setsockopt(s, get_xdp_type(), XDP_CORK, &zero, sizeof(int)): setsockopt(s, IPPROTO_UDP, UDP_CORK, &zero, sizeof(int)); assert(!rc); }
int main(int argc, char *argv[]) { struct sockaddr *srv, *cli; int s, srv_len, cli_len, rc; unsigned int fr; __u16 padding; if (check_srv_params(argc, argv)) exit(1); s = socket(AF_XIA, SOCK_DGRAM, get_xdp_type()); if (s < 0) { int orig_errno = errno; fprintf(stderr, "Cannot create XDP socket: %s\n", strerror(orig_errno)); return 1; } srv = get_addr(argv[1], &srv_len); assert(srv); assert(!bind(s, srv, srv_len)); cli = get_addr(argv[2], &cli_len); assert(cli); /* Read padding amount. */ rc = sscanf(argv[4], "%hd", &padding); if (errno != 0) { fprintf(stderr, "%s: sscanf errno=%i: %s\n", __func__, errno, strerror(errno)); return 1; } else if (rc != 1) { fprintf(stderr, "No padding data exists.\n"); return 1; } rc = sscanf(argv[5], "%d", &fr); if (errno != 0) { fprintf(stderr, "%s: sscanf errno=%i: %s\n", __func__, errno, strerror(errno)); return 1; } else if (rc != 1) { fprintf(stderr, "No failure rate exists.\n"); return 1; } if (fr > 100) { fprintf(stderr, "Failure rate must be between 0 and 100.\n"); return 1; } spray(s, cli, cli_len, argv[3], padding, fr); fprintf(stderr, "File sent.\n"); free(cli); free(srv); assert(!close(s)); return 0; }