示例#1
0
static
int slip_receive_packet (char_slip_t *drv)
{
	unsigned      i, j, n;
	unsigned char tmp[SLIP_BUF_MAX];
	unsigned char *buf;

	if (drv->tun_fd < 0) {
		return (1);
	}

	if (tun_check_packet (drv->tun_fd) == 0) {
		return (1);
	}

	n = SLIP_BUF_MAX;

	if (tun_get_packet (drv->tun_fd, tmp, &n)) {
		return (1);
	}

	buf = drv->inp;

	j = 0;
	buf[j++] = 192;

	for (i = 0; i < n; i++) {
		if (tmp[i] == 192) {
			if (j < SLIP_BUF_MAX) {
				buf[j++] = 219;
			}
			if (j < SLIP_BUF_MAX) {
				buf[j++] = 220;
			}
		}
		else if (tmp[i] == 219) {
			if (j < SLIP_BUF_MAX) {
				buf[j++] = 219;
			}
			if (j < SLIP_BUF_MAX) {
				buf[j++] = 221;
			}
		}
		else {
			if (j < SLIP_BUF_MAX) {
				buf[j++] = tmp[i];
			}
		}
	}

	if (j < SLIP_BUF_MAX) {
		buf[j++] = 192;
	}

	drv->inp_idx = 0;
	drv->inp_cnt = j;

	return (0);
}
示例#2
0
文件: slip.c 项目: GlitchMasta47/pce
static
int slip_receive_packet (slip_t *slip)
{
#ifdef PCE_ENABLE_TUN
	unsigned      i, j, n;
	unsigned char tmp[PCE_SLIP_BUF_MAX];
	slip_buf_t    *buf;

	if (tun_check_packet (slip->tun_fd) == 0) {
		return (1);
	}

	n = PCE_SLIP_BUF_MAX;

	if (tun_get_packet (slip->tun_fd, tmp, &n)) {
		return (1);
	}

	buf = slip_buf_alloc (slip);
	if (buf == NULL) {
		return (1);
	}

	j = 0;
	buf->buf[j++] = 192;

	for (i = 0; i < n; i++) {
		if (tmp[i] == 192) {
			if (j < PCE_SLIP_BUF_MAX) {
				buf->buf[j++] = 219;
			}
			if (j < PCE_SLIP_BUF_MAX) {
				buf->buf[j++] = 220;
			}
		}
		else if (tmp[i] == 219) {
			if (j < PCE_SLIP_BUF_MAX) {
				buf->buf[j++] = 219;
			}
			if (j < PCE_SLIP_BUF_MAX) {
				buf->buf[j++] = 221;
			}
		}
		else {
			if (j < PCE_SLIP_BUF_MAX) {
				buf->buf[j++] = tmp[i];
			}
		}
	}

	if (j < PCE_SLIP_BUF_MAX) {
		buf->buf[j++] = 192;
	}

#ifdef SLIP_DEBUG
	fprintf (stderr, "slip: recv tun S=%u+%u Q=%u\n",
		n, j - n, slip->inp_cnt + 1
	);
#endif

	buf->n = j;

	if (slip->inp_hd == NULL) {
		slip->inp_hd = buf;
	}
	else {
		slip->inp_tl->next = buf;
	}

	slip->inp_tl = buf;
	slip->inp_cnt += 1;

	return (0);
#else
	return (1);
#endif
}
示例#3
0
int main(int c, char **v)
{
	struct sockaddr_in server_addr, from;
	socklen_t fromlen;
	fd_set rfds;
	struct tunnel_packet *tp;
	char buf[MTU];
	unsigned int buflen;
	int ret;
	int tun_fd;
	int server_fd;

	tp = (struct tunnel_packet *)buf;

	if(c < 4) {
		fprintf(stderr, "TCP/UDP/ICMP Tunnel over UDP\n"
			"%s <hostname> <port> <passphrase>\n", v[0]);
		return 0;
	}

	struct hostent* host_info = gethostbyname(v[1]);
	if (host_info == NULL) {
		fprintf(stderr, "%s: Invalid hostname or IPv4 address\n", v[1]);
		return 1;
	}

	memset(&server_addr, 0, sizeof(server_addr));
	memset(&from, 0, sizeof(from));
	memcpy(&server_addr.sin_addr, host_info->h_addr, host_info->h_length);
	if(strtoport(v[2], &server_addr.sin_port) == 0) {
		fprintf(stderr, "%s: Invalid port\n", v[0]);
		return 1;
	}
	server_addr.sin_family = AF_INET;
	tun_fd = tun_create();
	server_fd = socket_create(0);

	/* Sending authentication */
	tp->type = CONTROL_PACKET;
	tp->cmd = AUTH_CMD;
	strcpy(tp->data, PASSPHRASE);
	socket_put_packet(server_fd, &server_addr, sizeof(server_addr), buf, sizeof(struct tunnel_packet) + strlen(PASSPHRASE));

	/* Waiting acknowledge */
	fromlen = sizeof(struct sockaddr_in);
	buflen = socket_get_packet(server_fd, &from, &fromlen, buf, sizeof(buf));
	if(tp->type == CONTROL_PACKET) {
		if(tp->cmd != OK_CMD) {
			puts("Password is incorret");
			return 1;
		}
	} else {
		puts("Unexpected packet was received.");
		return 1;
	}

#ifdef __linux__
	exec_script("linux_client.sh", v[1]);
#else
	exec_script("osx_client.sh", v[1]);
#endif
	puts("+ Auth is OK.\n+ UDP Tunnel is running.");
	FD_ZERO(&rfds);
	while(1) {
		FD_SET(server_fd, &rfds);
		FD_SET(tun_fd, &rfds);
		ret = select(server_fd+1, &rfds, NULL, NULL, NULL);

		if(ret == -1)
			break;

		if(FD_ISSET(tun_fd, &rfds)) {
			buflen = tun_get_packet(tun_fd, tp->data, sizeof(buf)-sizeof(struct tunnel_packet));
			tp->type = TRAFFIC_PACKET;
			tp->cmd = 0;
			socket_put_packet(server_fd, &server_addr, sizeof(server_addr), buf, buflen + sizeof(struct tunnel_packet));
		}

		if(FD_ISSET(server_fd, &rfds)) {
			buflen = socket_get_packet(server_fd, &from, &fromlen, buf, sizeof(buf));
			if(server_addr.sin_addr.s_addr == from.sin_addr.s_addr && server_addr.sin_port == from.sin_port)
				tun_put_packet(tun_fd, tp->data, buflen-sizeof(struct tunnel_packet));
		}
	}

	return 1;
}