Example #1
0
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->
}
Example #2
0
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);
}
Example #3
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);
}