blob: 0c81dbc3beb3b497955b8d79e972bd12e68c5a0c [file] [log] [blame]
Ed Warnickecb9cada2015-12-08 15:45:58 -07001/*
2 * Copyright (c) 2015 Cisco and/or its affiliates.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at:
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
Damjan Marion696f1ad2016-12-23 22:42:41 +010016#define DPDK_NB_RX_DESC_DEFAULT 1024
17#define DPDK_NB_TX_DESC_DEFAULT 1024
Ed Warnickecb9cada2015-12-08 15:45:58 -070018#define DPDK_NB_RX_DESC_VIRTIO 256
19#define DPDK_NB_TX_DESC_VIRTIO 256
Ed Warnickecb9cada2015-12-08 15:45:58 -070020
Damjan Marion1f0da172016-07-13 22:44:18 +020021#define I40E_DEV_ID_SFP_XL710 0x1572
22#define I40E_DEV_ID_QSFP_A 0x1583
23#define I40E_DEV_ID_QSFP_B 0x1584
24#define I40E_DEV_ID_QSFP_C 0x1585
25#define I40E_DEV_ID_10G_BASE_T 0x1586
26#define I40E_DEV_ID_VF 0x154C
Damjan Marion1f0da172016-07-13 22:44:18 +020027
Ed Warnickecb9cada2015-12-08 15:45:58 -070028/* These args appear by themselves */
29#define foreach_eal_double_hyphen_predicate_arg \
30_(no-shconf) \
31_(no-hpet) \
Ed Warnickecb9cada2015-12-08 15:45:58 -070032_(no-huge) \
Damjan Marionf530a552016-10-25 18:53:41 +020033_(vmware-tsc-map)
Ed Warnickecb9cada2015-12-08 15:45:58 -070034
35#define foreach_eal_single_hyphen_mandatory_arg \
36_(coremask, c) \
37_(nchannels, n) \
38
39#define foreach_eal_single_hyphen_arg \
40_(blacklist, b) \
41_(mem-alloc-request, m) \
42_(force-ranks, r)
43
44/* These args are preceeded by "--" and followed by a single string */
45#define foreach_eal_double_hyphen_arg \
46_(huge-dir) \
47_(proc-type) \
48_(file-prefix) \
Ed Warnickecb9cada2015-12-08 15:45:58 -070049_(vdev)
50
Ed Warnickecb9cada2015-12-08 15:45:58 -070051static inline void
Sean Hopea4f16a02016-03-28 13:11:31 -040052dpdk_get_xstats (dpdk_device_t * xd)
53{
54 int len;
Damjan Marion25665672016-08-16 18:56:08 +020055 if ((len = rte_eth_xstats_get (xd->device_index, NULL, 0)) > 0)
Sean Hopea4f16a02016-03-28 13:11:31 -040056 {
Damjan Marion25665672016-08-16 18:56:08 +020057 vec_validate (xd->xstats, len - 1);
58 vec_validate (xd->last_cleared_xstats, len - 1);
Sean Hopea4f16a02016-03-28 13:11:31 -040059
Damjan Marion25665672016-08-16 18:56:08 +020060 len =
61 rte_eth_xstats_get (xd->device_index, xd->xstats,
62 vec_len (xd->xstats));
Sean Hopea4f16a02016-03-28 13:11:31 -040063
Damjan Marion25665672016-08-16 18:56:08 +020064 ASSERT (vec_len (xd->xstats) == len);
65 ASSERT (vec_len (xd->last_cleared_xstats) == len);
Sean Hopea4f16a02016-03-28 13:11:31 -040066
Damjan Marion25665672016-08-16 18:56:08 +020067 _vec_len (xd->xstats) = len;
68 _vec_len (xd->last_cleared_xstats) = len;
Sean Hopea4f16a02016-03-28 13:11:31 -040069
70 }
71}
72
73
74static inline void
Ed Warnickecb9cada2015-12-08 15:45:58 -070075dpdk_update_counters (dpdk_device_t * xd, f64 now)
76{
Damjan Marion25665672016-08-16 18:56:08 +020077 vlib_simple_counter_main_t *cm;
78 vnet_main_t *vnm = vnet_get_main ();
79 u32 my_cpu = os_get_cpu_number ();
Ed Warnickecb9cada2015-12-08 15:45:58 -070080 u64 rxerrors, last_rxerrors;
Ed Warnickecb9cada2015-12-08 15:45:58 -070081
82 /* only update counters for PMD interfaces */
Damjan Marion56431702016-09-19 13:18:09 +020083 if ((xd->flags & DPDK_DEVICE_FLAG_PMD) == 0)
Ed Warnickecb9cada2015-12-08 15:45:58 -070084 return;
85
Damjan Marionb28e4982016-08-22 22:34:38 +020086 xd->time_last_stats_update = now ? now : xd->time_last_stats_update;
87 clib_memcpy (&xd->last_stats, &xd->stats, sizeof (xd->last_stats));
88 rte_eth_stats_get (xd->device_index, &xd->stats);
89
90 /* maybe bump interface rx no buffer counter */
91 if (PREDICT_FALSE (xd->stats.rx_nombuf != xd->last_stats.rx_nombuf))
Ed Warnickecb9cada2015-12-08 15:45:58 -070092 {
Damjan Marionb28e4982016-08-22 22:34:38 +020093 cm = vec_elt_at_index (vnm->interface_main.sw_if_counters,
94 VNET_INTERFACE_COUNTER_RX_NO_BUF);
Ed Warnickecb9cada2015-12-08 15:45:58 -070095
Damjan Marionb28e4982016-08-22 22:34:38 +020096 vlib_increment_simple_counter (cm, my_cpu, xd->vlib_sw_if_index,
97 xd->stats.rx_nombuf -
98 xd->last_stats.rx_nombuf);
99 }
Ed Warnickecb9cada2015-12-08 15:45:58 -0700100
Damjan Marionb28e4982016-08-22 22:34:38 +0200101 /* missed pkt counter */
102 if (PREDICT_FALSE (xd->stats.imissed != xd->last_stats.imissed))
103 {
104 cm = vec_elt_at_index (vnm->interface_main.sw_if_counters,
105 VNET_INTERFACE_COUNTER_RX_MISS);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700106
Damjan Marionb28e4982016-08-22 22:34:38 +0200107 vlib_increment_simple_counter (cm, my_cpu, xd->vlib_sw_if_index,
108 xd->stats.imissed -
109 xd->last_stats.imissed);
110 }
111 rxerrors = xd->stats.ierrors;
112 last_rxerrors = xd->last_stats.ierrors;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700113
Damjan Marionb28e4982016-08-22 22:34:38 +0200114 if (PREDICT_FALSE (rxerrors != last_rxerrors))
115 {
116 cm = vec_elt_at_index (vnm->interface_main.sw_if_counters,
117 VNET_INTERFACE_COUNTER_RX_ERROR);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700118
Damjan Marionb28e4982016-08-22 22:34:38 +0200119 vlib_increment_simple_counter (cm, my_cpu, xd->vlib_sw_if_index,
120 rxerrors - last_rxerrors);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700121 }
122
Damjan Marion25665672016-08-16 18:56:08 +0200123 dpdk_get_xstats (xd);
Ed Warnickecb9cada2015-12-08 15:45:58 -0700124}
Damjan Marion25665672016-08-16 18:56:08 +0200125
126/*
127 * fd.io coding-style-patch-verification: ON
128 *
129 * Local Variables:
130 * eval: (c-set-style "gnu")
131 * End:
132 */