static int start_instance(AFPacket_Context_t *afpc, AFPacketInstance *instance) { struct packet_mreq mr; int arptype; /* Bind the RX ring to this interface. */ if (bind_instance_interface(afpc, instance) != 0) return -1; /* Turn on promiscuous mode for the device. */ memset(&mr, 0, sizeof(mr)); mr.mr_ifindex = instance->index; mr.mr_type = PACKET_MR_PROMISC; if (setsockopt(instance->fd, SOL_PACKET, PACKET_ADD_MEMBERSHIP, &mr, sizeof(mr)) == -1) { DPE(afpc->errbuf, "%s: setsockopt: %s", __FUNCTION__, strerror(errno)); return -1; } /* Get the link-layer type. */ arptype = iface_get_arptype(instance); if (arptype < 0) { DPE(afpc->errbuf, "%s: failed to get interface type for device %s: (%d) %s", __FUNCTION__, instance->name, errno, strerror(errno)); return -1; } if (arptype != ARPHRD_ETHER) { DPE(afpc->errbuf, "%s: invalid interface type for device %s: %d != %d", __FUNCTION__, instance->name, arptype, ARPHRD_ETHER); return -1; } /* Determine which versions of TPACKET the socket supports. */ if (determine_version(afpc, instance) != DAQ_SUCCESS) return -1; /* Request the kernel RX ring from af_packet... */ if (create_ring(afpc, instance, &instance->rx_ring, PACKET_RX_RING) != DAQ_SUCCESS) return -1; /* ...request the kernel TX ring from af_packet if we're in inline mode... */ if (instance->peer && create_ring(afpc, instance, &instance->tx_ring, PACKET_TX_RING) != DAQ_SUCCESS) return -1; /* ...map the memory for the kernel ring(s) into userspace... */ if (mmap_rings(afpc, instance) != DAQ_SUCCESS) return -1; /* ...and, finally, set up a userspace ring buffer to represent the kernel RX ring... */ if (set_up_ring(afpc, instance, &instance->rx_ring) != DAQ_SUCCESS) return -1; /* ...as well as one for the TX ring if we're in inline mode. */ if (instance->peer && set_up_ring(afpc, instance, &instance->tx_ring) != DAQ_SUCCESS) return -1; return 0; }
static int start_instance(AFPacket_Context_t *afpc, AFPacketInstance *instance) { struct packet_mreq mr; int arptype; /* Bind to the specified device so we only see packets from it. */ if (bind_interface(afpc, instance) != 0) return -1; /* Turn on promiscuous mode for the device. */ memset(&mr, 0, sizeof(mr)); mr.mr_ifindex = instance->index; mr.mr_type = PACKET_MR_PROMISC; if (setsockopt(instance->fd, SOL_PACKET, PACKET_ADD_MEMBERSHIP, &mr, sizeof(mr)) == -1) { DPE(afpc->errbuf, "%s: setsockopt: %s", __FUNCTION__, strerror(errno)); return -1; } /* Get the link-layer type. */ arptype = iface_get_arptype(instance); if (arptype < 0) { DPE(afpc->errbuf, "%s: failed to get interface type for device %s: (%d) %s", __FUNCTION__, instance->name, errno, strerror(errno)); return -1; } if (arptype != ARPHRD_ETHER) { DPE(afpc->errbuf, "%s: invalid interface type for device %s: %d != %d", __FUNCTION__, instance->name, arptype, ARPHRD_ETHER); return -1; } /* Determine which versions of TPACKET the socket supports. */ if (determine_version(afpc, instance) != DAQ_SUCCESS) return -1; if (afpc->debug) { printf("Version: %u\n", instance->tp_version); printf("Header Length: %u\n", instance->tp_hdrlen); } if (create_rx_ring(afpc, instance) != DAQ_SUCCESS) return -1; if (set_up_rx_ring(afpc, instance) != DAQ_SUCCESS) return -1; return 0; }