Ejemplo n.º 1
0
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
}
Ejemplo n.º 2
0
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;
}