bool CDiscoveryApp::fillDiscoveryResponse( void ) { IP_array ip_array; memset(&m_stDiscoveryResponse, 0, sizeof(DiscoveryResponse_Msg)); m_stDiscoveryResponse.m_uchMessageVersion=1; m_stDiscoveryResponse.m_uchMessageType=2; m_stDiscoveryResponse.m_unAnId=getANId(); memset(&ip_array, 0, sizeof(ip_array)); if (GetNetworkConfiguration(ip_array) < 0) { return false; } MatchIP_dev(ip_array); get_default_gateway( NULL, NULL, 0 ); m_stDiscoveryResponse.m_ushCRC=computeCRC((uint8_t *)&m_stDiscoveryResponse, (uint16_t)(sizeof(DiscoveryResponse_Msg)-sizeof(m_stDiscoveryResponse.m_ushCRC))); print_DiscoveryResponse( ); return true; }
void CDiscoveryApp::SetDefaulRoute(in_addr_t gw) { in_addr_t def_dest=inet_addr("0.0.0.0"); in_addr_t def_mask=inet_addr("0.0.0.0"); in_addr addr={0}; char szDevice [64]; switch( get_default_gateway( &addr.s_addr, szDevice, sizeof(szDevice) ) ) { case DEFAULT_ETH_INTERF: LOG("REPLACING DefaultGW [%s] on %s", inet_ntoa(addr), m_szEthInterf); del_route(addr.s_addr); set_route(def_dest, gw, def_mask); break; case DEFAULT_NOT_ETH_INTERF: LOG("NOT REPLACING DefaultGW GW [%s] on %s", inet_ntoa(addr), szDevice ); break; case DEFAULT_NOT_SET: LOG("SETTING DefaultGW [%s] on %s", inet_ntoa(addr), m_szEthInterf); set_route(def_dest, gw, def_mask); break; } }
int packet_filter() { char *dev, *nextdev; bpf_u_int32 mask; bpf_u_int32 net; struct bpf_program fp; char filter_exp[] = "ip and not dst host 172.16.205.1"; char errbuf[PCAP_ERRBUF_SIZE]; struct pcap_pkthdr header; const u_char *packet; libnet_t *int_llif, *ext_llif; struct ether_addr *t_hwaddr; pthread_t ntid; /* if ((dev = pcap_lookupdev(errbuf)) == NULL) { fprintf(stderr, "Couldn't find default device: %s\n", errbuf); return(2); } printf("Device: %s\n", dev); */ if (get_default_gateway(&def_gw) != 0) { fprintf(stderr, "Couldn't get default gateway\n"); return(2); } printf("gw: %s\n", inet_ntoa(def_gw)); /* initialize handler/filter for external network interface */ dev = ext_ifname; if (pcap_lookupnet(dev, &net, &mask, errbuf) == -1) { fprintf(stderr, "Couldn't get netmask for the device %s\n", dev); return(2); } printf("net: %s, mask %s\n", inet_ntoa(*(struct in_addr *)&net), inet_ntoa(*(struct in_addr *)&mask)); if ((ext_if = pcap_open_live(dev, BUFSIZ, 1, 1000, errbuf)) == NULL) { fprintf(stderr, "Couldn't open device %s: %s\n", dev,errbuf); return(2); } if(pcap_compile(ext_if, &fp, filter_exp, 0, net) == -1) { fprintf(stderr, "Couldn't parse filter %s: %s\n", filter_exp, pcap_geterr(ext_if)); return(2); } if(pcap_setfilter(ext_if, &fp) == -1) { fprintf(stderr, "Couldn't install filter %s: %s\n", filter_exp, pcap_geterr(ext_if)); return(2); } if ((ext_llif = libnet_init(LIBNET_LINK, ext_ifname, errbuf)) == 0) { fprintf(stderr, "Couldn't open local network interface %s: %s\n", ext_ifname, errbuf); return(2); } if ((*((u_int *)&ext_ip) = libnet_get_ipaddr4(ext_llif)) == -1) { fprintf(stderr, "Couldn't get local ip address for %s \n", ext_ifname); return(2); } if ((t_hwaddr = (struct ether_addr *)libnet_get_hwaddr(ext_llif)) == NULL) { fprintf(stderr, "Couldn't get local network interface address for %s \n", ext_ifname); return(2); } memcpy((u_char *)&ext_hwaddr, (u_char *)t_hwaddr, ETHER_ADDR_LEN); libnet_destroy(ext_llif); if (get_netmask(ext_ifname, &ext_mask) == -1) { fprintf(stderr, "Couldn't get local netmask for %s \n", ext_ifname); return(2); } printf("ext_ip : %s ", inet_ntoa(ext_ip) ); printf("ext_ip : %s\n", inet_ntoa(ext_mask)); /* initialize handler/filter for internal network interface */ dev = int_ifname; if (pcap_lookupnet(dev, &net, &mask, errbuf) == -1) { fprintf(stderr, "Couldn't get netmask for the device %s\n", dev); return(2); } printf("net: %s, mask %s\n", inet_ntoa(*(struct in_addr *)&net), inet_ntoa(*(struct in_addr *)&mask)); if ((int_if = pcap_open_live(dev, BUFSIZ, 1, 1000, errbuf)) == NULL) { fprintf(stderr, "Couldn't open device %s: %s\n", dev,errbuf); return(2); } if(pcap_compile(int_if, &fp, filter_exp, 0, net) == -1) { fprintf(stderr, "Couldn't parse filter %s: %s\n", filter_exp, pcap_geterr(int_if)); return(2); } if(pcap_setfilter(int_if, &fp) == -1) { fprintf(stderr, "Couldn't install filter %s: %s\n", filter_exp, pcap_geterr(int_if)); return(2); } if ((int_llif = libnet_init(LIBNET_LINK, int_ifname, errbuf)) == 0) { fprintf(stderr, "Couldn't open local network interface %s: %s\n", int_ifname, errbuf); return(2); } if ((*((u_int *)&int_ip) = libnet_get_ipaddr4(int_llif)) == -1) { fprintf(stderr, "Couldn't get local ip address for %s \n", int_ifname); return(2); } if ((t_hwaddr = (struct ether_addr *)libnet_get_hwaddr(int_llif)) == NULL) { fprintf(stderr, "Couldn't get local network interface address for %s \n", int_ifname); return(2); } memcpy((u_char *)&int_hwaddr, (u_char *)t_hwaddr, ETHER_ADDR_LEN); libnet_destroy(int_llif); if (pthread_create(&ntid, NULL, clean_thread, NULL) != 0) { fprintf(stderr, "Couldn't create thread\n"); } if (pthread_create(&ntid, NULL, ext_thread, NULL) != 0) { fprintf(stderr, "Couldn't create thread\n"); } if(pcap_loop(int_if, -1, got_packet, (void *)FROM_INT) == -1) { fprintf(stderr, "Couldn't filte packet %s: %s\n", filter_exp, pcap_geterr(int_if)); } pcap_close(int_if); return(0); }