int socket_send(void *udevice, hostinfo_t **remotes, packet_layers_t *packet, u_int *errors) { socket_output_t *device = (socket_output_t *)udevice; hostinfo_t **host; hostinfo_t *curhost; packet_layers_t *new_packet; char *data; u_int size; int i; i = 0; new_packet = NULL; data = (char *)packet->data; size = packet->data_size; if (device->raw) { new_packet = build_udp_packet( NULL, NULL, 0, 0, device->port_src, device->port_dst, packet->data, packet->data_size); data = (char *)new_packet->udp; size = new_packet->udp_size + new_packet->data_size; } host = (hostinfo_t **)remotes; while ((curhost = *host)) { if (sendto(device->output, data, size, 0, (struct sockaddr*)&curhost->sin, sizeof(struct sockaddr_in)) != SOCKET_ERROR) i++; else *errors += 1; host++; } if (new_packet) free(new_packet); return i; //device-> }
int main(int argc, char **argv) { int vmefd; char cmd[sizeof(IFCONFIG_BIN) + sizeof(vmeif_name) + sizeof(vmeif_ipstr) + 50]; uint8_t *buf; int ch; while ((ch = getopt(argc, argv, "a:b:i:l:p:q")) != -1) { switch (ch) { case 'a': strlcpy(vmeif_ipstr, optarg, sizeof(vmeif_ipstr)); break; case 'b': sscanf(optarg, "%d", &cpu); break; case 'i': strlcpy(vmeif_name, optarg, sizeof(vmeif_name)); break; case 'l': sscanf(optarg, "%d", &pktsize); break; case 'p': payload = strdup(optarg); break; case 'q': quiet = 1; break; default: usage(argv[0]); break; } } if (!quiet) { printf("vme name: %s\n", vmeif_name); printf("vme ip: %s\n", vmeif_ipstr); printf("packet size: %d\n", pktsize); printf("payload: %s\n", payload); if (cpu != -1) printf("cpu: %d\n", cpu); } if (cpu != -1) bind_cpu(cpu); signal(SIGINT, signal_handler); snprintf(vmedev, sizeof(vmedev), "/dev/%s", vmeif_name); vmefd = open(vmedev, O_RDWR); if (vmefd == -1) { fprintf(stderr, "Failed to open %s: %s\n", vmedev, strerror(errno)); exit(EXIT_FAILURE); } snprintf(cmd, sizeof(cmd), IFCONFIG_BIN IFCONFIG_ARGS, vmeif_name, vmeif_ipstr); if (system(cmd) != 0) { fprintf(stderr, "Failed to setup %s\n", vmeif_name); exit(EXIT_FAILURE); } if ((vmeif_ip = inet_addr(vmeif_ipstr)) == INADDR_NONE) { fprintf(stderr, "Malformed address %s specified\n", vmeif_ipstr); exit(EXIT_FAILURE); } if (get_ifaddr(vmeif_name, vmeif_ether) != 0) { fprintf(stderr, "Failed to get %s's MAC address\n", vmeif_name); exit(EXIT_FAILURE); } if ((buf = malloc(pktsize)) == NULL) { perror("Failed to allocate memory for packet"); exit(EXIT_FAILURE); } /* Keep injecting packets to network stack */ while (1) { build_udp_packet(buf, pktsize); if (write(vmefd, buf, pktsize) == -1) { perror("write"); exit(EXIT_FAILURE); } total_sent++; } return (0); }
int main(int argc, char **argv) { int tapfd; char cmd[sizeof(IFCONFIG_BIN) + sizeof(tapif_name) + sizeof(tapif_ipstr) + 50]; uint8_t *buf; int ch; while ((ch = getopt(argc, argv, "a:b:i:l:n:s:p:fhq46")) != -1) { switch (ch) { case 'a': strlcpy(tapif_ipstr, optarg, sizeof(tapif_ipstr)); break; case 'b': sscanf(optarg, "%d", &cpu); break; case 'f': force_fragment = 1; break; case 'i': strlcpy(tapif_name, optarg, sizeof(tapif_name)); break; case 'l': sscanf(optarg, "%d", &payloadlen); break; case 'n': sscanf(optarg, "%d", &npackets); break; case 's': sscanf(optarg, "%d", &src_port); break; case 'p': strncpy(payload, optarg, sizeof(payload)); break; case 'q': quiet = 1; break; case '4': ipversion = 4; break; case '6': ipversion = 6; break; case 'h': default: usage(argv[0]); break; } } if (tapif_ipstr[0] == '\0') strlcpy(tapif_ipstr, (ipversion == 4) ? tapif_ipstr_v4 : tapif_ipstr_v6, sizeof(tapif_ipstr)); if (src_addr[0] == '\0') strlcpy(src_addr, (ipversion == 4) ? src_addr_v4: src_addr_v6, sizeof(src_addr)); if (!quiet) { printf("tap name: %s\n", tapif_name); printf("IP version: %d\n", ipversion); printf("tap IP: %s\n", tapif_ipstr); printf("src addr: %s\n", src_addr); printf("src port: %d\n", src_port); printf("packets: %d\n", npackets); printf("payload length: %d\n", payloadlen); printf("payload: %s\n", payload); if (cpu != -1) printf("cpu: %d\n", cpu); } if (cpu != -1) bind_cpu(cpu); signal(SIGINT, signal_handler); snprintf(tapdev, sizeof(tapdev), "/dev/%s", tapif_name); tapfd = open(tapdev, O_RDWR); if (tapfd == -1) { fprintf(stderr, "Failed to open %s: %s\n", tapdev, strerror(errno)); exit(EXIT_FAILURE); } switch (ipversion) { case 4: if (inet_pton(AF_INET, tapif_ipstr, &tapif_ip) != 1) { fprintf(stderr, "Malformed address %s specified\n", tapif_ipstr); exit(EXIT_FAILURE); } snprintf(cmd, sizeof(cmd), IFCONFIG_BIN IFCONFIG_ARGS, tapif_name, "inet", tapif_ipstr); build_udp_packet = build_udp_packet_v4; if (inet_pton(AF_INET, src_addr, &ip_src) != 1) { fprintf(stderr, "Malformed address %s specified\n", src_addr); exit(EXIT_FAILURE); } break; case 6: if (inet_pton(AF_INET6, tapif_ipstr, &tapif_ip6) != 1) { fprintf(stderr, "Malformed address %s specified\n", tapif_ipstr); exit(EXIT_FAILURE); } snprintf(cmd, sizeof(cmd), IFCONFIG_BIN IFCONFIG_ARGS, tapif_name, "inet6", tapif_ipstr); build_udp_packet = build_udp_packet_v6; if (inet_pton(AF_INET6, src_addr, &ip6_src) != 1) { fprintf(stderr, "Malformed address %s specified\n", src_addr); exit(EXIT_FAILURE); } break; default: fprintf(stderr, "Only support ipv4 and ipv6.\n"); exit(EXIT_FAILURE); } if (system(cmd) != 0) { fprintf(stderr, "Failed to setup %s\n", tapif_name); exit(EXIT_FAILURE); } if (get_ifaddr(tapif_name, tapif_ether) != 0) { fprintf(stderr, "Failed to get %s's MAC address\n", tapif_name); exit(EXIT_FAILURE); } if ((buf = malloc(payloadlen + 200)) == NULL) { perror("Failed to allocate memory for packet"); exit(EXIT_FAILURE); } /* Wait 1 second to make sure the ifa6 is ready */ sleep(1); /* Keep injecting packets to network stack */ while (1) { int off = 0; while (off != payloadlen) { int pktsize = build_udp_packet(buf, payloadlen, &off); if (write(tapfd, buf, pktsize) == -1) { perror("write"); exit(EXIT_FAILURE); } usleep(2); /* wait 2ms */ } if (++total_sent == npackets) break; } return (0); }