void konlite_call(void) { unsigned short tmp; k_tmr++; for(tmp=0;tmp<ETH_RXBUFNB;tmp++) { buf = get_mac_data(tmp); // буфер принятых данных if(buf->len) { m_pkt=get_mac_pkt(buf); // формирование структуры мак пакета if(check_mac(m_pkt)) // проверка мак адреса назначения { switch(get_eth_type(m_pkt)) { case IP_TYPE: ip_p=ip_rcv(m_pkt); if(check_ip_req(ip_p)) { if(check_mask(ip_p->ip_s)==0) {set_gate_cmd();} // запрос выходит за рамки подсети else{clr_gate_cmd();add_arp_tab(ip_p->ip_s,m_pkt->mac_s);} // запрос в пределах подсети switch(get_ip_type(ip_p)) { case ICMP_TYPE: icmp_p=icmp_rcv(ip_p); if(check_ping(icmp_p)) {ping_echo(icmp_p,ip_p);} break; case UDP_TYPE: udp_p=udp_rcv(ip_p); portudp_scan(udp_p,ip_p); break; case TCP_TYPE: tcp_p=tcp_rcv(ip_p); porttcp_scan(tcp_p,ip_p); break; } } break; case ARP_TYPE: arp_p=arp_rcv(m_pkt); // формирование структуры arp пакета if(check_arp_req(arp_p)) // arp запрос { add_arp_tab(arp_p->ip_s,arp_p->mac_s); arp_answer(arp_p); }else if(check_arp_answer_gate(arp_p)) // arp ответ от шлюза { set_gate_mac(arp_p->mac_s); } break; case UNDEF_TYPE: break; } } unlock_mac_rx(tmp); } } if(k_tmr % GATE_PER == 0) get_gate_mac(); // периодический запрос mac шлюза }
int main (int argc, char **argv) { int index; int status = 0; set_program_name (argv[0]); if (getuid () == 0) is_root = true; /* Parse command line */ iu_argp_init ("ping6", program_authors); argp_parse (&argp, argc, argv, 0, &index, NULL); ping = ping_init (0, getpid ()); if (ping == NULL) /* ping_init() prints our error message. */ exit (1); setsockopt (ping->ping_fd, SOL_SOCKET, SO_BROADCAST, (char *) &one, sizeof (one)); /* Reset root privileges */ setuid (getuid ()); argc -= index; argv += index; if (count != 0) ping_set_count (ping, count); if (socket_type != 0) ping_set_sockopt (ping, socket_type, &one, sizeof (one)); if (options & OPT_INTERVAL) ping_set_interval (ping, interval); init_data_buffer (patptr, pattern_len); while (argc--) { status |= ping_echo (*argv++); ping_reset (ping); } return status; }
int ping_main (struct Ping_Options *Ping_Opt) { int one = 1; int ret = 0; if (getuid () == 0) is_root = true; /* Parse command line */ parse_opt(Ping_Opt); ping = ping_init (ICMP_ECHO, getpid ()); if (ping == NULL) /* ping_init() prints our error message. */ exit (1); ping_set_sockopt (ping, SO_BROADCAST, (char *) &one, sizeof (one)); /* Reset root privileges */ setuid (getuid ()); if (count != 0) ping_set_count (ping, count); if (socket_type != 0) ping_set_sockopt (ping, socket_type, &one, sizeof (one)); if (options & OPT_INTERVAL) ping_set_interval (ping, interval); init_data_buffer (patptr, pattern_len); ret = ping_echo (Ping_Opt->Host); Ping_Opt->SuccessCount = ping->ping_num_recv; Ping_Opt->FailureCount = ping->ping_num_xmit - ping->ping_num_recv; Ping_Opt->AverageResponseTime = ping->avg_time; Ping_Opt->MaximumResponseTime = ping->max_time; Ping_Opt->MinimumResponseTime = ping->min_time; free (ping); free (data_buffer); return ret; }