/*------------------------------------------------------------------------ * setmask - set the net mask for an interface *------------------------------------------------------------------------ */ int setmask(unsigned ifn, IPaddr mask) { IPaddr defmask; if (nif[ifn].ni_svalid) { /* one set already-- fix things */ rtdel(nif[ifn].ni_subnet, nif[ifn].ni_mask); rtdel(nif[ifn].ni_brc, ip_maskall); rtdel(nif[ifn].ni_subnet, ip_maskall); } nif[ifn].ni_mask = mask; nif[ifn].ni_svalid = TRUE; defmask = netmask(nif[ifn].ni_ip); nif[ifn].ni_subnet = nif[ifn].ni_ip & nif[ifn].ni_mask; if (bsdbrc) nif[ifn].ni_brc = nif[ifn].ni_subnet; else nif[ifn].ni_brc = nif[ifn].ni_subnet | ~nif[ifn].ni_mask; /* set network (not subnet) broadcast */ nif[ifn].ni_nbrc = nif[ifn].ni_ip | ~defmask; /* install routes */ /* net */ rtadd(nif[ifn].ni_subnet, nif[ifn].ni_mask, nif[ifn].ni_ip, 0, ifn, RT_INF); if (bsdbrc) { IPaddr aobrc; /* all 1's broadcast */ aobrc = nif[ifn].ni_subnet | ~nif[ifn].ni_mask; rtadd(aobrc, ip_maskall, nif[ifn].ni_ip, 0, NI_LOCAL, RT_INF); } else /* broadcast (all 1's) */ rtadd(nif[ifn].ni_brc, ip_maskall, nif[ifn].ni_ip, 0, NI_LOCAL, RT_INF); /* broadcast (all 0's) */ rtadd(nif[ifn].ni_subnet, ip_maskall, nif[ifn].ni_ip, 0, NI_LOCAL, RT_INF); return OK; }
//............................................................................... // start STA //............................................................................... void WIFI::startSTA() { String ssid = ffs.cfg.readItem("wifi_ssid"); String psk = ffs.cfg.readItem("wifi_password"); staMode = ffs.cfg.readItem("wifi"); // off, dhcp, manual apMode = ffs.cfg.readItem("ap"); // on, off, auto IPAddress address(0, 0, 0, 0); IPAddress gateway(0, 0, 0, 0); IPAddress netmask(0, 0, 0, 0); IPAddress dns(0, 0, 0, 0); //if (ssid != "") validSSID = true; else validSSID = false; validSSID = ssid != "" ? true : false; WiFi.softAPdisconnect(true); WiFi.mode(WIFI_STA); if (staMode == "dhcp") { logging.info("WiFi staMode=dhcp"); } else { // switch to static mode address.fromString(ffs.cfg.readItem("wifi_ip")); gateway.fromString(ffs.cfg.readItem("wifi_gateway")); netmask.fromString(ffs.cfg.readItem("wifi_netmask")); dns.fromString(ffs.cfg.readItem("wifi_dns")); logging.info("WiFi staMode=manual"); logging.debug(" IP address: " + address.toString()); logging.debug(" gateway: " + gateway.toString()); logging.debug(" netmask: " + netmask.toString()); logging.debug(" DNS server: " + dns.toString()); if (WiFi.config(address, gateway, netmask, dns)) { logging.debug("WiFi configuration applied"); // logging.info("local IP address switched to: " + // WiFi.localIP().toString()); } else { logging.error("could not apply WiFi configuration"); } } logging.info("try to connect to SSID: " + ssid); WiFi.begin(ssid.c_str(), psk.c_str()); }
/*---------------------------------------------------------------------- | NPT_NetworkInterface::GetNetworkInterfaces +---------------------------------------------------------------------*/ NPT_Result NPT_NetworkInterface::GetNetworkInterfaces(NPT_List<NPT_NetworkInterface*>& interfaces) { int net = socket(AF_INET, SOCK_DGRAM, 0); // Try to get the config until we have enough memory for it // According to "Unix Network Programming", some implementations // do not return an error when the supplied buffer is too small // so we need to try, increasing the buffer size every time, // until we get the same size twice. We cannot assume success when // the returned size is smaller than the supplied buffer, because // some implementations can return less that the buffer size if // another structure does not fit. unsigned int buffer_size = 4096; // initial guess unsigned int last_size = 0; struct ifconf config; unsigned char* buffer; for (; buffer_size < 65536;) { buffer = new unsigned char[buffer_size]; config.ifc_len = buffer_size; config.ifc_buf = (char*)buffer; if (ioctl(net, SIOCGIFCONF, &config) < 0) { if (errno != EINVAL || last_size != 0) { return NPT_ERROR_BASE_UNIX-errno; } } else { if ((unsigned int)config.ifc_len == last_size) { // same size, we can use the buffer break; } // different size, we need to reallocate last_size = config.ifc_len; } // supply 4096 more bytes more next time around buffer_size += 4096; delete[] buffer; } // iterate over all objects unsigned char *entries; for (entries = buffer; entries < buffer+config.ifc_len;) { struct ifreq* entry = (struct ifreq*)entries; // get the size of the addresses unsigned int address_length; #if defined(NPT_CONFIG_HAVE_SOCKADDR_SA_LEN) address_length = sizeof(struct sockaddr) > entry->ifr_addr.sa_len ? sizeof(sockaddr) : entry->ifr_addr.sa_len; #else switch (entry->ifr_addr.sa_family) { #if defined(AF_INET6) case AF_INET6: address_length = sizeof(struct sockaddr_in6); break; #endif // defined(AF_INET6) default: address_length = sizeof(struct sockaddr); break; } #endif // point to the next entry entries += address_length + sizeof(entry->ifr_name); // ignore anything except AF_INET and AF_LINK addresses if (entry->ifr_addr.sa_family != AF_INET #if defined(AF_LINK) && entry->ifr_addr.sa_family != AF_LINK #endif ) { continue; } // get detailed info about the interface NPT_Flags flags = 0; #if defined(SIOCGIFFLAGS) struct ifreq query = *entry; if (ioctl(net, SIOCGIFFLAGS, &query) < 0) continue; // process the flags if ((query.ifr_flags & IFF_UP) == 0) { // the interface is not up, ignore it continue; } if (query.ifr_flags & IFF_BROADCAST) { flags |= NPT_NETWORK_INTERFACE_FLAG_BROADCAST; } if (query.ifr_flags & IFF_LOOPBACK) { flags |= NPT_NETWORK_INTERFACE_FLAG_LOOPBACK; } #if defined(IFF_POINTOPOINT) if (query.ifr_flags & IFF_POINTOPOINT) { flags |= NPT_NETWORK_INTERFACE_FLAG_POINT_TO_POINT; } #endif // defined(IFF_POINTOPOINT) if (query.ifr_flags & IFF_PROMISC) { flags |= NPT_NETWORK_INTERFACE_FLAG_PROMISCUOUS; } if (query.ifr_flags & IFF_MULTICAST) { flags |= NPT_NETWORK_INTERFACE_FLAG_MULTICAST; } #endif // defined(SIOCGIFFLAGS) // get a pointer to an interface we've looped over before // or create a new one NPT_NetworkInterface* interface = NULL; for (NPT_List<NPT_NetworkInterface*>::Iterator iface_iter = interfaces.GetFirstItem(); iface_iter; ++iface_iter) { if ((*iface_iter)->GetName() == (const char*)entry->ifr_name) { interface = *iface_iter; break; } } if (interface == NULL) { // create a new interface object interface = new NPT_NetworkInterface(entry->ifr_name, flags); // add the interface to the list interfaces.Add(interface); // get the mac address #if defined(SIOCGIFHWADDR) if (ioctl(net, SIOCGIFHWADDR, &query) == 0) { NPT_MacAddress::Type mac_addr_type; unsigned int mac_addr_length = IFHWADDRLEN; switch (query.ifr_addr.sa_family) { #if defined(ARPHRD_ETHER) case ARPHRD_ETHER: mac_addr_type = NPT_MacAddress::TYPE_ETHERNET; break; #endif #if defined(ARPHRD_LOOPBACK) case ARPHRD_LOOPBACK: mac_addr_type = NPT_MacAddress::TYPE_LOOPBACK; length = 0; break; #endif #if defined(ARPHRD_PPP) case ARPHRD_PPP: mac_addr_type = NPT_MacAddress::TYPE_PPP; mac_addr_length = 0; break; #endif #if defined(ARPHRD_IEEE80211) case ARPHRD_IEEE80211: mac_addr_type = NPT_MacAddress::TYPE_IEEE_802_11; break; #endif default: mac_addr_type = NPT_MacAddress::TYPE_UNKNOWN; mac_addr_length = sizeof(query.ifr_addr.sa_data); break; } interface->SetMacAddress(mac_addr_type, (const unsigned char*)query.ifr_addr.sa_data, mac_addr_length); } #endif } switch (entry->ifr_addr.sa_family) { case AF_INET: { // primary address NPT_IpAddress primary_address(ntohl(((struct sockaddr_in*)&entry->ifr_addr)->sin_addr.s_addr)); // broadcast address NPT_IpAddress broadcast_address; #if defined(SIOCGIFBRDADDR) if (flags & NPT_NETWORK_INTERFACE_FLAG_BROADCAST) { if (ioctl(net, SIOCGIFBRDADDR, &query) == 0) { broadcast_address.Set(ntohl(((struct sockaddr_in*)&query.ifr_addr)->sin_addr.s_addr)); } } #endif // point to point address NPT_IpAddress destination_address; #if defined(SIOCGIFDSTADDR) if (flags & NPT_NETWORK_INTERFACE_FLAG_POINT_TO_POINT) { if (ioctl(net, SIOCGIFDSTADDR, &query) == 0) { destination_address.Set(ntohl(((struct sockaddr_in*)&query.ifr_addr)->sin_addr.s_addr)); } } #endif // netmask NPT_IpAddress netmask(0xFFFFFFFF); #if defined(SIOCGIFNETMASK) if (ioctl(net, SIOCGIFNETMASK, &query) == 0) { netmask.Set(ntohl(((struct sockaddr_in*)&query.ifr_addr)->sin_addr.s_addr)); } #endif // add the address to the interface NPT_NetworkInterfaceAddress iface_address( primary_address, broadcast_address, destination_address, netmask); interface->AddAddress(iface_address); break; } #if defined(AF_LINK) && defined(NPT_CONFIG_HAVE_SOCKADDR_DL) case AF_LINK: { struct sockaddr_dl* mac_addr = (struct sockaddr_dl*)&entry->ifr_addr; NPT_MacAddress::Type mac_addr_type = NPT_MacAddress::TYPE_UNKNOWN; switch (mac_addr->sdl_type) { #if defined(IFT_LOOP) case IFT_LOOP: mac_addr_type = NPT_MacAddress::TYPE_LOOPBACK; break; #endif #if defined(IFT_ETHER) case IFT_ETHER: mac_addr_type = NPT_MacAddress::TYPE_ETHERNET; break; #endif #if defined(IFT_PPP) case IFT_PPP: mac_addr_type = NPT_MacAddress::TYPE_PPP; break; #endif } interface->SetMacAddress(mac_addr_type, (const unsigned char*)(&mac_addr->sdl_data[mac_addr->sdl_nlen]), mac_addr->sdl_alen); break; } #endif } } // free resources delete[] buffer; close(net); return NPT_SUCCESS; }
/*---------------------------------------------------------------------- | NPT_NetworkInterface::GetNetworkInterfaces +---------------------------------------------------------------------*/ NPT_Result NPT_NetworkInterface::GetNetworkInterfaces(NPT_List<NPT_NetworkInterface*>& interfaces) { int result = 0; struct ifaddrs * ifaddrsList = NULL; struct ifaddrs * ifaddr = NULL; NPT_Flags flags = 0; result = getifaddrs(&ifaddrsList); if( result != 0 || ifaddrsList == NULL) return NPT_FAILURE; for(ifaddr = ifaddrsList; NULL!= ifaddr; ifaddr = ifaddr->ifa_next) { if(ifaddr->ifa_addr == NULL /*|| ifaddr->ifa_addr->sa_family == AF_INET6*/) continue; // process the flags if ((ifaddr->ifa_flags & IFF_UP) == 0) { // the interface is not up, ignore it continue; } if (ifaddr->ifa_flags & IFF_BROADCAST) { flags |= NPT_NETWORK_INTERFACE_FLAG_BROADCAST; } if (ifaddr->ifa_flags & IFF_LOOPBACK) { flags |= NPT_NETWORK_INTERFACE_FLAG_LOOPBACK; } #if defined(IFF_POINTOPOINT) if (ifaddr->ifa_flags & IFF_POINTOPOINT) { flags |= NPT_NETWORK_INTERFACE_FLAG_POINT_TO_POINT; } #endif // defined(IFF_POINTOPOINT) if (ifaddr->ifa_flags & IFF_PROMISC) { flags |= NPT_NETWORK_INTERFACE_FLAG_PROMISCUOUS; } if (ifaddr->ifa_flags & IFF_MULTICAST) { flags |= NPT_NETWORK_INTERFACE_FLAG_MULTICAST; } NPT_NetworkInterface* interface = NULL; for (NPT_List<NPT_NetworkInterface*>::Iterator iface_iter = interfaces.GetFirstItem(); iface_iter; ++iface_iter) { if ((*iface_iter)->GetName() == (const char*)ifaddr->ifa_name) { interface = *iface_iter; break; } } // create a new interface object if(interface == NULL) interface = new NPT_NetworkInterface(ifaddr->ifa_name, flags); if (interface == NULL) continue; // get the mac address NPT_MacAddress::Type mac_addr_type; unsigned int mac_addr_length = IFHWADDRLEN; switch (ifaddr->ifa_addr->sa_family) { case AF_LOCAL: case AF_INET: #if defined(AF_LINK) case AF_LINK: #endif mac_addr_type = NPT_MacAddress::TYPE_ETHERNET; #if defined(ARPHRD_LOOPBACK) mac_addr_type = NPT_MacAddress::TYPE_LOOPBACK; length = 0; #endif break; #if defined(AF_PPP) case AF_PPP: mac_addr_type = NPT_MacAddress::TYPE_PPP; mac_addr_length = 0; break; #endif #if defined(AF_IEEE80211) case AF_IEEE80211: mac_addr_type = NPT_MacAddress::TYPE_IEEE_802_11; break; #endif default: mac_addr_type = NPT_MacAddress::TYPE_UNKNOWN; mac_addr_length = sizeof(ifaddr->ifa_addr->sa_data); break; } if(interface->GetMacAddress().GetLength() == 0) interface->SetMacAddress(mac_addr_type, (const unsigned char*)ifaddr->ifa_addr->sa_data, mac_addr_length); #if defined(NPT_CONFIG_HAVE_NET_IF_DL_H) if (ifaddr->ifa_addr->sa_family == AF_LINK) { //Refer to LLADDR struct sockaddr_dl * socket_dl = (struct sockaddr_dl *)ifaddr->ifa_addr; interface->SetMacAddress(mac_addr_type, (const unsigned char*)socket_dl->sdl_data+socket_dl->sdl_nlen, socket_dl->sdl_alen); } #endif switch (ifaddr->ifa_addr->sa_family) { case AF_INET: { // primary address NPT_IpAddress primary_address( ntohl(((struct sockaddr_in *)ifaddr->ifa_addr)->sin_addr.s_addr)); // broadcast address NPT_IpAddress broadcast_address; if ((flags & NPT_NETWORK_INTERFACE_FLAG_BROADCAST) && ifaddr->ifa_dstaddr) { broadcast_address.Set(ntohl(((struct sockaddr_in*)ifaddr->ifa_dstaddr)->sin_addr.s_addr)); } // point to point address NPT_IpAddress destination_address; if ((flags & NPT_NETWORK_INTERFACE_FLAG_POINT_TO_POINT) && ifaddr->ifa_dstaddr) { destination_address.Set(ntohl(((struct sockaddr_in*)ifaddr->ifa_dstaddr)->sin_addr.s_addr)); } // netmask NPT_IpAddress netmask(0xFFFFFFFF); if(ifaddr->ifa_netmask) netmask.Set(ntohl(((struct sockaddr_in*)ifaddr->ifa_netmask)->sin_addr.s_addr)); // add the address to the interface NPT_NetworkInterfaceAddress iface_address(primary_address, broadcast_address, destination_address, netmask); interface->AddAddress(iface_address); break; } } // add the interface to the list interfaces.Add(interface); } freeifaddrs(ifaddrsList); return NPT_SUCCESS; }
int main(int argc, char* argv[]) { signal(SIGSEGV, crash_sig); signal(SIGABRT, crash_sig); signal(SIGPIPE, SIG_IGN); char cmd[1024]; int localfd, remotefd; library_conf_t conf; int opt; char* ip = NULL; unsigned int port = 6687; struct in_addr a; struct option long_options[] = { {"aes", 1, NULL, 'a'}, {"des", 1, NULL, 'd'}, {"gzip", 0, NULL, 'g'}, {"mask", 1, NULL, 'm'}, {"localip", 1, NULL, 'l'}, {"server", 1, NULL, 's'}, {"port", 1, NULL, 'p'}, {NULL, 0, NULL, 0} }; char short_options[512] = {0}; longopt2shortopt(long_options, sizeof(long_options) / sizeof(struct option), short_options); conf.localip = 0; conf.netmask = 24; conf.use_gzip = 0; conf.use_aes = 0; conf.aes_key_file = NULL; conf.use_des = 0; conf.des_key_file = NULL; while ((opt = getopt_long(argc, argv, short_options, long_options, NULL)) != -1) { switch (opt) { case 'a': conf.use_aes = 1; conf.aes_key_file = optarg; break; case 'd': conf.use_des = 1; conf.des_key_file = optarg; break; case 'g': conf.use_gzip = 1; break; case 'l': conf.localip = inet_addr(optarg); break; case 's': ip = optarg; break; case 'm': conf.netmask = atoi(optarg); break; case 'p': port = atoi(optarg); break; default: fprintf(stderr, "param error\n"); return 1; } } if (conf.localip == 0) { fprintf(stderr, "localip is zero\n"); return 1; } if (port == 0) { fprintf(stderr, "port is zero\n"); return 1; } memset(this.dev_name, 0, IFNAMSIZ); localfd = tun_open(this.dev_name); if (localfd == -1) return 1; fprintf(stdout, "%s opened\n", this.dev_name); a.s_addr = conf.localip; if (ip == NULL) { if (conf.netmask == 0 || conf.netmask > 31) { fprintf(stderr, "netmask must > 0 and <= 31\n"); return 1; } library_init(conf); remotefd = bind_and_listen(port); if (remotefd == -1) return 1; sprintf(cmd, "ifconfig %s %s/%u up", this.dev_name, inet_ntoa(a), conf.netmask); SYSTEM_EXIT(cmd); a.s_addr = conf.localip & LEN2MASK(conf.netmask); sprintf(cmd, "route add -net %s/%u dev %s", inet_ntoa(a), conf.netmask, this.dev_name); SYSTEM_EXIT(cmd); server_loop(remotefd, localfd); } else { unsigned char mask; int inited = 0; library_init(conf); while (1) { remotefd = connect_server(ip, port); if (remotefd == -1) { sleep(5); continue; } if (!inited) { sprintf(cmd, "ifconfig %s %s up", this.dev_name, inet_ntoa(a)); SYSTEM_EXIT(cmd); mask = netmask(); a.s_addr = conf.localip & LEN2MASK(mask); sprintf(cmd, "route add -net %s/%u dev %s", inet_ntoa(a), mask, this.dev_name); SYSTEM_EXIT(cmd); inited = 1; } client_loop(remotefd, localfd); close(remotefd); fprintf(stderr, "retry\n"); } } return 0; }
static netmask ipv4_map() { return netmask(ip(ip::ip_data_t({0,0,0,0,0,0,0,0,0,0,0xFF,0xFF,0,0,0,0})),96); }
/*---------------------------------------------------------------------- | NPT_NetworkInterface::GetNetworkInterfaces +---------------------------------------------------------------------*/ NPT_Result NPT_NetworkInterface::GetNetworkInterfaces(NPT_List<NPT_NetworkInterface*>& interfaces) { // create a socket to talk to the TCP/IP stack SOCKET net; if((net = WSASocket(AF_INET, SOCK_DGRAM, IPPROTO_UDP, NULL, 0, 0)) == INVALID_SOCKET) { return NPT_FAILURE; } // get a list of interfaces INTERFACE_INFO query[32]; // get up to 32 interfaces DWORD bytes_returned; int io_result = WSAIoctl(net, SIO_GET_INTERFACE_LIST, NULL, 0, &query, sizeof(query), &bytes_returned, NULL, NULL); if (io_result == SOCKET_ERROR) { closesocket(net); return NPT_FAILURE; } // we don't need the socket anymore closesocket(net); // Display interface information int interface_count = (bytes_returned/sizeof(INTERFACE_INFO)); unsigned int iface_index = 0; for (int i=0; i<interface_count; i++) { SOCKADDR_IN* address; NPT_Flags flags = 0; // primary address address = (SOCKADDR_IN*)&query[i].iiAddress; NPT_IpAddress primary_address(ntohl(address->sin_addr.s_addr)); // netmask address = (SOCKADDR_IN*)&query[i].iiNetmask; NPT_IpAddress netmask(ntohl(address->sin_addr.s_addr)); // broadcast address address = (SOCKADDR_IN*)&query[i].iiBroadcastAddress; NPT_IpAddress broadcast_address(ntohl(address->sin_addr.s_addr)); { // broadcast address is incorrect unsigned char addr[4]; for(int i=0; i<4; i++) { addr[i] = (primary_address.AsBytes()[i] & netmask.AsBytes()[i]) | ~netmask.AsBytes()[i]; } broadcast_address.Set(addr); } // ignore interfaces that are not up if (!(query[i].iiFlags & IFF_UP)) { continue; } if (query[i].iiFlags & IFF_BROADCAST) { flags |= NPT_NETWORK_INTERFACE_FLAG_BROADCAST; } if (query[i].iiFlags & IFF_MULTICAST) { flags |= NPT_NETWORK_INTERFACE_FLAG_MULTICAST; } if (query[i].iiFlags & IFF_LOOPBACK) { flags |= NPT_NETWORK_INTERFACE_FLAG_LOOPBACK; } if (query[i].iiFlags & IFF_POINTTOPOINT) { flags |= NPT_NETWORK_INTERFACE_FLAG_POINT_TO_POINT; } // mac address (no support for this for now) NPT_MacAddress mac; // create an interface object char iface_name[5]; iface_name[0] = 'i'; iface_name[1] = 'f'; iface_name[2] = '0'+(iface_index/10); iface_name[3] = '0'+(iface_index%10); iface_name[4] = '\0'; NPT_NetworkInterface* iface = new NPT_NetworkInterface(iface_name, mac, flags); // set the interface address NPT_NetworkInterfaceAddress iface_address( primary_address, broadcast_address, NPT_IpAddress::Any, netmask); iface->AddAddress(iface_address); // add the interface to the list interfaces.Add(iface); // increment the index (used for generating the name iface_index++; } return NPT_SUCCESS; }
///Teste l'égalité de 2 subnets bool RzxSubnet::operator==(const RzxSubnet& subnet) const { return network() == subnet.network() && netmask() == subnet.netmask(); }
/*------------------------------------------------------------------------ * icmp_in - handle ICMP packet coming in from the network *------------------------------------------------------------------------ */ int icmp_in(struct netif *pni, struct ep *pep) { struct ip *pip; struct icmp *pic; int i, len; pip = (struct ip *)pep->ep_data; pic = (struct icmp *) pip->ip_data; len = pip->ip_len - IP_HLEN(pip); if (cksum((WORD *)pic, len)) { IcmpInErrors++; freebuf(pep); return SYSERR; } IcmpInMsgs++; switch(pic->ic_type) { case ICT_ECHORQ: IcmpInEchos++; return icmp(ICT_ECHORP, 0, pip->ip_src, pep, 0); case ICT_MASKRQ: IcmpInAddrMasks++; if (!gateway) { freebuf(pep); return OK; } pic->ic_type = (char) ICT_MASKRP; *(IPaddr *)pic->ic_data = netmask(pip->ip_dst); break; case ICT_MASKRP: IcmpInAddrMaskReps++; for (i=0; i<Net.nif; ++i) if (nif[i].ni_ip == pip->ip_dst) break; if (i != Net.nif) { setmask(i, *(IPaddr *)pic->ic_data); send(pic->ic_id, ICT_MASKRP); } freebuf(pep); return OK; case ICT_ECHORP: IcmpInEchoReps++; if (send(pic->ic_id, (int)pep) != OK) freebuf(pep); return OK; case ICT_REDIRECT: IcmpInRedirects++; icredirect(pep); return OK; case ICT_DESTUR: IcmpInDestUnreachs++; freebuf(pep); return OK; case ICT_SRCQ: IcmpInSrcQuenchs++; freebuf(pep); return OK; case ICT_TIMEX: IcmpInTimeExcds++; freebuf(pep); return OK; case ICT_PARAMP: IcmpInParmProbs++; freebuf(pep); return OK; case ICT_TIMERQ: IcmpInTimestamps++; freebuf(pep); return OK; case ICT_TIMERP: IcmpInTimestampReps++; freebuf(pep); return OK; default: IcmpInErrors++; freebuf(pep); return OK; } icsetsrc(pip); len = pip->ip_len - IP_HLEN(pip); pic->ic_cksum = 0; pic->ic_cksum = cksum((WORD *)pic, len); IcmpOutMsgs++; ipsend(pip->ip_dst, pep, len, IPT_ICMP, IPP_INCTL, IP_TTL); return OK; }
int main(int argc, char* argv[]) { #ifdef HAVE_EXECINFO_H signal(SIGSEGV, crash_sig); signal(SIGABRT, crash_sig); signal(SIGPIPE, SIG_IGN); #endif #ifdef WIN32 HANDLE localfd; WSADATA wsa; enum_device_t devs[MAX_DEVICE_COUNT]; #else int localfd; #endif char cmd[1024]; int remotefd; library_conf_t conf; int opt; struct in_addr a; struct option long_options[] = { { "conf", 1, NULL, 'c' }, { NULL, 0, NULL, 0 } }; char short_options[512] = {0}; longopt2shortopt(long_options, sizeof(long_options) / sizeof(struct option), short_options); #ifdef HAVE_SYSLOG_H openlog(argv[0], LOG_PERROR | LOG_CONS | LOG_PID, LOG_LOCAL0); #endif qtun = calloc(sizeof(*qtun), 1); #ifdef WIN32 remotefd = -1; localfd = INVALID_HANDLE_VALUE; #else localfd = remotefd = -1; #endif { char path[MAX_PATH] = {0}; #ifdef WIN32 strcpy(path, argv[0]); #elif defined(__APPLE__) char tmp_path[sizeof(path)] = {0}; uint32_t len = sizeof(path); if (_NSGetExecutablePath(tmp_path, &len) == -1) { perror("_NSGetExecutablePath"); return 1; } if (readlink(tmp_path, path, sizeof(path)) == -1) { if (errno == EINVAL) strcpy(path, tmp_path); else { perror("readlink"); return 1; } } #else if (readlink("/proc/self/exe", path, sizeof(path)) == -1) { perror("readlink"); return 1; } #endif init_path(path); } conf_init(&conf); while ((opt = getopt_long(argc, argv, short_options, long_options, NULL)) != -1) { switch (opt) { case 'c': { char* path = realpath(optarg, NULL); if (path == NULL) { perror("realpath"); return 1; } strcpy(conf.conf_file, path); free(path); } break; default: fprintf(stderr, "param error\n"); return 1; } } #ifdef WIN32 { size_t count = enum_devices(devs); if (count == 0) { fprintf(stderr, "have no QTun Virtual Adapter\n"); return 1; } else if (count == 1) { strcpy(conf.dev_symbol, devs[0].dev_path); strcpy(conf.dev_name, devs[0].dev_name); } else { size_t i; char str[20] = { 0 }; int n = -1; printf("Have Adapters:\n"); for (i = 0; i < count; ++i) { printf("%lu: %s\n", i + 1, devs[i].dev_name); } printf("Choose One[1]: "); while (n == -1) { if (str[0] == '\n' && str[1] == 0) n = 1; else { if (!is_int(str, sizeof(str))) continue; n = atoi(str); if (n < 1 || n > (int)count) { fprintf(stderr, "Invalid Number must >= 1 and <= %lu\n", count); n = -1; continue; } } } strcpy(conf.dev_symbol, devs[n].dev_path); strcpy(conf.dev_name, devs[n].dev_name); } } #endif init_lua(); show_logo(); script_load_config(qtun->lua, &conf, conf.conf_file); #ifdef WIN32 if (strlen(conf.dev_symbol) == 0) { fprintf(stderr, "Missing param [-e] or [--device]\n"); return 1; } #endif #ifdef WIN32 localfd = tun_open(conf.dev_symbol); if (localfd == INVALID_HANDLE_VALUE) return 1; fprintf(stdout, "%s opened\n", conf.dev_name); #else memset(qtun->dev_name, 0, IFNAMSIZ); localfd = tun_open(qtun->dev_name); if (localfd == -1) return 1; syslog(LOG_INFO, "%s opened\n", qtun->dev_name); #endif a.s_addr = conf.localip; #ifdef WIN32 WSAStartup(MAKEWORD(2, 2), &wsa); #endif if (strlen(conf.server) == 0) { if (conf.netmask == 0 || conf.netmask > 31) { #ifdef WIN32 WSACleanup(); #endif fprintf(stderr, "netmask must > 0 and <= 31\n"); return 1; } library_init(conf); if (conf.localip == 0) { fprintf(stderr, "localip is zero\n"); return 1; } if (strlen(conf.signature_file) == 0) { fprintf(stderr, "missing signature file\n"); return 1; } qtun->is_server = 1; remotefd = bind_and_listen(conf.server_port); if (remotefd == -1) { #ifdef WIN32 WSACleanup(); #endif return 1; } #ifdef WIN32 { a.s_addr = conf.localip; sprintf(cmd, "netsh interface ip set address name=\"%s\" static %s %s", conf.dev_name, inet_ntoa(a), STR_LEN2MASK(conf.netmask)); SYSTEM_EXIT(cmd); } #elif defined(__APPLE__) { sprintf(cmd, "ifconfig %s %s/%u up", qtun->dev_name, inet_ntoa(a), conf.netmask); SYSTEM_EXIT(cmd); a.s_addr = conf.localip & LEN2MASK(conf.netmask); sprintf(cmd, "route add -net %s/%u %s", inet_ntoa(a), conf.netmask, inet_ntoa(a)); SYSTEM_EXIT(cmd); } #else { sprintf(cmd, "ifconfig %s %s/%u up", qtun->dev_name, inet_ntoa(a), conf.netmask); SYSTEM_EXIT(cmd); a.s_addr = conf.localip & LEN2MASK(conf.netmask); sprintf(cmd, "route add -net %s/%u dev %s", inet_ntoa(a), conf.netmask, qtun->dev_name); SYSTEM_EXIT(cmd); } #endif server_loop(remotefd, localfd); } else { #ifdef unix unsigned char mask; #endif int inited = 0; library_init(conf); qtun->is_server = 0; while (1) { remotefd = connect_server(conf.server, conf.server_port); if (remotefd == -1) { SLEEP(5); continue; } a.s_addr = qtun->localip; if (qtun->localip == 0) { fprintf(stderr, "localip is zero\n"); return 1; } if (strlen(conf.signature_file) == 0) { fprintf(stderr, "missing signature file\n"); return 1; } if (!inited) { #ifdef WIN32 { sprintf(cmd, "netsh interface ip set address name=\"%s\" static %s %s", conf.dev_name, inet_ntoa(a), STR_LEN2MASK(conf.netmask)); SYSTEM_EXIT(cmd); } #elif defined(__APPLE__) { char ip1[16], ip2[16]; a.s_addr = qtun->localip; strcpy(ip1, inet_ntoa(a)); a.s_addr = qtun->client.local_ip; strcpy(ip2, inet_ntoa(a)); sprintf(cmd, "ifconfig %s inet %s %s up", qtun->dev_name, ip1, ip2); SYSTEM_EXIT(cmd); mask = netmask(); a.s_addr = qtun->localip & LEN2MASK(mask); sprintf(cmd, "route add -net %s/%u %s", inet_ntoa(a), mask, ip2); SYSTEM_EXIT(cmd); } #else { sprintf(cmd, "ifconfig %s %s up", qtun->dev_name, inet_ntoa(a)); SYSTEM_EXIT(cmd); mask = netmask(); a.s_addr = qtun->localip & LEN2MASK(mask); sprintf(cmd, "route add -net %s/%u dev %s", inet_ntoa(a), mask, qtun->dev_name); SYSTEM_EXIT(cmd); } #endif inited = 1; } client_loop(remotefd, localfd); close(remotefd); SYSLOG(LOG_WARNING, "retry"); } } #ifdef WIN32 WSACleanup(); #endif #ifdef HAVE_SYSLOG_H closelog(); #endif library_free(); return 0; }