/* * TODO: Can we do these without super user permissions? */ void* fromTapDev(void *arg) { interface_t *iface = (interface_t *) arg; interface_array_t *iarr = (interface_array_t *)iface->iarray; uchar bcast_mac[] = MAC_BCAST_ADDR; gpacket_t *in_pkt; int pktsize; pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); // die as soon as cancelled while (1) { verbose(2, "[fromTapDev]:: Receiving a packet ..."); if ((in_pkt = (gpacket_t *)malloc(sizeof(gpacket_t))) == NULL) { fatal("[fromTapDev]:: unable to allocate memory for packet.. "); return NULL; } bzero(in_pkt, sizeof(gpacket_t)); pktsize = tap_recvfrom(iface->vpl_data, &(in_pkt->data), sizeof(pkt_data_t)); pthread_testcancel(); // check whether the incoming packet is a layer 2 broadcast or // meant for this node... otherwise should be thrown.. // TODO: fix for promiscuous mode packet snooping. if ((COMPARE_MAC(in_pkt->data.header.dst, iface->mac_addr) != 0) && (COMPARE_MAC(in_pkt->data.header.dst, bcast_mac) != 0)) { verbose(1, "[fromTapDev]:: Packet[%d] dropped .. not for this router!? ", pktsize); free(in_pkt); continue; } // copy fields into the message from the packet.. in_pkt->frame.src_interface = iface->interface_id; COPY_MAC(in_pkt->frame.src_hw_addr, iface->mac_addr); COPY_IP(in_pkt->frame.src_ip_addr, iface->ip_addr); // check for filtering.. if the it should be filtered.. then drop if (filteredPacket(filter, in_pkt)) { verbose(2, "[fromTapDev]:: Packet filtered..!"); free(in_pkt); continue; // skip the rest of the loop } verbose(2, "[fromTapDev]:: Packet is sent for enqueuing.."); weightedFairQueuer(pcore, in_pkt, sizeof(gpacket_t)); } }
/* * TODO: Can we do these without super user permissions? */ void* fromTapDev(void *arg) { interface_t *iface = (interface_t *) arg; interface_array_t *iarr = (interface_array_t *)iface->iarray; uchar bcast_mac[] = MAC_BCAST_ADDR; char *pkttag; gpacket_t *in_pkt; int pktsize; pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); // die as soon as cancelled while (1) { verbose(2, "[fromTapDev]:: Receiving a packet ..."); if ((in_pkt = (gpacket_t *)malloc(sizeof(gpacket_t))) == NULL) { fatal("[fromTapDev]:: unable to allocate memory for packet.. "); return NULL; } bzero(in_pkt, sizeof(gpacket_t)); pktsize = tap_recvfrom(iface->vpl_data, &(in_pkt->data), sizeof(pkt_data_t)); pthread_testcancel(); // check whether the incoming packet is a layer 2 broadcast or // meant for this node... otherwise should be thrown.. // TODO: fix for promiscuous mode packet snooping. if ((COMPARE_MAC(in_pkt->data.header.dst, iface->mac_addr) != 0) && (COMPARE_MAC(in_pkt->data.header.dst, bcast_mac) != 0)) { verbose(1, "[fromTapDev]:: Packet[%d] dropped .. not for this router!? ", pktsize); free(in_pkt); continue; } // copy fields into the message from the packet.. in_pkt->frame.src_interface = iface->interface_id; COPY_MAC(in_pkt->frame.src_hw_addr, iface->mac_addr); COPY_IP(in_pkt->frame.src_ip_addr, iface->ip_addr); // check for filtering.. if the it should be filtered.. then drop if (filteredPacket(filter, in_pkt)) { verbose(2, "[fromTapDev]:: Packet filtered..!"); free(in_pkt); continue; // skip the rest of the loop } // invoke the packet core classifier to get the packet tag // at the very minimum, we get the "default" tag! verbose(2, "[fromTapDev]:: Calling the classifier.."); pkttag = tagPacket(pcore, in_pkt); verbose(2, "[fromTapDev]:: Packet tagged as %s ", pkttag); if (!strcmp(rconfig.schedpolicy, "rr")) roundRobinQueuer(pcore, in_pkt, sizeof(gpacket_t), pkttag); else if (!strcmp(rconfig.schedpolicy, "wfq")) weightedFairQueuer(pcore, in_pkt, sizeof(gpacket_t), pkttag); else fatal("[fromTapDev]:: Unknown queuer specification! %s \n", rconfig.schedpolicy); } }