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); }
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 }
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; }