- if(write(device_fd, packet->data + 14, packet->len - 14) < 0) {
- logger(LOG_ERR, "Can't write to %s %s: %s", device_info,
- device, strerror(errno));
- return false;
+ close(ip_fd); ip_fd = -1;
+ close(device_fd); device_fd = -1;
+
+ free(device); device = NULL;
+ free(iface); iface = NULL;
+}
+
+static bool read_packet(vpn_packet_t *packet) {
+ int result;
+ struct strbuf sbuf;
+ int f = 0;
+
+ switch(device_type) {
+ case DEVICE_TYPE_TUN:
+ sbuf.maxlen = MTU - 14;
+ sbuf.buf = (char *)DATA(packet) + 14;
+
+ if((result = getmsg(device_fd, NULL, &sbuf, &f)) < 0) {
+ logger(DEBUG_ALWAYS, LOG_ERR, "Error while reading from %s %s: %s", device_info, device, strerror(errno));
+ return false;
+ }
+
+ switch(DATA(packet)[14] >> 4) {
+ case 4:
+ DATA(packet)[12] = 0x08;
+ DATA(packet)[13] = 0x00;
+ break;
+ case 6:
+ DATA(packet)[12] = 0x86;
+ DATA(packet)[13] = 0xDD;
+ break;
+ default:
+ logger(DEBUG_TRAFFIC, LOG_ERR, "Unknown IP version %d while reading packet from %s %s", DATA(packet)[14] >> 4, device_info, device);
+ return false;
+ }
+
+ memset(DATA(packet), 0, 12);
+ packet->len = sbuf.len + 14;
+ break;
+
+ case DEVICE_TYPE_TAP:
+ sbuf.maxlen = MTU;
+ sbuf.buf = (char *)DATA(packet);
+
+ if((result = getmsg(device_fd, NULL, &sbuf, &f)) < 0) {
+ logger(LOG_ERR, "Error while reading from %s %s: %s", device_info, device, strerror(errno));
+ return false;
+ }
+
+ packet->len = sbuf.len;
+ break;
+
+ default:
+ abort();