[dpdk-dev] Pcap question

2014-03-06 Thread liljegren.ma...@gmail.com
> I guess something is still wrong:

> testpmd application is reporting "PMD: pcap library cannot send packets,
> please rebuild with a more up to date libpcap" message when I try creating
> a bridge between two network cards.

> I am more than sure that older version of pcap is not installed:

> cigol at cigol-desktop:~/debug$ ls -l /usr/local/lib/*pcap*
> -rw-r--r-- 1 root root 1274936 Mar  5 23:26 /usr/local/lib/libpcap.a
> lrwxrwxrwx 1 root root  12 Mar  5 23:26 /usr/local/lib/libpcap.so ->
> libpcap.so.1
> lrwxrwxrwx 1 root root  16 Mar  5 23:26 /usr/local/lib/libpcap.so.1 ->
> libpcap.so.1.5.3
> -rwxr-xr-x 1 root root  786725 Mar  5 23:26 /usr/local/lib/libpcap.so.1.5.3

> Do you have any thoughts?

I had this problem a couple of months ago, and tracked it down to a
check for a macro named pcap_sendpacket. I didn't have this macro, but
it is a function, so I simply removed the check and got things
working.
I thought I mentioned this in the DPDK mailing list, but I cannot find
any evidence of this. So I probably didn't...

Since I have lost the original patch I used to solve this issue, I
made a new patch that might work for you, which you should be able to
find as a reply to this message. It was made completely out of my
memory of this and I haven't tested it, but the change is pretty
trivial so I'm sure you can work out any mistakes I might have made.

I hope this helps you.

Best regards,
Mats Liljegren


[dpdk-dev] [PATCH] pcap: Remove check for pcap_sendpacket

2014-03-06 Thread liljegren.ma...@gmail.com
From: Mats Liljegren 

Current test relies on the fact that pcap_sendpacket is a macro. Since it is
a function, the test fails, causing loss of sending ability when using pcap.

Signed-off-by: Mats Liljegren 
---
 lib/librte_pmd_pcap/rte_eth_pcap.h |4 
 1 file changed, 4 deletions(-)

diff --git a/lib/librte_pmd_pcap/rte_eth_pcap.h 
b/lib/librte_pmd_pcap/rte_eth_pcap.h
index c0bc5d8..0e28e0b 100644
--- a/lib/librte_pmd_pcap/rte_eth_pcap.h
+++ b/lib/librte_pmd_pcap/rte_eth_pcap.h
@@ -39,11 +39,7 @@ extern "C" {
 #endif
 #include 

-#ifdef pcap_sendpacket
 #define PCAP_CAN_SEND
-#else
-#undef PCAP_CAN_SEND
-#endif

 #define RTE_ETH_PCAP_PARAM_NAME "eth_pcap"

-- 
1.7.10.4



[dpdk-dev] [PATCH v3 0/2] Introduce if_index field to struct rte_eth_dev_info

2014-01-09 Thread liljegren.ma...@gmail.com
Changes since v1:
- Split into two patches: Generic and pcap specific.
- Changed interface name to interface index

Changes since v2:
- Interface index is now unsigned
- Value 0 used as error rather than 0
- Added missing include of net/if.h in rte_eth_pcap.c
- Declared struct args_dict in rte_eth_pcap.h



[dpdk-dev] [PATCH v3 1/2] ethdev: Introduce if_index field to struct rte_eth_dev_info

2014-01-09 Thread liljegren.ma...@gmail.com
From: Mats Liljegren 

This field is intended for pcap to describe the name of the interface
as known to Linux. It is an interface index, but can be translated into
an interface name using if_indextoname() function.

When using pcap, interrupt affinity becomes important, and this field
gives the application a chance to ensure that interrupt affinity is set
to the lcore handling the device.

Signed-off-by: Mats Liljegren 
---
 lib/librte_ether/rte_ethdev.c |1 +
 lib/librte_ether/rte_ethdev.h |1 +
 2 files changed, 2 insertions(+)

diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
index 859ec92..09cc4c7 100644
--- a/lib/librte_ether/rte_ethdev.c
+++ b/lib/librte_ether/rte_ethdev.c
@@ -1037,6 +1037,7 @@ rte_eth_dev_info_get(uint8_t port_id, struct 
rte_eth_dev_info *dev_info)
/* Default device offload capabilities to zero */
dev_info->rx_offload_capa = 0;
dev_info->tx_offload_capa = 0;
+   dev_info->if_index = 0;
FUNC_PTR_OR_RET(*dev->dev_ops->dev_infos_get);
(*dev->dev_ops->dev_infos_get)(dev, dev_info);
dev_info->pci_dev = dev->pci_dev;
diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
index 302d378..b4f839d 100644
--- a/lib/librte_ether/rte_ethdev.h
+++ b/lib/librte_ether/rte_ethdev.h
@@ -787,6 +787,7 @@ struct rte_eth_conf {
 struct rte_eth_dev_info {
struct rte_pci_device *pci_dev; /**< Device PCI information. */
const char *driver_name; /**< Device Driver name. */
+   unsigned int if_index; /**< Index to bounded host interface, or 0 if 
none. Use if_indextoname() to translate into an interface name. */
uint32_t min_rx_bufsize; /**< Minimum size of RX buffer. */
uint32_t max_rx_pktlen; /**< Maximum configurable length of RX pkt. */
uint16_t max_rx_queues; /**< Maximum number of RX queues. */
-- 
1.7.10.4



[dpdk-dev] [PATCH v3 2/2] pcap: Fill in if_index field for rte_eth_dev_info_get()

2014-01-09 Thread liljegren.ma...@gmail.com
From: Mats Liljegren 

Signed-off-by: Mats Liljegren 
---
 lib/librte_pmd_pcap/rte_eth_pcap.c |   36 
 lib/librte_pmd_pcap/rte_eth_pcap.h |9 +++--
 2 files changed, 35 insertions(+), 10 deletions(-)

diff --git a/lib/librte_pmd_pcap/rte_eth_pcap.c 
b/lib/librte_pmd_pcap/rte_eth_pcap.c
index 87d1306..2912b5f 100644
--- a/lib/librte_pmd_pcap/rte_eth_pcap.c
+++ b/lib/librte_pmd_pcap/rte_eth_pcap.c
@@ -38,6 +38,7 @@
 #include 
 #include 
 #include 
+#include 

 #include "rte_eth_pcap.h"
 #include "rte_eth_pcap_arg_parser.h"
@@ -86,6 +87,8 @@ struct pmd_internals {
unsigned nb_rx_queues;
unsigned nb_tx_queues;

+   int if_index;
+
struct pcap_rx_queue rx_queue[RTE_PMD_RING_MAX_RX_RINGS];
struct pcap_tx_queue tx_queue[RTE_PMD_RING_MAX_TX_RINGS];
 };
@@ -300,6 +303,7 @@ eth_dev_info(struct rte_eth_dev *dev,
 {
struct pmd_internals *internals = dev->data->dev_private;
dev_info->driver_name = drivername;
+   dev_info->if_index = internals->if_index;
dev_info->max_mac_addrs = 1;
dev_info->max_rx_pktlen = (uint32_t) -1;
dev_info->max_rx_queues = (uint16_t)internals->nb_rx_queues;
@@ -543,10 +547,19 @@ rte_pmd_init_internals(const unsigned nb_rx_queues,
const unsigned nb_tx_queues,
const unsigned numa_node,
struct pmd_internals **internals,
-   struct rte_eth_dev **eth_dev)
+   struct rte_eth_dev **eth_dev,
+   struct args_dict *dict)
 {
struct rte_eth_dev_data *data = NULL;
struct rte_pci_device *pci_dev = NULL;
+   unsigned k_idx;
+   struct key_value *pair;
+
+   for (k_idx = 0; k_idx < dict->index; k_idx++) {
+   pair = &dict->pairs[k_idx];
+   if (strstr(pair->key, ETH_PCAP_IFACE_ARG) != NULL)
+   break;
+   }

RTE_LOG(INFO, PMD,
"Creating pcap-backed ethdev on numa socket %u\n", 
numa_node);
@@ -583,6 +596,11 @@ rte_pmd_init_internals(const unsigned nb_rx_queues,
(*internals)->nb_rx_queues = nb_rx_queues;
(*internals)->nb_tx_queues = nb_tx_queues;

+   if (k_idx == dict->index)
+   (*internals)->if_index = 0;
+   else
+   (*internals)->if_index = if_nametoindex(pair->value);
+
pci_dev->numa_node = numa_node;

data->dev_private = *internals;
@@ -612,7 +630,8 @@ rte_eth_from_pcaps_n_dumpers(pcap_t * const rx_queues[],
const unsigned nb_rx_queues,
pcap_dumper_t * const tx_queues[],
const unsigned nb_tx_queues,
-   const unsigned numa_node)
+   const unsigned numa_node,
+   struct args_dict *dict)
 {
struct pmd_internals *internals = NULL;
struct rte_eth_dev *eth_dev = NULL;
@@ -625,7 +644,7 @@ rte_eth_from_pcaps_n_dumpers(pcap_t * const rx_queues[],
return -1;

if (rte_pmd_init_internals(nb_rx_queues, nb_tx_queues, numa_node,
-   &internals, ð_dev) < 0)
+   &internals, ð_dev, dict) < 0)
return -1;

for (i = 0; i < nb_rx_queues; i++) {
@@ -646,7 +665,8 @@ rte_eth_from_pcaps(pcap_t * const rx_queues[],
const unsigned nb_rx_queues,
pcap_t * const tx_queues[],
const unsigned nb_tx_queues,
-   const unsigned numa_node)
+   const unsigned numa_node,
+   struct args_dict *dict)
 {
struct pmd_internals *internals = NULL;
struct rte_eth_dev *eth_dev = NULL;
@@ -659,7 +679,7 @@ rte_eth_from_pcaps(pcap_t * const rx_queues[],
return -1;

if (rte_pmd_init_internals(nb_rx_queues, nb_tx_queues, numa_node,
-   &internals, ð_dev) < 0)
+   &internals, ð_dev, dict) < 0)
return -1;

for (i = 0; i < nb_rx_queues; i++) {
@@ -707,7 +727,7 @@ rte_pmd_pcap_init(const char *name, const char *params)
if (ret < 0)
return -1;

-   return rte_eth_from_pcaps(pcaps.pcaps, 1, pcaps.pcaps, 1, 
numa_node);
+   return rte_eth_from_pcaps(pcaps.pcaps, 1, pcaps.pcaps, 1, 
numa_node, &dict);
}

/*
@@ -748,10 +768,10 @@ rte_pmd_pcap_init(const char *name, const char *params)

if (using_dumpers)
return rte_eth_from_pcaps_n_dumpers(pcaps.pcaps, 
pcaps.num_of_rx,
-   dumpers.dumpers, dumpers.num_of_tx, numa_node);
+   dumpers.dumpers, dumpers.num_of_tx, numa_node, 
&dict);

return rte_eth_from_pcaps(pcaps.pcaps, pcaps.num_of_rx, dumpers.pcaps,
-   dumpers.num_of_tx, numa_node);
+   dumpers.num_of_tx, numa_node, &dict);

 }

diff --git a/lib/librte_pmd_pcap/rte_eth_pcap.h 
b/lib/librte_pmd_pcap/rte_eth_pcap.h
inde

[dpdk-dev] [PATCH v4 0/2] introduce if_index in device info

2014-01-24 Thread liljegren.ma...@gmail.com
Changes since v1:
- Split into two patches: Generic and pcap specific.
- Changed interface name to interface index

Changes since v2:
- Interface index is now unsigned
- Value 0 used as error rather than 0
- Added missing include of net/if.h in rte_eth_pcap.c
- Declared struct args_dict in rte_eth_pcap.h

Changes since v3:
- Changed commit messages
- Removed compiler warning about unused variable pair



[dpdk-dev] [PATCH v4 1/2] ethdev: introduce if_index in device info

2014-01-24 Thread liljegren.ma...@gmail.com
From: Mats Liljegren 

This field is intended for pcap to describe the name of the interface
as known to Linux. It is an interface index, but can be translated into
an interface name using if_indextoname() function.

When using pcap, interrupt affinity becomes important, and this field
gives the application a chance to ensure that interrupt affinity is set
to the lcore handling the device.

Signed-off-by: Mats Liljegren 
---
 lib/librte_ether/rte_ethdev.c |1 +
 lib/librte_ether/rte_ethdev.h |2 ++
 2 files changed, 3 insertions(+)

diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
index 859ec92..09cc4c7 100644
--- a/lib/librte_ether/rte_ethdev.c
+++ b/lib/librte_ether/rte_ethdev.c
@@ -1037,6 +1037,7 @@ rte_eth_dev_info_get(uint8_t port_id, struct 
rte_eth_dev_info *dev_info)
/* Default device offload capabilities to zero */
dev_info->rx_offload_capa = 0;
dev_info->tx_offload_capa = 0;
+   dev_info->if_index = 0;
FUNC_PTR_OR_RET(*dev->dev_ops->dev_infos_get);
(*dev->dev_ops->dev_infos_get)(dev, dev_info);
dev_info->pci_dev = dev->pci_dev;
diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h
index 302d378..89e343c 100644
--- a/lib/librte_ether/rte_ethdev.h
+++ b/lib/librte_ether/rte_ethdev.h
@@ -787,6 +787,8 @@ struct rte_eth_conf {
 struct rte_eth_dev_info {
struct rte_pci_device *pci_dev; /**< Device PCI information. */
const char *driver_name; /**< Device Driver name. */
+   unsigned int if_index; /**< Index to bounded host interface, or 0 if 
none.
+   Use if_indextoname() to translate into an interface name. */
uint32_t min_rx_bufsize; /**< Minimum size of RX buffer. */
uint32_t max_rx_pktlen; /**< Maximum configurable length of RX pkt. */
uint16_t max_rx_queues; /**< Maximum number of RX queues. */
-- 
1.7.10.4



[dpdk-dev] [PATCH v4 2/2] pcap: save if_index of the bound device

2014-01-24 Thread liljegren.ma...@gmail.com
From: Mats Liljegren 

Use command line parameters to get the name of the interface.
This name is converted into if_index, which is provided as
device info.

Signed-off-by: Mats Liljegren 
---
 lib/librte_pmd_pcap/rte_eth_pcap.c |   36 
 lib/librte_pmd_pcap/rte_eth_pcap.h |9 +++--
 2 files changed, 35 insertions(+), 10 deletions(-)

diff --git a/lib/librte_pmd_pcap/rte_eth_pcap.c 
b/lib/librte_pmd_pcap/rte_eth_pcap.c
index 87d1306..2345ecd 100644
--- a/lib/librte_pmd_pcap/rte_eth_pcap.c
+++ b/lib/librte_pmd_pcap/rte_eth_pcap.c
@@ -38,6 +38,7 @@
 #include 
 #include 
 #include 
+#include 

 #include "rte_eth_pcap.h"
 #include "rte_eth_pcap_arg_parser.h"
@@ -86,6 +87,8 @@ struct pmd_internals {
unsigned nb_rx_queues;
unsigned nb_tx_queues;

+   int if_index;
+
struct pcap_rx_queue rx_queue[RTE_PMD_RING_MAX_RX_RINGS];
struct pcap_tx_queue tx_queue[RTE_PMD_RING_MAX_TX_RINGS];
 };
@@ -300,6 +303,7 @@ eth_dev_info(struct rte_eth_dev *dev,
 {
struct pmd_internals *internals = dev->data->dev_private;
dev_info->driver_name = drivername;
+   dev_info->if_index = internals->if_index;
dev_info->max_mac_addrs = 1;
dev_info->max_rx_pktlen = (uint32_t) -1;
dev_info->max_rx_queues = (uint16_t)internals->nb_rx_queues;
@@ -543,10 +547,19 @@ rte_pmd_init_internals(const unsigned nb_rx_queues,
const unsigned nb_tx_queues,
const unsigned numa_node,
struct pmd_internals **internals,
-   struct rte_eth_dev **eth_dev)
+   struct rte_eth_dev **eth_dev,
+   struct args_dict *dict)
 {
struct rte_eth_dev_data *data = NULL;
struct rte_pci_device *pci_dev = NULL;
+   unsigned k_idx;
+   struct key_value *pair = NULL;
+
+   for (k_idx = 0; k_idx < dict->index; k_idx++) {
+   pair = &dict->pairs[k_idx];
+   if (strstr(pair->key, ETH_PCAP_IFACE_ARG) != NULL)
+   break;
+   }

RTE_LOG(INFO, PMD,
"Creating pcap-backed ethdev on numa socket %u\n", 
numa_node);
@@ -583,6 +596,11 @@ rte_pmd_init_internals(const unsigned nb_rx_queues,
(*internals)->nb_rx_queues = nb_rx_queues;
(*internals)->nb_tx_queues = nb_tx_queues;

+   if (pair == NULL)
+   (*internals)->if_index = 0;
+   else
+   (*internals)->if_index = if_nametoindex(pair->value);
+
pci_dev->numa_node = numa_node;

data->dev_private = *internals;
@@ -612,7 +630,8 @@ rte_eth_from_pcaps_n_dumpers(pcap_t * const rx_queues[],
const unsigned nb_rx_queues,
pcap_dumper_t * const tx_queues[],
const unsigned nb_tx_queues,
-   const unsigned numa_node)
+   const unsigned numa_node,
+   struct args_dict *dict)
 {
struct pmd_internals *internals = NULL;
struct rte_eth_dev *eth_dev = NULL;
@@ -625,7 +644,7 @@ rte_eth_from_pcaps_n_dumpers(pcap_t * const rx_queues[],
return -1;

if (rte_pmd_init_internals(nb_rx_queues, nb_tx_queues, numa_node,
-   &internals, ð_dev) < 0)
+   &internals, ð_dev, dict) < 0)
return -1;

for (i = 0; i < nb_rx_queues; i++) {
@@ -646,7 +665,8 @@ rte_eth_from_pcaps(pcap_t * const rx_queues[],
const unsigned nb_rx_queues,
pcap_t * const tx_queues[],
const unsigned nb_tx_queues,
-   const unsigned numa_node)
+   const unsigned numa_node,
+   struct args_dict *dict)
 {
struct pmd_internals *internals = NULL;
struct rte_eth_dev *eth_dev = NULL;
@@ -659,7 +679,7 @@ rte_eth_from_pcaps(pcap_t * const rx_queues[],
return -1;

if (rte_pmd_init_internals(nb_rx_queues, nb_tx_queues, numa_node,
-   &internals, ð_dev) < 0)
+   &internals, ð_dev, dict) < 0)
return -1;

for (i = 0; i < nb_rx_queues; i++) {
@@ -707,7 +727,7 @@ rte_pmd_pcap_init(const char *name, const char *params)
if (ret < 0)
return -1;

-   return rte_eth_from_pcaps(pcaps.pcaps, 1, pcaps.pcaps, 1, 
numa_node);
+   return rte_eth_from_pcaps(pcaps.pcaps, 1, pcaps.pcaps, 1, 
numa_node, &dict);
}

/*
@@ -748,10 +768,10 @@ rte_pmd_pcap_init(const char *name, const char *params)

if (using_dumpers)
return rte_eth_from_pcaps_n_dumpers(pcaps.pcaps, 
pcaps.num_of_rx,
-   dumpers.dumpers, dumpers.num_of_tx, numa_node);
+   dumpers.dumpers, dumpers.num_of_tx, numa_node, 
&dict);

return rte_eth_from_pcaps(pcaps.pcaps, pcaps.num_of_rx, dumpers.pcaps,
-   dumpers.num_of_tx, numa_node);
+