sptps_test: allow using a tun device instead of stdio.
This commit is contained in:
		
							parent
							
								
									2980173ee7
								
							
						
					
					
						commit
						475088ed77
					
				
					 1 changed files with 46 additions and 5 deletions
				
			
		| 
						 | 
				
			
			@ -19,6 +19,10 @@
 | 
			
		|||
 | 
			
		||||
#include "system.h"
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_LINUX
 | 
			
		||||
#include <linux/if_tun.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <getopt.h>
 | 
			
		||||
 | 
			
		||||
#include "crypto.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -36,6 +40,8 @@ struct timeval now;
 | 
			
		|||
static bool verbose;
 | 
			
		||||
static bool readonly;
 | 
			
		||||
static bool writeonly;
 | 
			
		||||
static int in = 0;
 | 
			
		||||
static int out = 1;
 | 
			
		||||
 | 
			
		||||
static bool send_data(void *handle, uint8_t type, const char *data, size_t len) {
 | 
			
		||||
	char hex[len * 2 + 1];
 | 
			
		||||
| 
						 | 
				
			
			@ -52,7 +58,7 @@ static bool receive_record(void *handle, uint8_t type, const char *data, uint16_
 | 
			
		|||
	if(verbose)
 | 
			
		||||
		fprintf(stderr, "Received type %d record of %hu bytes:\n", type, len);
 | 
			
		||||
	if(!writeonly)
 | 
			
		||||
		fwrite(data, len, 1, stdout);
 | 
			
		||||
		write(out, data, len);
 | 
			
		||||
	return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -76,6 +82,9 @@ static void usage() {
 | 
			
		|||
			"  -d, --datagram          Enable datagram mode.\n"
 | 
			
		||||
			"  -q, --quit              Quit when EOF occurs on stdin.\n"
 | 
			
		||||
			"  -r, --readonly          Only send data from the socket to stdout.\n"
 | 
			
		||||
#ifdef HAVE_LINUX
 | 
			
		||||
			"  -t, --tun               Use a tun device instead of stdio.\n"
 | 
			
		||||
#endif
 | 
			
		||||
			"  -w, --writeonly         Only send data from stdin to the socket.\n"
 | 
			
		||||
			"  -L, --packet-loss RATE  Fake packet loss of RATE percent.\n"
 | 
			
		||||
			"  -R, --replay-window N   Set replay window to N bytes.\n"
 | 
			
		||||
| 
						 | 
				
			
			@ -88,13 +97,16 @@ int main(int argc, char *argv[]) {
 | 
			
		|||
	program_name = argv[0];
 | 
			
		||||
	bool initiator = false;
 | 
			
		||||
	bool datagram = false;
 | 
			
		||||
#ifdef HAVE_LINUX
 | 
			
		||||
	bool tun = false;
 | 
			
		||||
#endif
 | 
			
		||||
	int packetloss = 0;
 | 
			
		||||
	int r;
 | 
			
		||||
	int option_index = 0;
 | 
			
		||||
	ecdsa_t *mykey = NULL, *hiskey = NULL;
 | 
			
		||||
	bool quit = false;
 | 
			
		||||
 | 
			
		||||
	while((r = getopt_long(argc, argv, "dqrwL:W:v", long_options, &option_index)) != EOF) {
 | 
			
		||||
	while((r = getopt_long(argc, argv, "dqrtwL:W:v", long_options, &option_index)) != EOF) {
 | 
			
		||||
		switch (r) {
 | 
			
		||||
			case 0:   /* long option */
 | 
			
		||||
				break;
 | 
			
		||||
| 
						 | 
				
			
			@ -111,6 +123,16 @@ int main(int argc, char *argv[]) {
 | 
			
		|||
				readonly = true;
 | 
			
		||||
				break;
 | 
			
		||||
 | 
			
		||||
			case 't': /* read only */
 | 
			
		||||
#ifdef HAVE_LINUX
 | 
			
		||||
				tun = true;
 | 
			
		||||
#else
 | 
			
		||||
				fprintf(stderr, "--tun is only supported on Linux.\n");
 | 
			
		||||
				usage();
 | 
			
		||||
				return 1;
 | 
			
		||||
#endif
 | 
			
		||||
				break;
 | 
			
		||||
 | 
			
		||||
			case 'w': /* write only */
 | 
			
		||||
				writeonly = true;
 | 
			
		||||
				break;
 | 
			
		||||
| 
						 | 
				
			
			@ -154,6 +176,25 @@ int main(int argc, char *argv[]) {
 | 
			
		|||
 | 
			
		||||
	srand(time(NULL));
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_LINUX
 | 
			
		||||
	if(tun) {
 | 
			
		||||
		in = out = open("/dev/net/tun", O_RDWR | O_NONBLOCK);
 | 
			
		||||
		if(in < 0) {
 | 
			
		||||
			fprintf(stderr, "Could not open tun device: %s\n", strerror(errno));
 | 
			
		||||
			return 1;
 | 
			
		||||
		}
 | 
			
		||||
		struct ifreq ifr = {
 | 
			
		||||
			.ifr_flags = IFF_TUN
 | 
			
		||||
		};
 | 
			
		||||
		if(ioctl(in, TUNSETIFF, &ifr)) {
 | 
			
		||||
			fprintf(stderr, "Could not configure tun interface: %s\n", strerror(errno));
 | 
			
		||||
			return 1;
 | 
			
		||||
		}
 | 
			
		||||
		ifr.ifr_name[IFNAMSIZ - 1] = 0;
 | 
			
		||||
		fprintf(stderr, "Using tun interface %s\n", ifr.ifr_name);
 | 
			
		||||
	}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_MINGW
 | 
			
		||||
	static struct WSAData wsa_state;
 | 
			
		||||
	if(WSAStartup(MAKEWORD(2, 2), &wsa_state))
 | 
			
		||||
| 
						 | 
				
			
			@ -256,14 +297,14 @@ int main(int argc, char *argv[]) {
 | 
			
		|||
		FD_ZERO(&fds);
 | 
			
		||||
#ifndef HAVE_MINGW
 | 
			
		||||
		if(!readonly && s.instate)
 | 
			
		||||
			FD_SET(0, &fds);
 | 
			
		||||
			FD_SET(in, &fds);
 | 
			
		||||
#endif
 | 
			
		||||
		FD_SET(sock, &fds);
 | 
			
		||||
		if(select(sock + 1, &fds, NULL, NULL, NULL) <= 0)
 | 
			
		||||
			return 1;
 | 
			
		||||
 | 
			
		||||
		if(FD_ISSET(0, &fds)) {
 | 
			
		||||
			ssize_t len = read(0, buf, sizeof buf);
 | 
			
		||||
		if(FD_ISSET(in, &fds)) {
 | 
			
		||||
			ssize_t len = read(in, buf, sizeof buf);
 | 
			
		||||
			if(len < 0) {
 | 
			
		||||
				fprintf(stderr, "Could not read from stdin: %s\n", strerror(errno));
 | 
			
		||||
				return 1;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue