static void refresh_arp_table(void) { #ifdef __ECOS int idx = 0; struct iwreq iwr; RT_802_11_MAC_TABLE MacTab; struct eth_drv_sc *sc; cyg_netdevtab_entry_t *t; int found = 0; char hw[HWAMAXLEN]; memset(&iwr, 0, sizeof(iwr)); memset(&MacTab, 0, sizeof(RT_802_11_MAC_TABLE)); iwr.u.data.pointer = (caddr_t) &MacTab; for (t = &__NETDEVTAB__[0]; t != &__NETDEVTAB_END__; t++) { sc = (struct eth_drv_sc *)t->device_instance; if (strcmp(sc->dev_name, TRAFFICD_IF_AP) == 0) { found = 1; break; } } if (found == 1) { if(rt28xx_ap_ioctl(sc, RTPRIV_IOCTL_GET_MAC_TABLE, (caddr_t)&iwr) < 0) { elog("RTPRIV_IOCTL_GET_MAC_TABLE sock fail!!\n"); arp->size = 0; return; } } else { arp->size = 0; return; } reset_arp_table(); for (idx = 0; idx < MacTab.Num; idx++){ if(MacTab.Entry[idx].TxRate.field.MODE >= 2){ snprintf((char *)hw, HWAMAXLEN, "%02X:%02X:%02X:%02X:%02X:%02X", MacTab.Entry[idx].Addr[0], MacTab.Entry[idx].Addr[1], MacTab.Entry[idx].Addr[2], MacTab.Entry[idx].Addr[3], MacTab.Entry[idx].Addr[4], MacTab.Entry[idx].Addr[5]); push_arp(hw, 0); } } #endif }
int main(int argc, char **argv) { int arp_sock; int bios_sock, ns_sock; int max_sock; char *runfile = NULL, namebuff[32]= {0}; struct timeval timeout= {30,0}; struct timeval timeuse= {0,0}; fd_set readset; struct sigaction sa; struct sockaddr me; arp_sock = open_arp_socket(&me); printf("arp_sock %d\n", arp_sock); bios_sock = open_bios_socket(); printf("bios sock %d\n", bios_sock); ns_sock = open_ns_socket(); printf("ns sock %d\n", ns_sock); if (arp_sock < 0 ||bios_sock < 0 || ns_sock < 0) exit(1); //unlink(ARP_FILE); printf("The attached devices demo is Running ...\n"); daemon(1, 1); runfile = PID_FILE; if(runfile) { int fd, err = 0; sprintf(namebuff, "%d\n", (int) getpid()); unlink(runfile); if((fd = open(runfile, O_WRONLY|O_CREAT|O_TRUNC|O_EXCL, S_IWUSR|S_IRUSR|S_IRGRP|S_IROTH)) == -1) { /* only complain if started as root */ if (getuid() == 0) err = 1; } else { if(!read_write(fd, (unsigned char *)namebuff, strlen(namebuff), 0)) err = 1; while (!err && close(fd) == -1) if (!retry_send()) err = 1; } if (err) { _exit(0); } } reset_arp_table(); do_signal(arp_sock, &me, 0); memset(&sa, 0, sizeof(sa)); sa.sa_flags = SA_RESTART; sa.sa_handler = signal_pending; sigaction(SIGUSR1, &sa, NULL); sigaction(SIGALRM, &sa, NULL); if (bios_sock > arp_sock) max_sock = bios_sock + 1; else max_sock = arp_sock + 1; if(ns_sock + 1 > max_sock) max_sock = ns_sock + 1; while (1) { int ret; int alen = 0; int blen = 0; timeout.tv_sec = 30; timeout.tv_usec = 0; struct in_addr send_ip; struct sockaddr arp_from; struct sockaddr_in bios_from; socklen_t arp_len = sizeof(arp_from); socklen_t bios_len = sizeof(bios_from); struct arpmsg arp_packet; char bios_packet[1024]; // struct iovec iov = {&arp_packet, sizeof(struct arpmsg)}; struct sockaddr_pkt from; struct msghdr msg = { .msg_name = (void *) &from, .msg_namelen = sizeof(from), .msg_iov = &iov, .msg_iovlen = 1, .msg_control = NULL, .msg_controllen = 0, .msg_flags = 0 }; FD_ZERO(&readset); FD_SET(arp_sock, &readset); FD_SET(bios_sock, &readset); FD_SET(ns_sock, &readset); ret = select(max_sock, &readset, 0, 0, &timeout); timeuse.tv_sec += 30 - timeout.tv_sec; if(timeuse.tv_sec >= 140) { do_signal(arp_sock, &me, 0); timeuse.tv_sec = 0; timeuse.tv_usec = 0; } if (ret <= 0) { if (ret == -1 && errno == EINTR) { do_signal(arp_sock, &me, ret); } continue; } if (FD_ISSET(arp_sock, &readset)) { alen = recvmsg(arp_sock, &msg, MSG_DONTWAIT); } if (FD_ISSET(bios_sock, &readset)) blen = recvfrom(bios_sock, bios_packet, sizeof(bios_packet), 0, (struct sockaddr *) &bios_from, &bios_len); if(FD_ISSET(ns_sock, &readset)) recv_ns_pack(ns_sock); /* min arp packet length: 14 ethernet + 28 arp header = 42 */ if (alen >= 42 && recv_arp_pack(&arp_packet, &send_ip,from.spkt_device)) send_bios_query(bios_sock, send_ip); if (blen > 0) recv_bios_pack(bios_packet, blen, bios_from.sin_addr); do_signal(arp_sock, &me, ret); } if (runfile) unlink(runfile); return 0; }