diff options
| author | songyanchao <[email protected]> | 2023-04-03 13:00:03 +0000 |
|---|---|---|
| committer | songyanchao <[email protected]> | 2023-04-03 13:00:03 +0000 |
| commit | 48f8f83281d516b06e05dc037391f4317baf823a (patch) | |
| tree | f91e69ed722ed0d01413a60b9e10aed49f924355 | |
| parent | 35012175d3db9e3ea7c1db9cfb9b69b18e2bf163 (diff) | |
🐞 fix(DPISDN-5): 修复Classifier ipv4 数据包快速匹配无效,以及mrpdump处理2000字节以上大包异常问题。v4.6.21-20230403
修复Classifier ipv4 数据包快速匹配无效,以及mrpdump处理2000字节以上大包异常问题。
| -rw-r--r-- | service/include/sc_pdump.h | 6 | ||||
| -rw-r--r-- | service/src/mrb.c | 11 | ||||
| -rw-r--r-- | service/src/node_classifier.c | 4 | ||||
| -rw-r--r-- | service/src/pdump.c | 35 | ||||
| -rw-r--r-- | tools/tcpdump/pdump.c | 18 |
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)); |
