Skip to content

Commit

Permalink
DPDK: fix AF_PACKET frame size
Browse files Browse the repository at this point in the history
Change-Id: I7a329480bd3cad5c1dab1657a533f85ccccf63a2
Closes-bug: #1549567
  • Loading branch information
semihalf-berestovskyy-andriy committed Feb 26, 2016
1 parent a5a1cab commit e846848
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 21 deletions.
2 changes: 1 addition & 1 deletion dpdk/dpdk_vrouter.c
Expand Up @@ -534,7 +534,7 @@ dpdk_argv_update(void)
io_core_mask_str,
VR_DPDK_PACKET_LCORE_ID, VR_DPDK_FWD_LCORE_ID - 1, system_cpus_count - 1,
fwd_core_mask_str)
== sizeof(lcores_string)) {
>= sizeof(lcores_string)) {
return -1;
}
/* Append lcores option. */
Expand Down
49 changes: 29 additions & 20 deletions dpdk/vr_dpdk_interface.c
Expand Up @@ -245,46 +245,54 @@ dpdk_vlan_forwarding_if_add(void)
* The device is removed with dpdk_fabric_af_packet_if_del().
*/
static int
dpdk_af_packet_if_add(struct vr_interface *vif) {
dpdk_af_packet_if_add(struct vr_interface *vif)
{
int ret;
char params[VR_INTERFACE_NAME_LEN + 7];
char params[VR_DPDK_STR_BUF_SZ];
char name[VR_INTERFACE_NAME_LEN];
struct vr_dpdk_ethdev *ethdev;
uint8_t port_id;
int frame_size;

RTE_LOG(INFO, VROUTER, "Adding vif %u (gen. %u) af_packet device %s type %d transport %d\n",
vif->vif_idx, vif->vif_gen, vif->vif_name, vif->vif_type, vif->vif_transport);
RTE_LOG(INFO, VROUTER,
"Adding vif %u (gen. %u) af_packet device %s\n",
vif->vif_idx, vif->vif_gen, vif->vif_name);

ret = snprintf(name, VR_INTERFACE_NAME_LEN, "eth_vif_%d", vif->vif_idx);
if (ret < 0 || ret > VR_INTERFACE_NAME_LEN) {
RTE_LOG(ERR, VROUTER, "Error creating name for AF_PACKET %s\n", name);
ret = snprintf(name, sizeof(name), "eth_af_packet_%d", vif->vif_idx);
if (ret >= sizeof(name)) {
RTE_LOG(ERR, VROUTER,
" error creating name for af_packet device %s\n", name);
return ret;
}

/* Frame size should be a multiple of page size. */
frame_size = (VR_DPDK_MAX_PACKET_SZ + getpagesize() - 1) /
getpagesize() * getpagesize();
ret = snprintf(params, sizeof(params),
/* TODO: Optional af_packet mmap parameters
*
* "iface=%s,qpairs=%d,blocksz=%d,framesz=%d,framecnt=%d",
* vif->vif_name, 16, 4096, 2048, 512);
* "qpairs=%d,framecnt=%d", 16, 512);
*/
"iface=%s", vif->vif_name);
if (ret < 0 || ret > sizeof(params)) {
RTE_LOG(ERR, VROUTER, "Error creating config for AF_PACKET %s\n", name);
"iface=%s,framesz=%d,blocksz=%d",
vif->vif_name, frame_size, frame_size);
if (ret >= sizeof(params)) {
RTE_LOG(ERR, VROUTER,
" error creating config for af_packet device %s\n", name);
return ret;
}

ret = rte_pmd_af_packet_devinit(name, params);
ret = rte_eal_vdev_init(name, params);
if (ret < 0) {
RTE_LOG(ERR, VROUTER, "Error initializing AF_PACKET device %s\n", name);
RTE_LOG(ERR, VROUTER,
" error initializing af_packet device %s\n", name);
return ret;
}
port_id = (uint8_t)(rte_eth_dev_allocated(name) - rte_eth_devices);

ethdev = &vr_dpdk.ethdevs[port_id];
if (ethdev->ethdev_ptr != NULL) {
RTE_LOG(ERR, VROUTER,
"Error adding AF_PACKET device: PMD ID %"PRIu8" already added.\n",
port_id);
" error adding af_packet device %s: eth device %"PRIu8" already added\n",
name, port_id);
return -EEXIST;
}
ethdev->ethdev_port_id = port_id;
Expand All @@ -297,7 +305,8 @@ dpdk_af_packet_if_add(struct vr_interface *vif) {

ret = rte_eth_dev_start(port_id);
if (ret < 0) {
RTE_LOG(ERR, VROUTER, "Error starting eth device %" PRIu8": %s (%d)\n",
RTE_LOG(ERR, VROUTER,
" error starting eth device %" PRIu8": %s (%d)\n",
port_id, rte_strerror(-ret), -ret);
return ret;
}
Expand Down Expand Up @@ -410,8 +419,8 @@ dpdk_fabric_af_packet_if_del(struct vr_interface *vif)
* then vif->vif_os will be NULL.
*/
if (vif->vif_os == NULL) {
RTE_LOG(ERR, VROUTER, " error deleting %s dev %s: already removed\n",
vif_is_fabric(vif) ? "eth" : "af_packet", vif->vif_name);
RTE_LOG(ERR, VROUTER, " error deleting %s dev: already removed\n",
vif_is_fabric(vif) ? "eth" : "af_packet");
return -EEXIST;
}

Expand Down

0 comments on commit e846848

Please sign in to comment.