summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsongyanchao <[email protected]>2023-04-03 13:00:03 +0000
committersongyanchao <[email protected]>2023-04-03 13:00:03 +0000
commit48f8f83281d516b06e05dc037391f4317baf823a (patch)
treef91e69ed722ed0d01413a60b9e10aed49f924355
parent35012175d3db9e3ea7c1db9cfb9b69b18e2bf163 (diff)
🐞 fix(DPISDN-5): 修复Classifier ipv4 数据包快速匹配无效,以及mrpdump处理2000字节以上大包异常问题。v4.6.21-20230403
修复Classifier ipv4 数据包快速匹配无效,以及mrpdump处理2000字节以上大包异常问题。
-rw-r--r--service/include/sc_pdump.h6
-rw-r--r--service/src/mrb.c11
-rw-r--r--service/src/node_classifier.c4
-rw-r--r--service/src/pdump.c35
-rw-r--r--tools/tcpdump/pdump.c18
5 files changed, 45 insertions, 29 deletions
diff --git a/service/include/sc_pdump.h b/service/include/sc_pdump.h
index 83ff21a..19dd2cf 100644
--- a/service/include/sc_pdump.h
+++ b/service/include/sc_pdump.h
@@ -7,8 +7,8 @@
#define MR_PDUMP_MP "mr_pdump"
#define MR_PDUMP_MEMPOOL_NUM 16
#define MR_PDUMP_RING_NUM MR_PDUMP_MEMPOOL_NUM
-#define MR_PDUMP_SHMDEV_MEMPOOL_NAME "mr_pdump_shmdev_mempool"
-#define MR_PDUMP_PHYDEV_MEMPOOL_NAME "mr_pdump_phydev_mempool"
+#define MR_PDUMP_SHMDEV_MEMPOOL_NAME "pdump_shmdev_mempool"
+#define MR_PDUMP_PHYDEV_MEMPOOL_NAME "pdump_phydev_mempool"
#define MR_PDUMP_MBUFS_PER_POOL 65535
#define MR_PDUMP_POOL_CACHE_SIZE 250
#define MR_PDUMP_RX_RING "mr_pdump_rx_ring_%d"
@@ -73,4 +73,4 @@ struct mr_pdump_response
};
extern void mr_pdump_rx(port_id_t port_id, queue_id_t qid, struct rte_mbuf ** mbufs, unsigned int nr_pkts);
-extern void mr_pdump_tx(port_id_t port_id, queue_id_t qid, struct rte_mbuf ** mbufs, unsigned int nr_pkts); \ No newline at end of file
+extern void mr_pdump_tx(port_id_t port_id, queue_id_t qid, struct rte_mbuf ** mbufs, unsigned int nr_pkts);
diff --git a/service/src/mrb.c b/service/src/mrb.c
index f748a72..e7615a9 100644
--- a/service/src/mrb.c
+++ b/service/src/mrb.c
@@ -23,6 +23,7 @@
#include <sc_common.h>
#include <sc_hwinfo.h>
#include <sc_mrb.h>
+#include <sc_pdump.h>
enum mrb_create_mode
{
@@ -220,7 +221,8 @@ static struct rte_mempool * __create_pktmbuf_pool(struct mrb_main * ctx, const c
char _pool_symbol[MR_SYMBOL_MAX];
snprintf(_pool_symbol, sizeof(_pool_symbol) - 1, "MZ_%s", symbol);
- struct rte_mempool * pool = rte_pktmbuf_pool_create(_pool_symbol, sz_pool, sz_cache, sz_align_priv, sz_data, socket_id);
+ struct rte_mempool * pool =
+ rte_pktmbuf_pool_create(_pool_symbol, sz_pool, sz_cache, sz_align_priv, sz_data, socket_id);
if (unlikely(pool == NULL))
{
MR_WARNING("Creating pktmbuf pool %s failed : %s", symbol, MR_STR_RTEERRNO());
@@ -273,6 +275,11 @@ int mrb_pool_adapter_create_pool_common(struct mrb_pool_adapter * adapter, struc
MR_INFO("Pktmbuf pool %s on socket %d created.", mrb_pool_iter->symbol, mrb_pool_iter->socket_id);
}
+ __create_pktmbuf_pool(ctx, MR_PDUMP_SHMDEV_MEMPOOL_NAME, SOCKET_ID_ANY, MR_PDUMP_MBUFS_PER_POOL,
+ RTE_MBUF_DEFAULT_BUF_SIZE, MR_PDUMP_POOL_CACHE_SIZE);
+ __create_pktmbuf_pool(ctx, MR_PDUMP_PHYDEV_MEMPOOL_NAME, SOCKET_ID_ANY, MR_PDUMP_MBUFS_PER_POOL,
+ RTE_MBUF_DEFAULT_BUF_SIZE, MR_PDUMP_POOL_CACHE_SIZE);
+
return 0;
}
@@ -737,4 +744,4 @@ int mrb_buffer_leak_detect(struct sc_main * sc)
}
return 0;
-} \ No newline at end of file
+}
diff --git a/service/src/node_classifier.c b/service/src/node_classifier.c
index 0c4f253..74438e0 100644
--- a/service/src/node_classifier.c
+++ b/service/src/node_classifier.c
@@ -1306,9 +1306,9 @@ void check_fast_match_condition(struct classifier_table * _table)
break;
if (rule->field[CLASSIFIER_IPV4_FIELD_DST_IP].mask_range.u32 != 0)
break;
- if (rule->field[CLASSIFIER_IPV4_FIELD_SRC_PORT].mask_range.u16 != 0)
+ if (rule->field[CLASSIFIER_IPV4_FIELD_SRC_PORT].mask_range.u16 != MR_CLASSIFIER_DEFAULT_PORT_END)
break;
- if (rule->field[CLASSIFIER_IPV4_FIELD_DST_PORT].mask_range.u16 != 0)
+ if (rule->field[CLASSIFIER_IPV4_FIELD_DST_PORT].mask_range.u16 != MR_CLASSIFIER_DEFAULT_PORT_END)
break;
if (rule->field[CLASSIFIER_IPV4_FIELD_PROTO].mask_range.u8 != 0)
break;
diff --git a/service/src/pdump.c b/service/src/pdump.c
index df62cd9..6560d87 100644
--- a/service/src/pdump.c
+++ b/service/src/pdump.c
@@ -7,6 +7,7 @@
#include <rte_ring.h>
#include <sc_pdump.h>
#include <sys/utsname.h>
+#include <unistd.h>
/* Mrpdump copy function */
typedef void (*mr_pdump_func)(struct rte_mempool * mp, struct rte_ring * ring, struct rte_mbuf ** mbufs,
@@ -282,7 +283,7 @@ static char * get_os_info(void)
/* Mrpdump create */
int mr_pdump_pcapng_create(const struct mr_pdump_request * _cli_req, struct mr_pdump_response * _out_response,
- struct rte_mp_msg * _out_mp_resp)
+ struct rte_mp_msg * _out_mp_resp, int * _out_pcapng_fd)
{
int32_t err_value = MR_PDUMP_SUCESS;
@@ -306,6 +307,7 @@ int mr_pdump_pcapng_create(const struct mr_pdump_request * _cli_req, struct mr_p
MR_INFO("mrpdump create '%s' .", _cli_req->dumpfile_path);
rte_free(_cli_req->dumpfile_path);
+ *_out_pcapng_fd = pcapng_fd;
return RT_SUCCESS;
}
@@ -342,6 +344,7 @@ static int mr_pdump_server(const struct rte_mp_msg * mp_msg, const void * peer)
}
/* Check res op */
+ int pcapng_fd = -1;
if (_cli_req->op == ENABLE)
{
mr_pdump_enable(_cli_req, &response, dev_desc);
@@ -352,17 +355,24 @@ static int mr_pdump_server(const struct rte_mp_msg * mp_msg, const void * peer)
}
else if (_cli_req->op == CREATE_PCAPNG)
{
- mr_pdump_pcapng_create(_cli_req, &response, &mp_resp);
+ mr_pdump_pcapng_create(_cli_req, &response, &mp_resp, &pcapng_fd);
}
done:
+ /* Send response */
memcpy(_resp, &response, sizeof(struct mr_pdump_response));
- if (rte_mp_reply(&mp_resp, peer) < 0)
+ int ret = rte_mp_reply(&mp_resp, peer);
+
+ /* close pcapng fd */
+ if (_cli_req->op == CREATE_PCAPNG)
+ close(pcapng_fd);
+
+ /* Check response */
+ if (ret < 0)
{
MR_ERROR("mrpdump failed to send to client:%s.", strerror(rte_errno));
return -1;
}
-
return 0;
}
@@ -382,21 +392,20 @@ int mr_pdump_init(struct sc_main * sc)
}
/* Create mempool */
- struct rte_mempool * mr_pdump_shmdev_mempool =
- rte_pktmbuf_pool_create(MR_PDUMP_SHMDEV_MEMPOOL_NAME, MR_PDUMP_MBUFS_PER_POOL, MR_PDUMP_POOL_CACHE_SIZE, 0,
- RTE_MBUF_DEFAULT_BUF_SIZE, rte_socket_id());
+ char _pool_symbol[MR_SYMBOL_MAX];
+ snprintf(_pool_symbol, sizeof(_pool_symbol) - 1, "MZ_%s", MR_PDUMP_SHMDEV_MEMPOOL_NAME);
+ struct rte_mempool * mr_pdump_shmdev_mempool = rte_mempool_lookup(_pool_symbol);
if (mr_pdump_shmdev_mempool == NULL)
{
- MR_ERROR("mrpdump shmdev mempool create err.");
+ MR_ERROR("mrpdump shmdev mempool no create .");
return RT_ERR;
}
- struct rte_mempool * mr_pdump_phydev_mempool =
- rte_pktmbuf_pool_create(MR_PDUMP_PHYDEV_MEMPOOL_NAME, MR_PDUMP_MBUFS_PER_POOL, MR_PDUMP_POOL_CACHE_SIZE, 0,
- RTE_MBUF_DEFAULT_BUF_SIZE, rte_socket_id());
+ snprintf(_pool_symbol, sizeof(_pool_symbol) - 1, "MZ_%s", MR_PDUMP_PHYDEV_MEMPOOL_NAME);
+ struct rte_mempool * mr_pdump_phydev_mempool = rte_mempool_lookup(_pool_symbol);
if (mr_pdump_phydev_mempool == NULL)
{
- MR_ERROR("mrpdump phydev mempool create err.");
+ MR_ERROR("mrpdump phydev mempool no create .");
return RT_ERR;
}
@@ -438,4 +447,4 @@ int mr_pdump_init(struct sc_main * sc)
}
return RT_SUCCESS;
-} \ No newline at end of file
+}
diff --git a/tools/tcpdump/pdump.c b/tools/tcpdump/pdump.c
index b3aad7d..7aae733 100644
--- a/tools/tcpdump/pdump.c
+++ b/tools/tcpdump/pdump.c
@@ -524,8 +524,8 @@ static unsigned int mbuf_burst_segs(struct rte_mbuf * pkts[], unsigned int n)
int mr_pcapng_set_opt(struct rte_mbuf * mbuf, uint16_t port_id, uint32_t flags)
{
/* pad the packet to 32 bit boundary */
- uint32_t data_len = rte_pktmbuf_data_len(mbuf);
- uint32_t padding = RTE_ALIGN(data_len, sizeof(uint32_t)) - data_len;
+ uint32_t original_length = rte_pktmbuf_pkt_len(mbuf);
+ uint32_t padding = RTE_ALIGN(original_length, sizeof(uint32_t)) - original_length;
if (padding > 0)
{
void * tail = rte_pktmbuf_append(mbuf, padding);
@@ -559,12 +559,12 @@ int mr_pcapng_set_opt(struct rte_mbuf * mbuf, uint16_t port_id, uint32_t flags)
len += snprintf(str_rx_tx + len, METADATA_MAX_SIZE - len, ", hash_usr:%u", mbuf->hash.usr);
len = snprintf(str_sid, METADATA_MAX_SIZE - len, "start_sid:%u", mrb_metadata->start_sid);
- len += snprintf(str_sid, METADATA_MAX_SIZE - len, ", nr_sid:%u", mrb_metadata->nr_sid);
- len += snprintf(str_sid, METADATA_MAX_SIZE - len, ", cur_sid:%u", mrb_metadata->cur_sid);
- len += snprintf(str_sid, METADATA_MAX_SIZE - len, ", sids:");
+ len += snprintf(str_sid + len, METADATA_MAX_SIZE - len, ", nr_sid:%u", mrb_metadata->nr_sid);
+ len += snprintf(str_sid + len, METADATA_MAX_SIZE - len, ", cur_sid:%u", mrb_metadata->cur_sid);
+ len += snprintf(str_sid + len, METADATA_MAX_SIZE - len, ", sids:");
for (int i = 0; i < RTE_DIM(mrb_metadata->sids); i++)
{
- len += snprintf(str_sid, METADATA_MAX_SIZE - len, "[%u],", mrb_metadata->sids[i]);
+ len += snprintf(str_sid + len, METADATA_MAX_SIZE - len, "[%u],", mrb_metadata->sids[i]);
}
len = snprintf(str_dir, METADATA_MAX_SIZE, "dir:%u", mrb_metadata->dir);
@@ -596,12 +596,12 @@ int mr_pcapng_set_opt(struct rte_mbuf * mbuf, uint16_t port_id, uint32_t flags)
clock_gettime(CLOCK_MONOTONIC, &ts);
uint64_t ns = (uint64_t)ts.tv_sec * 1000000000 + ts.tv_nsec;
epb->block_type = PCAPNG_ENHANCED_PACKET_BLOCK;
- epb->block_length = rte_pktmbuf_data_len(mbuf);
+ epb->block_length = rte_pktmbuf_pkt_len(mbuf);
epb->interface_id = port_index[port_id];
epb->timestamp_hi = ns >> 32;
epb->timestamp_lo = (uint32_t)ns;
- epb->capture_length = data_len;
- epb->original_length = data_len;
+ epb->capture_length = original_length;
+ epb->original_length = original_length;
/* set trailer of block length */
struct pcapng_option * opt_new = pcapng_add_option(opt, PCAPNG_OPT_COMMENT, str_rx_tx, strlen(str_rx_tx));