static int max_packet_len(Pfring_Context_t *context, char *device, int id, int *card_buffers) { int max_len = 1536, num_slots = 32768 /* max */; pfring *ring; ring = pfring_open(device, 1536, PF_RING_PROMISC); if (ring == NULL) goto error; pfring_get_bound_device_ifindex(ring, &context->ifindexes[id]); if (ring->zc_device) { pfring_card_settings settings; pfring_get_card_settings(ring, &settings); max_len = settings.max_packet_size; num_slots = settings.rx_ring_slots; } else { max_len = pfring_get_mtu_size(ring); if (max_len == 0) max_len = 9000; max_len += 14 + 4; num_slots = 0; } pfring_close(ring); error: *card_buffers = num_slots; return max_len; }
void PfRingDevice::setPfRingDeviceAttributes() { if (m_InterfaceIndex > -1) return; pfring* ring = NULL; bool closeRing = false; if (m_NumOfOpenedRxChannels > 0) ring = m_PfRingDescriptors[0]; else { uint32_t flags = PF_RING_PROMISC | PF_RING_DNA_SYMMETRIC_RSS; ring = pfring_open(m_DeviceName, DEFAULT_PF_RING_SNAPLEN, flags); closeRing = true; } if (ring == NULL) { LOG_ERROR("Could not open a pfring for setting device attributes: MAC address, interface index and HW clock"); return; } // set device MAC address uint8_t macAddress[6]; if (pfring_get_bound_device_address(ring, macAddress) < 0) LOG_ERROR("Unable to read the device MAC address for interface '%s'", m_DeviceName); else m_MacAddress = MacAddress(macAddress); // set interface ID if (pfring_get_bound_device_ifindex(ring, &m_InterfaceIndex) < 0) LOG_ERROR("Unable to read interface index of device"); // try to set hardware device clock m_HwClockEnabled = setPfRingDeviceClock(ring); // set interface MTU int mtu = pfring_get_mtu_size(ring); if (mtu < 0) LOG_ERROR("Could not get MTU. pfring_get_mtu_size returned an error: %d", mtu); else m_DeviceMTU = mtu + sizeof(ether_header) + sizeof(vlan_header); if (LoggerPP::getInstance().isDebugEnabled(PcapLogModulePfRingDevice)) { std::string hwEnabled = (m_HwClockEnabled ? "enabled" : "disabled"); LOG_DEBUG("Capturing from %s [%s][ifIndex: %d][MTU: %d], HW clock %s", m_DeviceName, m_MacAddress.toString().c_str(), m_InterfaceIndex, m_DeviceMTU, hwEnabled.c_str()); } if (closeRing) pfring_close(ring); }
static int max_packet_len(Pfring_Context_t *context, char *device, int id) { int max_len; pfring *ring; ring = pfring_open(device, 1536, PF_RING_PROMISC); if (ring == NULL) return 1536; pfring_get_bound_device_ifindex(ring, &context->ifindexes[id]); if (ring->dna.dna_mapped_device) { max_len = ring->dna.dna_dev.mem_info.rx.packet_memory_slot_len; } else { max_len = pfring_get_mtu_size(ring); if (max_len == 0) max_len = 9000; max_len += 14 + 4; } pfring_close(ring); return max_len; }
pfring *pfring_open(const char *device_name, u_int32_t caplen, u_int32_t flags) { int i = -1; int mod_found = 0; int ret; char *str, *str1; pfring *ring; #ifdef RING_DEBUG printf("[PF_RING] Attempting to pfring_open(%s)\n", device_name); #endif ring = (pfring*)malloc(sizeof(pfring)); if(ring == NULL) return NULL; if(caplen > MAX_CAPLEN) caplen = MAX_CAPLEN; memset(ring, 0, sizeof(pfring)); ring->caplen = caplen; ring->direction = rx_and_tx_direction; ring->mode = send_and_recv_mode; ring->ft_mode = software_only; ring->promisc = !!(flags & PF_RING_PROMISC); ring->reentrant = !!(flags & PF_RING_REENTRANT); ring->long_header = !!(flags & PF_RING_LONG_HEADER); ring->rss_mode = (flags & PF_RING_DNA_SYMMETRIC_RSS) ? PF_RING_DNA_SYMMETRIC_RSS : ( (flags & PF_RING_DNA_FIXED_RSS_Q_0) ? PF_RING_DNA_FIXED_RSS_Q_0 : 0); ring->force_timestamp = !!(flags & PF_RING_TIMESTAMP); ring->strip_hw_timestamp = !!(flags & PF_RING_STRIP_HW_TIMESTAMP); ring->hw_ts.enable_hw_timestamp = !!(flags & PF_RING_HW_TIMESTAMP); ring->tx.enabled_rx_packet_send = !!(flags & PF_RING_RX_PACKET_BOUNCE); ring->disable_parsing = !!(flags & PF_RING_DO_NOT_PARSE); ring->disable_timestamp = !!(flags & PF_RING_DO_NOT_TIMESTAMP); ring->chunk_mode_enabled = !!(flags & PF_RING_CHUNK_MODE); ring->ixia_timestamp_enabled = !!(flags & PF_RING_IXIA_TIMESTAMP); ring->force_userspace_bpf = !!(flags & PF_RING_USERSPACE_BPF); #ifdef RING_DEBUG printf("[PF_RING] pfring_open: device_name=%s\n", device_name); #endif /* modules */ if(device_name) { ret = -1; ring->device_name = NULL; while (pfring_module_list[++i].name) { str = str1 = NULL; #ifdef HAVE_DNA u_int8_t is_dna = 0; if(strcmp(pfring_module_list[i].name, "dna") == 0) { /* DNA module: check proc for renamed interfaces */ FILE *proc_net_pfr; char line[256]; char tmp[32]; char *at; snprintf(tmp, sizeof(tmp), "%s", device_name); at = strchr(tmp, '@'); if (at != NULL) at[0] = '\0'; snprintf(line, sizeof(line), "/proc/net/pf_ring/dev/%s/info", tmp); proc_net_pfr = fopen(line, "r"); if(proc_net_pfr != NULL) { const char *str_mode = "Polling Mode:"; while(fgets(line, sizeof(line), proc_net_pfr) != NULL) { char *p = &line[0]; if (!strncmp(p, str_mode, strlen(str_mode))) { p += strlen(str_mode); is_dna = (strstr(p, "DNA") != NULL); break; } } fclose(proc_net_pfr); } if (!is_dna) continue; } else #endif if(!(str = strstr(device_name, pfring_module_list[i].name))) continue; if(!pfring_module_list[i].open) continue; mod_found = 1; #ifdef RING_DEBUG printf("[PF_RING] pfring_open: found module %s\n", pfring_module_list[i].name); #endif if (str != NULL) { str1 = strchr(str, ':'); if (str1 != NULL) str1++; } ring->device_name = str1 ? strdup(str1) : strdup(device_name); ret = pfring_module_list[i].open(ring); break; } } /* default */ if(!mod_found) { ring->device_name = strdup(device_name ? device_name : "any"); ret = pfring_mod_open(ring); } if(ret < 0) { errno = ENODEV; if(ring->device_name) free(ring->device_name); free(ring); return NULL; } if(unlikely(ring->reentrant)) { pthread_rwlock_init(&ring->rx_lock, PTHREAD_PROCESS_PRIVATE); pthread_rwlock_init(&ring->tx_lock, PTHREAD_PROCESS_PRIVATE); } ring->socket_default_accept_policy = 1; /* Accept (default) */ ring->rdi.device_id = ring->rdi.port_id = -1; /* Default */ ring->mtu_len = pfring_get_mtu_size(ring); if(ring->mtu_len == 0) ring->mtu_len = 9000 /* Jumbo MTU */; ring->mtu_len += sizeof(struct ether_header) + sizeof(struct eth_vlan_hdr); pfring_get_bound_device_ifindex(ring, &ring->device_id); ring->initialized = 1; #ifdef RING_DEBUG printf("[PF_RING] Successfully open pfring_open(%s)\n", device_name); #endif return ring; }
pfring* pfring_open(const char *device_name, u_int32_t caplen, u_int32_t flags) { int i = -1; int mod_found = 0; int ret; char *str, *str1; pfring *ring; #ifdef RING_DEBUG printf("[PF_RING] Attempting to pfring_open(%s)\n", device_name); #endif ring = (pfring*)malloc(sizeof(pfring)); if(ring == NULL) return NULL; memset(ring, 0, sizeof(pfring)); ring->promisc = (flags & PF_RING_PROMISC) ? 1 : 0; ring->caplen = caplen; ring->reentrant = (flags & PF_RING_REENTRANT) ? 1 : 0; ring->direction = rx_and_tx_direction; ring->mode = send_and_recv_mode; ring->long_header = (flags & PF_RING_LONG_HEADER) ? 1 : 0; ring->rss_mode = (flags & PF_RING_DNA_SYMMETRIC_RSS) ? PF_RING_DNA_SYMMETRIC_RSS : ( (flags & PF_RING_DNA_FIXED_RSS_Q_0) ? PF_RING_DNA_FIXED_RSS_Q_0 : 0); ring->force_timestamp = (flags & PF_RING_TIMESTAMP) ? 1 : 0; ring->strip_hw_timestamp = (flags & PF_RING_STRIP_HW_TIMESTAMP) ? 1 : 0; ring->hw_ts.enable_hw_timestamp = (flags & PF_RING_HW_TIMESTAMP) ? 1 : 0; ring->tx.enabled_rx_packet_send = (flags & PF_RING_RX_PACKET_BOUNCE) ? 1 : 0; ring->disable_parsing = (flags & PF_RING_DO_NOT_PARSE) ? 1 : 0; ring->disable_timestamp = (flags & PF_RING_DO_NOT_TIMESTAMP) ? 1 : 0; #ifdef RING_DEBUG printf("pfring_open: device_name=%s\n", device_name); #endif /* modules */ if(device_name) { ret = -1; ring->device_name = NULL; while (pfring_module_list[++i].name) { str = str1 = NULL; #ifdef HAVE_DNA u_int8_t is_dna = 0; if(strcmp(pfring_module_list[i].name, "dna") == 0) { /* DNA module: check proc for renamed interfaces */ FILE *proc_net_pfr; char line[256]; snprintf(line, sizeof(line), "/proc/net/pf_ring/dev/%s/info", device_name); proc_net_pfr = fopen(line, "r"); if(proc_net_pfr != NULL) { const char *str_mode = "Polling Mode:"; while(fgets(line, sizeof(line), proc_net_pfr) != NULL) { char *p = &line[0]; if (!strncmp(p, str_mode, strlen(str_mode))) { p += strlen(str_mode); is_dna = (strstr(p, "DNA") != NULL); break; } } } } if (!is_dna) /* if already recognized as dna do not check module prefix */ #endif if(!(str = strstr(device_name, pfring_module_list[i].name))) continue; if(!pfring_module_list[i].open) continue; mod_found = 1; #ifdef RING_DEBUG printf("pfring_open: found module %s\n", pfring_module_list[i].name); #endif if (str != NULL) { str1 = strchr(str, ':'); if (str1 != NULL) str1++; } ring->device_name = str1 ? strdup(str1) : strdup(device_name); ret = pfring_module_list[i].open(ring); break; } } /* default */ if(!mod_found) { ring->device_name = strdup(device_name ? device_name : "any"); ret = pfring_mod_open(ring); } if(ret < 0) { if(ring->device_name) free(ring->device_name); free(ring); return NULL; } if(unlikely(ring->reentrant)) { pthread_rwlock_init(&ring->rx_lock, PTHREAD_PROCESS_PRIVATE); pthread_rwlock_init(&ring->tx_lock, PTHREAD_PROCESS_PRIVATE); } ring->socket_default_accept_policy = 1; /* Accept (default) */ ring->rdi.device_id = ring->rdi.port_id = -1; /* Default */ ring->mtu_len = pfring_get_mtu_size(ring); if(ring->mtu_len == 0) ring->mtu_len = 9000 /* Jumbo MTU */; ring->mtu_len += sizeof(struct ether_header); ring->initialized = 1; #ifdef RING_DEBUG printf("[PF_RING] Successfully open pfring_open(%s)\n", device_name); #endif return ring; }