Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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);
}
Exemplo n.º 3
0
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;
}
Exemplo n.º 4
0
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;
}
Exemplo n.º 5
0
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;
}