From: Olivier Matz <olivier.m...@6wind.com> The initial role of rte_ctrlmbuf is to carry generic messages (data pointer + data length) but it's not used by the DPDK or it applications. Keeping it implies: - loosing 1 byte in the rte_mbuf structure - having some dead code rte_mbuf.[ch]
This patch removes this feature. Thanks to it, it is now possible to simplify the rte_mbuf structure by merging the rte_pktmbuf structure in it. This is done in next commit. Signed-off-by: Olivier Matz <olivier.matz at 6wind.com> * Updated patch to HEAD. * Modified patch to retain the old function names for ctrl mbufs as macros. This helps with app compatibility, and allows the concept of a control mbuf to be reintroduced via a single-bit flag in a future change. * Updated the packet framework ip_pipeline example application to work following this change. Changes in v2: * Fixed whitespace errors introduced by this patch flagged by checkpatch Signed-off-by: Bruce Richardson <bruce.richardson at intel.com> --- app/test-pmd/cmdline.c | 1 - app/test-pmd/flowgen.c | 2 +- app/test-pmd/testpmd.c | 2 - app/test-pmd/txonly.c | 2 +- app/test/commands.c | 1 - app/test/test_mbuf.c | 72 +------------ examples/ip_pipeline/cmdline.c | 44 ++++---- examples/ip_pipeline/init.c | 2 +- examples/ip_pipeline/pipeline_firewall.c | 4 +- .../ip_pipeline/pipeline_flow_classification.c | 4 +- examples/ip_pipeline/pipeline_routing.c | 4 +- examples/ip_pipeline/pipeline_rx.c | 4 +- examples/ipv4_multicast/main.c | 2 +- lib/librte_mbuf/rte_mbuf.c | 60 +++-------- lib/librte_mbuf/rte_mbuf.h | 119 +++++++-------------- lib/librte_pmd_e1000/em_rxtx.c | 2 +- lib/librte_pmd_e1000/igb_rxtx.c | 2 +- lib/librte_pmd_i40e/i40e_rxtx.c | 4 +- lib/librte_pmd_ixgbe/ixgbe_rxtx.c | 4 +- lib/librte_pmd_virtio/virtio_rxtx.c | 2 +- lib/librte_pmd_vmxnet3/vmxnet3_rxtx.c | 2 +- lib/librte_pmd_xenvirt/rte_eth_xenvirt.c | 2 +- 22 files changed, 97 insertions(+), 244 deletions(-) diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c index 345be11..6dd576a 100644 --- a/app/test-pmd/cmdline.c +++ b/app/test-pmd/cmdline.c @@ -6377,7 +6377,6 @@ dump_struct_sizes(void) #define DUMP_SIZE(t) printf("sizeof(" #t ") = %u\n", (unsigned)sizeof(t)); DUMP_SIZE(struct rte_mbuf); DUMP_SIZE(struct rte_pktmbuf); - DUMP_SIZE(struct rte_ctrlmbuf); DUMP_SIZE(struct rte_mempool); DUMP_SIZE(struct rte_ring); #undef DUMP_SIZE diff --git a/app/test-pmd/flowgen.c b/app/test-pmd/flowgen.c index 04911ff..a8f2a65 100644 --- a/app/test-pmd/flowgen.c +++ b/app/test-pmd/flowgen.c @@ -96,7 +96,7 @@ tx_mbuf_alloc(struct rte_mempool *mp) struct rte_mbuf *m; m = __rte_mbuf_raw_alloc(mp); - __rte_mbuf_sanity_check_raw(m, RTE_MBUF_PKT, 0); + __rte_mbuf_sanity_check_raw(m, 0); return (m); } diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c index e8a4b45..5368d01 100644 --- a/app/test-pmd/testpmd.c +++ b/app/test-pmd/testpmd.c @@ -398,13 +398,11 @@ testpmd_mbuf_ctor(struct rte_mempool *mp, mb_ctor_arg = (struct mbuf_ctor_arg *) opaque_arg; mb = (struct rte_mbuf *) raw_mbuf; - mb->type = RTE_MBUF_PKT; mb->pool = mp; mb->buf_addr = (void *) ((char *)mb + mb_ctor_arg->seg_buf_offset); mb->buf_physaddr = (uint64_t) (rte_mempool_virt2phy(mp, mb) + mb_ctor_arg->seg_buf_offset); mb->buf_len = mb_ctor_arg->seg_buf_size; - mb->type = RTE_MBUF_PKT; mb->ol_flags = 0; mb->pkt.data = (char *) mb->buf_addr + RTE_PKTMBUF_HEADROOM; mb->pkt.nb_segs = 1; diff --git a/app/test-pmd/txonly.c b/app/test-pmd/txonly.c index ef93741..d634096 100644 --- a/app/test-pmd/txonly.c +++ b/app/test-pmd/txonly.c @@ -93,7 +93,7 @@ tx_mbuf_alloc(struct rte_mempool *mp) struct rte_mbuf *m; m = __rte_mbuf_raw_alloc(mp); - __rte_mbuf_sanity_check_raw(m, RTE_MBUF_PKT, 0); + __rte_mbuf_sanity_check_raw(m, 0); return (m); } diff --git a/app/test/commands.c b/app/test/commands.c index 5f23420..f38d419 100644 --- a/app/test/commands.c +++ b/app/test/commands.c @@ -276,7 +276,6 @@ dump_struct_sizes(void) #define DUMP_SIZE(t) printf("sizeof(" #t ") = %u\n", (unsigned)sizeof(t)); DUMP_SIZE(struct rte_mbuf); DUMP_SIZE(struct rte_pktmbuf); - DUMP_SIZE(struct rte_ctrlmbuf); DUMP_SIZE(struct rte_mempool); DUMP_SIZE(struct rte_ring); #undef DUMP_SIZE diff --git a/app/test/test_mbuf.c b/app/test/test_mbuf.c index 678c382..6b32d9d 100644 --- a/app/test/test_mbuf.c +++ b/app/test/test_mbuf.c @@ -80,7 +80,6 @@ #define MAKE_STRING(x) # x static struct rte_mempool *pktmbuf_pool = NULL; -static struct rte_mempool *ctrlmbuf_pool = NULL; #if defined RTE_MBUF_REFCNT && defined RTE_MBUF_REFCNT_ATOMIC @@ -272,8 +271,8 @@ test_one_pktmbuf(void) GOTO_FAIL("Buffer should be continuous"); memset(hdr, 0x55, MBUF_TEST_HDR2_LEN); - rte_mbuf_sanity_check(m, RTE_MBUF_PKT, 1); - rte_mbuf_sanity_check(m, RTE_MBUF_PKT, 0); + rte_mbuf_sanity_check(m, 1); + rte_mbuf_sanity_check(m, 0); rte_pktmbuf_dump(stdout, m, 0); /* this prepend should fail */ @@ -320,48 +319,6 @@ fail: return -1; } -/* - * test control mbuf - */ -static int -test_one_ctrlmbuf(void) -{ - struct rte_mbuf *m = NULL; - char message[] = "This is a message carried by a ctrlmbuf"; - - printf("Test ctrlmbuf API\n"); - - /* alloc a mbuf */ - - m = rte_ctrlmbuf_alloc(ctrlmbuf_pool); - if (m == NULL) - GOTO_FAIL("Cannot allocate mbuf"); - if (rte_ctrlmbuf_len(m) != 0) - GOTO_FAIL("Bad length"); - - /* set data */ - rte_ctrlmbuf_data(m) = &message; - rte_ctrlmbuf_len(m) = sizeof(message); - - /* read data */ - if (rte_ctrlmbuf_data(m) != message) - GOTO_FAIL("Invalid data pointer"); - if (rte_ctrlmbuf_len(m) != sizeof(message)) - GOTO_FAIL("Invalid len"); - - rte_mbuf_sanity_check(m, RTE_MBUF_CTRL, 0); - - /* free mbuf */ - rte_ctrlmbuf_free(m); - m = NULL; - return 0; - -fail: - if (m) - rte_ctrlmbuf_free(m); - return -1; -} - static int testclone_testupdate_testdetach(void) { @@ -744,7 +701,7 @@ verify_mbuf_check_panics(struct rte_mbuf *buf) pid = fork(); if (pid == 0) { - rte_mbuf_sanity_check(buf, RTE_MBUF_PKT, 1); /* should panic */ + rte_mbuf_sanity_check(buf, 1); /* should panic */ exit(0); /* return normally if it doesn't panic */ } else if (pid < 0){ printf("Fork Failed\n"); @@ -781,13 +738,6 @@ test_failing_mbuf_sanity_check(void) } badbuf = *buf; - badbuf.type = (uint8_t)-1; - if (verify_mbuf_check_panics(&badbuf)) { - printf("Error with bad-type mbuf test\n"); - return -1; - } - - badbuf = *buf; badbuf.pool = NULL; if (verify_mbuf_check_panics(&badbuf)) { printf("Error with bad-pool mbuf test\n"); @@ -889,22 +839,6 @@ test_mbuf(void) return -1; } - /* create ctrlmbuf pool if it does not exist */ - if (ctrlmbuf_pool == NULL) { - ctrlmbuf_pool = - rte_mempool_create("test_ctrlmbuf_pool", NB_MBUF, - sizeof(struct rte_mbuf), 32, 0, - NULL, NULL, - rte_ctrlmbuf_init, NULL, - SOCKET_ID_ANY, 0); - } - - /* test control mbuf */ - if (test_one_ctrlmbuf() < 0) { - printf("test_one_ctrlmbuf() failed\n"); - return -1; - } - /* test free pktmbuf segment one by one */ if (test_pktmbuf_free_segment() < 0) { printf("test_pktmbuf_free_segment() failed.\n"); diff --git a/examples/ip_pipeline/cmdline.c b/examples/ip_pipeline/cmdline.c index e10a0cf..a56335e 100644 --- a/examples/ip_pipeline/cmdline.c +++ b/examples/ip_pipeline/cmdline.c @@ -345,7 +345,7 @@ cmd_link_enable_parsed( rte_panic("Unable to allocate new message\n"); /* Fill request message */ - req = (struct app_msg_req *) ((struct rte_mbuf *)msg)->ctrl.data; + req = (struct app_msg_req *)rte_ctrlmbuf_data((struct rte_mbuf *)msg); req->type = APP_MSG_REQ_RX_PORT_ENABLE; req->rx_up.port = params->port; @@ -358,7 +358,7 @@ cmd_link_enable_parsed( do { status = rte_ring_sc_dequeue(ring_resp, &msg); } while (status != 0); - resp = (struct app_msg_resp *) ((struct rte_mbuf *)msg)->ctrl.data; + resp = (struct app_msg_resp *)rte_ctrlmbuf_data((struct rte_mbuf *)msg); /* Check response */ if (resp->result != 0) printf("Request LINK_UP failed (%u)\n", resp->result); @@ -433,7 +433,7 @@ cmd_link_disable_parsed( rte_panic("Unable to allocate new message\n"); /* Fill request message */ - req = (struct app_msg_req *) ((struct rte_mbuf *)msg)->ctrl.data; + req = (struct app_msg_req *)rte_ctrlmbuf_data((struct rte_mbuf *)msg); req->type = APP_MSG_REQ_RX_PORT_DISABLE; req->rx_down.port = params->port; @@ -446,7 +446,7 @@ cmd_link_disable_parsed( do { status = rte_ring_sc_dequeue(ring_resp, &msg); } while (status != 0); - resp = (struct app_msg_resp *) ((struct rte_mbuf *)msg)->ctrl.data; + resp = (struct app_msg_resp *)rte_ctrlmbuf_data((struct rte_mbuf *)msg); /* Check response */ if (resp->result != 0) @@ -543,7 +543,7 @@ cmd_arp_add_parsed( rte_panic("Unable to allocate new message\n"); /* Fill request message */ - req = (struct app_msg_req *) ((struct rte_mbuf *)msg)->ctrl.data; + req = (struct app_msg_req *)rte_ctrlmbuf_data((struct rte_mbuf *)msg); req->type = APP_MSG_REQ_ARP_ADD; req->arp_add.out_iface = rule.arp.key.out_iface; req->arp_add.nh_ip = rule.arp.key.nh_ip; @@ -558,7 +558,7 @@ cmd_arp_add_parsed( do { status = rte_ring_sc_dequeue(ring_resp, &msg); } while (status != 0); - resp = (struct app_msg_resp *) ((struct rte_mbuf *)msg)->ctrl.data; + resp = (struct app_msg_resp *)rte_ctrlmbuf_data((struct rte_mbuf *)msg); /* Check response */ if (resp->result != 0) @@ -672,7 +672,7 @@ cmd_arp_del_parsed( rte_panic("Unable to allocate new message\n"); /* Fill request message */ - req = (struct app_msg_req *) ((struct rte_mbuf *)msg)->ctrl.data; + req = (struct app_msg_req *)rte_ctrlmbuf_data((struct rte_mbuf *)msg); req->type = APP_MSG_REQ_ARP_DEL; req->arp_del.out_iface = rule.arp.key.out_iface; req->arp_del.nh_ip = rule.arp.key.nh_ip; @@ -686,7 +686,7 @@ cmd_arp_del_parsed( do { status = rte_ring_sc_dequeue(ring_resp, &msg); } while (status != 0); - resp = (struct app_msg_resp *) ((struct rte_mbuf *)msg)->ctrl.data; + resp = (struct app_msg_resp *)rte_ctrlmbuf_data((struct rte_mbuf *)msg); /* Check response */ if (resp->result != 0) @@ -834,7 +834,7 @@ cmd_route_add_parsed( rte_panic("Unable to allocate new message\n"); /* Fill request message */ - req = (struct app_msg_req *) ((struct rte_mbuf *)msg)->ctrl.data; + req = (struct app_msg_req *)rte_ctrlmbuf_data((struct rte_mbuf *)msg); req->type = APP_MSG_REQ_RT_ADD; req->routing_add.ip = rule.routing.key.ip; req->routing_add.depth = rule.routing.key.depth; @@ -850,7 +850,7 @@ cmd_route_add_parsed( do { status = rte_ring_sc_dequeue(ring_resp, &msg); } while (status != 0); - resp = (struct app_msg_resp *) ((struct rte_mbuf *)msg)->ctrl.data; + resp = (struct app_msg_resp *)rte_ctrlmbuf_data((struct rte_mbuf *)msg); /* Check response */ if (resp->result != 0) @@ -972,7 +972,7 @@ cmd_route_del_parsed( rte_panic("Unable to allocate new message\n"); /* Fill request message */ - req = (struct app_msg_req *) ((struct rte_mbuf *)msg)->ctrl.data; + req = (struct app_msg_req *)rte_ctrlmbuf_data((struct rte_mbuf *)msg); req->type = APP_MSG_REQ_RT_DEL; req->routing_del.ip = rule.routing.key.ip; req->routing_del.depth = rule.routing.key.depth; @@ -986,7 +986,7 @@ cmd_route_del_parsed( do { status = rte_ring_sc_dequeue(ring_resp, &msg); } while (status != 0); - resp = (struct app_msg_resp *) ((struct rte_mbuf *)msg)->ctrl.data; + resp = (struct app_msg_resp *)rte_ctrlmbuf_data((struct rte_mbuf *)msg); /* Check response */ if (resp->result != 0) @@ -1149,7 +1149,7 @@ cmd_firewall_add_parsed( rte_panic("Unable to allocate new message\n"); /* Fill request message */ - req = (struct app_msg_req *) msg->ctrl.data; + req = (struct app_msg_req *)rte_ctrlmbuf_data(msg); req->type = APP_MSG_REQ_FW_ADD; req->firewall_add.add_params.priority = rule.firewall.priority; req->firewall_add.add_params.field_value[1].value.u32 = @@ -1183,7 +1183,7 @@ cmd_firewall_add_parsed( do { status = rte_ring_sc_dequeue(ring_resp, (void **) &msg); } while (status != 0); - resp = (struct app_msg_resp *) msg->ctrl.data; + resp = (struct app_msg_resp *)rte_ctrlmbuf_data(msg); /* Check response */ if (resp->result != 0) @@ -1347,7 +1347,7 @@ cmd_firewall_del_parsed( rte_panic("Unable to allocate new message\n"); /* Fill request message */ - req = (struct app_msg_req *) msg->ctrl.data; + req = (struct app_msg_req *)rte_ctrlmbuf_data(msg); memset(&req->firewall_del, 0, sizeof(req->firewall_del)); req->type = APP_MSG_REQ_FW_DEL; req->firewall_del.delete_params.field_value[1].value.u32 = @@ -1380,7 +1380,7 @@ cmd_firewall_del_parsed( do { status = rte_ring_sc_dequeue(ring_resp, (void **) &msg); } while (status != 0); - resp = (struct app_msg_resp *) msg->ctrl.data; + resp = (struct app_msg_resp *)rte_ctrlmbuf_data(msg); /* Check response */ if (resp->result != 0) @@ -1525,7 +1525,7 @@ cmd_flow_add_all_parsed( rte_panic("Unable to allocate new message\n"); /* Fill request message */ - req = (struct app_msg_req *) ((struct rte_mbuf *)msg)->ctrl.data; + req = (struct app_msg_req *)rte_ctrlmbuf_data((struct rte_mbuf *)msg); memset(req, 0, sizeof(struct app_msg_req)); req->type = APP_MSG_REQ_FC_ADD_ALL; @@ -1539,7 +1539,7 @@ cmd_flow_add_all_parsed( do { status = rte_ring_sc_dequeue(ring_resp, &msg); } while (status != 0); - resp = (struct app_msg_resp *) ((struct rte_mbuf *)msg)->ctrl.data; + resp = (struct app_msg_resp *)rte_ctrlmbuf_data((struct rte_mbuf *)msg); /* Check response */ if (resp->result != 0) @@ -1641,7 +1641,7 @@ cmd_flow_add_parsed( rte_panic("Unable to allocate new message\n"); /* Fill request message */ - req = (struct app_msg_req *) ((struct rte_mbuf *)msg)->ctrl.data; + req = (struct app_msg_req *)rte_ctrlmbuf_data((struct rte_mbuf *)msg); memset(req, 0, sizeof(struct app_msg_req)); req->type = APP_MSG_REQ_FC_ADD; @@ -1663,7 +1663,7 @@ cmd_flow_add_parsed( do { status = rte_ring_sc_dequeue(ring_resp, &msg); } while (status != 0); - resp = (struct app_msg_resp *) ((struct rte_mbuf *)msg)->ctrl.data; + resp = (struct app_msg_resp *)rte_ctrlmbuf_data((struct rte_mbuf *)msg); /* Check response */ if (resp->result != 0) @@ -1790,7 +1790,7 @@ cmd_flow_del_parsed( rte_panic("Unable to allocate new message\n"); /* Fill request message */ - req = (struct app_msg_req *) ((struct rte_mbuf *)msg)->ctrl.data; + req = (struct app_msg_req *)rte_ctrlmbuf_data((struct rte_mbuf *)msg); memset(req, 0, sizeof(struct app_msg_req)); req->type = APP_MSG_REQ_FC_DEL; @@ -1811,7 +1811,7 @@ cmd_flow_del_parsed( do { status = rte_ring_sc_dequeue(ring_resp, &msg); } while (status != 0); - resp = (struct app_msg_resp *) ((struct rte_mbuf *)msg)->ctrl.data; + resp = (struct app_msg_resp *)rte_ctrlmbuf_data((struct rte_mbuf *)msg); /* Check response */ if (resp->result != 0) diff --git a/examples/ip_pipeline/init.c b/examples/ip_pipeline/init.c index d00027f..e3ebd46 100644 --- a/examples/ip_pipeline/init.c +++ b/examples/ip_pipeline/init.c @@ -561,7 +561,7 @@ app_ping(void) rte_panic("Unable to allocate new message\n"); req = (struct app_msg_req *) - ((struct rte_mbuf *)msg)->ctrl.data; + rte_ctrlmbuf_data((struct rte_mbuf *)msg); req->type = APP_MSG_REQ_PING; /* Send request */ diff --git a/examples/ip_pipeline/pipeline_firewall.c b/examples/ip_pipeline/pipeline_firewall.c index ecc15a7..b70260e 100644 --- a/examples/ip_pipeline/pipeline_firewall.c +++ b/examples/ip_pipeline/pipeline_firewall.c @@ -264,7 +264,7 @@ app_message_handle(struct app_core_firewall_message_handle_params *params) table_id = params->table_id; /* Handle request */ - req = (struct app_msg_req *) msg->ctrl.data; + req = (struct app_msg_req *)rte_ctrlmbuf_data(msg); switch (req->type) { case APP_MSG_REQ_PING: { @@ -303,7 +303,7 @@ app_message_handle(struct app_core_firewall_message_handle_params *params) } /* Fill in response message */ - resp = (struct app_msg_resp *) msg->ctrl.data; + resp = (struct app_msg_resp *)rte_ctrlmbuf_data(msg); resp->result = result; /* Send response */ diff --git a/examples/ip_pipeline/pipeline_flow_classification.c b/examples/ip_pipeline/pipeline_flow_classification.c index 68d4f93..cc0cbf1 100644 --- a/examples/ip_pipeline/pipeline_flow_classification.c +++ b/examples/ip_pipeline/pipeline_flow_classification.c @@ -250,7 +250,7 @@ app_message_handle(struct app_core_fc_message_handle_params *params) table_id = params->table_id; /* Handle request */ - req = (struct app_msg_req *) ((struct rte_mbuf *)msg)->ctrl.data; + req = (struct app_msg_req *)rte_ctrlmbuf_data((struct rte_mbuf *)msg); switch (req->type) { case APP_MSG_REQ_PING: { @@ -296,7 +296,7 @@ app_message_handle(struct app_core_fc_message_handle_params *params) } /* Fill in response message */ - resp = (struct app_msg_resp *) ((struct rte_mbuf *)msg)->ctrl.data; + resp = (struct app_msg_resp *)rte_ctrlmbuf_data((struct rte_mbuf *)msg); resp->result = result; /* Send response */ diff --git a/examples/ip_pipeline/pipeline_routing.c b/examples/ip_pipeline/pipeline_routing.c index f19506d..b1ce624 100644 --- a/examples/ip_pipeline/pipeline_routing.c +++ b/examples/ip_pipeline/pipeline_routing.c @@ -370,7 +370,7 @@ app_message_handle(struct app_core_routing_message_handle_params *params) arp_table_id = params->arp_table_id; /* Handle request */ - req = (struct app_msg_req *) ((struct rte_mbuf *)msg)->ctrl.data; + req = (struct app_msg_req *)rte_ctrlmbuf_data((struct rte_mbuf *)msg); switch (req->type) { case APP_MSG_REQ_PING: { @@ -464,7 +464,7 @@ app_message_handle(struct app_core_routing_message_handle_params *params) } /* Fill in response message */ - resp = (struct app_msg_resp *) ((struct rte_mbuf *)msg)->ctrl.data; + resp = (struct app_msg_resp *)rte_ctrlmbuf_data((struct rte_mbuf *)msg); resp->result = result; /* Send response */ diff --git a/examples/ip_pipeline/pipeline_rx.c b/examples/ip_pipeline/pipeline_rx.c index ba5fa0a..e43ebfa 100644 --- a/examples/ip_pipeline/pipeline_rx.c +++ b/examples/ip_pipeline/pipeline_rx.c @@ -348,7 +348,7 @@ app_message_handle(struct app_core_rx_message_handle_params *params) port_in_id = params->port_in_id; /* Handle request */ - req = (struct app_msg_req *) ((struct rte_mbuf *)msg)->ctrl.data; + req = (struct app_msg_req *)rte_ctrlmbuf_data((struct rte_mbuf *)msg); switch (req->type) { case APP_MSG_REQ_PING: { @@ -375,7 +375,7 @@ app_message_handle(struct app_core_rx_message_handle_params *params) } /* Fill in response message */ - resp = (struct app_msg_resp *) ((struct rte_mbuf *)msg)->ctrl.data; + resp = (struct app_msg_resp *)rte_ctrlmbuf_data((struct rte_mbuf *)msg); resp->result = result; /* Send response */ diff --git a/examples/ipv4_multicast/main.c b/examples/ipv4_multicast/main.c index dfa0075..7b53296 100644 --- a/examples/ipv4_multicast/main.c +++ b/examples/ipv4_multicast/main.c @@ -343,7 +343,7 @@ mcast_out_pkt(struct rte_mbuf *pkt, int use_clone) hdr->ol_flags = pkt->ol_flags; - __rte_mbuf_sanity_check(hdr, RTE_MBUF_PKT, 1); + __rte_mbuf_sanity_check(hdr, 1); return (hdr); } diff --git a/lib/librte_mbuf/rte_mbuf.c b/lib/librte_mbuf/rte_mbuf.c index a4967e3..3e72a70 100644 --- a/lib/librte_mbuf/rte_mbuf.c +++ b/lib/librte_mbuf/rte_mbuf.c @@ -65,24 +65,11 @@ */ void rte_ctrlmbuf_init(struct rte_mempool *mp, - __attribute__((unused)) void *opaque_arg, - void *_m, - __attribute__((unused)) unsigned i) + __attribute__((unused)) void *opaque_arg, + void *_m, + __attribute__((unused)) unsigned i) { - struct rte_mbuf *m = _m; - - memset(m, 0, mp->elt_size); - - /* start of buffer is just after mbuf structure */ - m->buf_addr = (char *)m + sizeof(struct rte_mbuf); - m->buf_physaddr = rte_mempool_virt2phy(mp, m) + - sizeof(struct rte_mbuf); - m->buf_len = (uint16_t) (mp->elt_size - sizeof(struct rte_mbuf)); - - /* init some constant fields */ - m->type = RTE_MBUF_CTRL; - m->ctrl.data = (char *)m->buf_addr; - m->pool = (struct rte_mempool *)mp; + rte_pktmbuf_init(mp, opaque_arg, _m, i); } /* @@ -133,7 +120,6 @@ rte_pktmbuf_init(struct rte_mempool *mp, m->pkt.data = (char*) m->buf_addr + RTE_MIN(RTE_PKTMBUF_HEADROOM, m->buf_len); /* init some constant fields */ - m->type = RTE_MBUF_PKT; m->pool = mp; m->pkt.nb_segs = 1; m->pkt.in_port = 0xff; @@ -141,16 +127,13 @@ rte_pktmbuf_init(struct rte_mempool *mp, /* do some sanity checks on a mbuf: panic if it fails */ void -rte_mbuf_sanity_check(const struct rte_mbuf *m, enum rte_mbuf_type t, - int is_header) +rte_mbuf_sanity_check(const struct rte_mbuf *m, int is_header) { const struct rte_mbuf *m_seg; unsigned nb_segs; if (m == NULL) rte_panic("mbuf is NULL\n"); - if (m->type != (uint8_t)t) - rte_panic("bad mbuf type\n"); /* generic checks */ if (m->pool == NULL) @@ -166,29 +149,18 @@ rte_mbuf_sanity_check(const struct rte_mbuf *m, enum rte_mbuf_type t, rte_panic("bad ref cnt\n"); #endif - /* nothing to check for ctrl messages */ - if (m->type == RTE_MBUF_CTRL) + /* nothing to check for sub-segments */ + if (is_header == 0) return; - /* check pkt consistency */ - else if (m->type == RTE_MBUF_PKT) { - - /* nothing to check for sub-segments */ - if (is_header == 0) - return; - - nb_segs = m->pkt.nb_segs; - m_seg = m; - while (m_seg && nb_segs != 0) { - m_seg = m_seg->pkt.next; - nb_segs --; - } - if (nb_segs != 0) - rte_panic("bad nb_segs\n"); - return; + nb_segs = m->pkt.nb_segs; + m_seg = m; + while (m_seg && nb_segs != 0) { + m_seg = m_seg->pkt.next; + nb_segs--; } - - rte_panic("unknown mbuf type\n"); + if (nb_segs != 0) + rte_panic("bad nb_segs\n"); } /* dump a mbuf on console */ @@ -198,7 +170,7 @@ rte_pktmbuf_dump(FILE *f, const struct rte_mbuf *m, unsigned dump_len) unsigned int len; unsigned nb_segs; - __rte_mbuf_sanity_check(m, RTE_MBUF_PKT, 1); + __rte_mbuf_sanity_check(m, 1); fprintf(f, "dump mbuf at 0x%p, phys=%"PRIx64", buf_len=%u\n", m, (uint64_t)m->buf_physaddr, (unsigned)m->buf_len); @@ -208,7 +180,7 @@ rte_pktmbuf_dump(FILE *f, const struct rte_mbuf *m, unsigned dump_len) nb_segs = m->pkt.nb_segs; while (m && nb_segs != 0) { - __rte_mbuf_sanity_check(m, RTE_MBUF_PKT, 0); + __rte_mbuf_sanity_check(m, 0); fprintf(f, " segment at 0x%p, data=0x%p, data_len=%u\n", m, m->pkt.data, (unsigned)m->pkt.data_len); diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h index fbd1c7b..a0ae2e9 100644 --- a/lib/librte_mbuf/rte_mbuf.h +++ b/lib/librte_mbuf/rte_mbuf.h @@ -43,18 +43,13 @@ * buffers. The message buffers are stored in a mempool, using the * RTE mempool library. * - * This library provide an API to allocate/free mbufs, manipulate - * control message buffer (ctrlmbuf), which are generic message - * buffers, and packet buffers (pktmbuf), which are used to carry - * network packets. + * This library provide an API to allocate/free packet mbufs, which are + * used to carry network packets. * * To understand the concepts of packet buffers or mbufs, you * should read "TCP/IP Illustrated, Volume 2: The Implementation, * Addison-Wesley, 1995, ISBN 0-201-63354-X from Richard Stevens" * http://www.kohala.com/start/tcpipiv2.html - * - * The main modification of this implementation is the use of mbuf for - * transports other than packets. mbufs can have other types. */ #include <stdint.h> @@ -70,15 +65,6 @@ extern "C" { /* deprecated feature, renamed in RTE_MBUF_REFCNT */ #pragma GCC poison RTE_MBUF_SCATTER_GATHER -/** - * A control message buffer. - */ -struct rte_ctrlmbuf { - void *data; /**< Pointer to data. */ - uint32_t data_len; /**< Length of data. */ -}; - - /* * Packet Offload Features Flags. It also carry packet type information. * Critical resources. Both rx/tx shared these bits. Be cautious on any change @@ -173,15 +159,7 @@ struct rte_pktmbuf { }; /** - * This enum indicates the mbuf type. - */ -enum rte_mbuf_type { - RTE_MBUF_CTRL, /**< Control mbuf. */ - RTE_MBUF_PKT, /**< Packet mbuf. */ -}; - -/** - * The generic rte_mbuf, containing a packet mbuf or a control mbuf. + * The generic rte_mbuf, containing a packet mbuf. */ struct rte_mbuf { struct rte_mempool *pool; /**< Pool from which mbuf was allocated. */ @@ -204,14 +182,10 @@ struct rte_mbuf { #else uint16_t refcnt_reserved; /**< Do not use this field */ #endif - uint8_t type; /**< Type of mbuf. */ - uint8_t reserved; /**< Unused field. Required for padding. */ + uint16_t reserved; /**< Unused field. Required for padding */ uint16_t ol_flags; /**< Offload features. */ - union { - struct rte_ctrlmbuf ctrl; - struct rte_pktmbuf pkt; - }; + struct rte_pktmbuf pkt; union { uint8_t metadata[0]; @@ -274,12 +248,12 @@ struct rte_pktmbuf_pool_private { #ifdef RTE_LIBRTE_MBUF_DEBUG /** check mbuf type in debug mode */ -#define __rte_mbuf_sanity_check(m, t, is_h) rte_mbuf_sanity_check(m, t, is_h) +#define __rte_mbuf_sanity_check(m, is_h) rte_mbuf_sanity_check(m, is_h) /** check mbuf type in debug mode if mbuf pointer is not null */ -#define __rte_mbuf_sanity_check_raw(m, t, is_h) do { \ +#define __rte_mbuf_sanity_check_raw(m, is_h) do { \ if ((m) != NULL) \ - rte_mbuf_sanity_check(m, t, is_h); \ + rte_mbuf_sanity_check(m, is_h); \ } while (0) /** MBUF asserts in debug mode */ @@ -291,13 +265,13 @@ if (!(exp)) { \ #else /* RTE_LIBRTE_MBUF_DEBUG */ /** check mbuf type in debug mode */ -#define __rte_mbuf_sanity_check(m, t, is_h) do { } while(0) +#define __rte_mbuf_sanity_check(m, is_h) do { } while (0) /** check mbuf type in debug mode if mbuf pointer is not null */ -#define __rte_mbuf_sanity_check_raw(m, t, is_h) do { } while(0) +#define __rte_mbuf_sanity_check_raw(m, is_h) do { } while (0) /** MBUF asserts in debug mode */ -#define RTE_MBUF_ASSERT(exp) do { } while(0) +#define RTE_MBUF_ASSERT(exp) do { } while (0) #endif /* RTE_LIBRTE_MBUF_DEBUG */ @@ -401,20 +375,17 @@ rte_mbuf_refcnt_set(struct rte_mbuf *m, uint16_t new_value) * * @param m * The mbuf to be checked. - * @param t - * The expected type of the mbuf. * @param is_header * True if the mbuf is a packet header, false if it is a sub-segment * of a packet (in this case, some fields like nb_segs are not checked) */ void -rte_mbuf_sanity_check(const struct rte_mbuf *m, enum rte_mbuf_type t, - int is_header); +rte_mbuf_sanity_check(const struct rte_mbuf *m, int is_header); /** * @internal Allocate a new mbuf from mempool *mp*. * The use of that function is reserved for RTE internal needs. - * Please use either rte_ctrlmbuf_alloc() or rte_pktmbuf_alloc(). + * Please use rte_pktmbuf_alloc(). * * @param mp * The mempool from which mbuf is allocated. @@ -439,7 +410,7 @@ static inline struct rte_mbuf *__rte_mbuf_raw_alloc(struct rte_mempool *mp) /** * @internal Put mbuf back into its original mempool. * The use of that function is reserved for RTE internal needs. - * Please use either rte_ctrlmbuf_free() or rte_pktmbuf_free(). + * Please use rte_pktmbuf_free(). * * @param m * The mbuf to be freed. @@ -475,7 +446,7 @@ __rte_mbuf_raw_free(struct rte_mbuf *m) * The index of the mbuf in the pool table. */ void rte_ctrlmbuf_init(struct rte_mempool *mp, void *opaque_arg, - void *m, unsigned i); + void *m, unsigned i); /** * Allocate a new mbuf (type is ctrl) from mempool *mp*. @@ -489,16 +460,7 @@ void rte_ctrlmbuf_init(struct rte_mempool *mp, void *opaque_arg, * - The pointer to the new mbuf on success. * - NULL if allocation failed. */ -static inline struct rte_mbuf *rte_ctrlmbuf_alloc(struct rte_mempool *mp) -{ - struct rte_mbuf *m; - if ((m = __rte_mbuf_raw_alloc(mp)) != NULL) { - m->ctrl.data = m->buf_addr; - m->ctrl.data_len = 0; - __rte_mbuf_sanity_check(m, RTE_MBUF_CTRL, 0); - } - return (m); -} +#define rte_ctrlmbuf_alloc(mp) rte_pktmbuf_alloc(mp) /** * Free a control mbuf back into its original mempool. @@ -506,14 +468,7 @@ static inline struct rte_mbuf *rte_ctrlmbuf_alloc(struct rte_mempool *mp) * @param m * The control mbuf to be freed. */ -static inline void rte_ctrlmbuf_free(struct rte_mbuf *m) -{ - __rte_mbuf_sanity_check(m, RTE_MBUF_CTRL, 0); -#ifdef RTE_MBUF_REFCNT - if (rte_mbuf_refcnt_update(m, -1) == 0) -#endif /* RTE_MBUF_REFCNT */ - __rte_mbuf_raw_free(m); -} +#define rte_ctrlmbuf_free(m) rte_pktmbuf_free(m) /** * A macro that returns the pointer to the carried data. @@ -523,7 +478,7 @@ static inline void rte_ctrlmbuf_free(struct rte_mbuf *m) * @param m * The control mbuf. */ -#define rte_ctrlmbuf_data(m) ((m)->ctrl.data) +#define rte_ctrlmbuf_data(m) ((m)->pkt.data) /** * A macro that returns the length of the carried data. @@ -533,15 +488,15 @@ static inline void rte_ctrlmbuf_free(struct rte_mbuf *m) * @param m * The control mbuf. */ -#define rte_ctrlmbuf_len(m) ((m)->ctrl.data_len) +#define rte_ctrlmbuf_len(m) rte_pktmbuf_data_len(m) /* Operations on pkt mbuf */ /** * The packet mbuf constructor. * - * This function initializes some fields in the mbuf structure that are not - * modified by the user once created (mbuf type, origin pool, buffer start + * This function initializes some fields in the mbuf structure that are + * not modified by the user once created (origin pool, buffer start * address, and so on). This function is given as a callback function to * rte_mempool_create() at pool creation time. * @@ -602,11 +557,11 @@ static inline void rte_pktmbuf_reset(struct rte_mbuf *m) m->pkt.data = (char*) m->buf_addr + buf_ofs; m->pkt.data_len = 0; - __rte_mbuf_sanity_check(m, RTE_MBUF_PKT, 1); + __rte_mbuf_sanity_check(m, 1); } /** - * Allocate a new mbuf (type is pkt) from a mempool. + * Allocate a new mbuf from a mempool. * * This new mbuf contains one segment, which has a length of 0. The pointer * to data is initialized to have some bytes of headroom in the buffer @@ -662,8 +617,8 @@ static inline void rte_pktmbuf_attach(struct rte_mbuf *mi, struct rte_mbuf *md) mi->pkt.nb_segs = 1; mi->ol_flags = md->ol_flags; - __rte_mbuf_sanity_check(mi, RTE_MBUF_PKT, 1); - __rte_mbuf_sanity_check(md, RTE_MBUF_PKT, 0); + __rte_mbuf_sanity_check(mi, 1); + __rte_mbuf_sanity_check(md, 0); } /** @@ -700,7 +655,7 @@ static inline void rte_pktmbuf_detach(struct rte_mbuf *m) static inline struct rte_mbuf* __attribute__((always_inline)) __rte_pktmbuf_prefree_seg(struct rte_mbuf *m) { - __rte_mbuf_sanity_check(m, RTE_MBUF_PKT, 0); + __rte_mbuf_sanity_check(m, 0); #ifdef RTE_MBUF_REFCNT if (likely (rte_mbuf_refcnt_read(m) == 1) || @@ -755,7 +710,7 @@ static inline void rte_pktmbuf_free(struct rte_mbuf *m) { struct rte_mbuf *m_next; - __rte_mbuf_sanity_check(m, RTE_MBUF_PKT, 1); + __rte_mbuf_sanity_check(m, 1); while (m != NULL) { m_next = m->pkt.next; @@ -816,7 +771,7 @@ static inline struct rte_mbuf *rte_pktmbuf_clone(struct rte_mbuf *md, return (NULL); } - __rte_mbuf_sanity_check(mc, RTE_MBUF_PKT, 1); + __rte_mbuf_sanity_check(mc, 1); return (mc); } @@ -833,7 +788,7 @@ static inline struct rte_mbuf *rte_pktmbuf_clone(struct rte_mbuf *md, */ static inline void rte_pktmbuf_refcnt_update(struct rte_mbuf *m, int16_t v) { - __rte_mbuf_sanity_check(m, RTE_MBUF_PKT, 1); + __rte_mbuf_sanity_check(m, 1); do { rte_mbuf_refcnt_update(m, v); @@ -852,7 +807,7 @@ static inline void rte_pktmbuf_refcnt_update(struct rte_mbuf *m, int16_t v) */ static inline uint16_t rte_pktmbuf_headroom(const struct rte_mbuf *m) { - __rte_mbuf_sanity_check(m, RTE_MBUF_PKT, 1); + __rte_mbuf_sanity_check(m, 1); return (uint16_t) ((char*) m->pkt.data - (char*) m->buf_addr); } @@ -866,7 +821,7 @@ static inline uint16_t rte_pktmbuf_headroom(const struct rte_mbuf *m) */ static inline uint16_t rte_pktmbuf_tailroom(const struct rte_mbuf *m) { - __rte_mbuf_sanity_check(m, RTE_MBUF_PKT, 1); + __rte_mbuf_sanity_check(m, 1); return (uint16_t)(m->buf_len - rte_pktmbuf_headroom(m) - m->pkt.data_len); } @@ -883,7 +838,7 @@ static inline struct rte_mbuf *rte_pktmbuf_lastseg(struct rte_mbuf *m) { struct rte_mbuf *m2 = (struct rte_mbuf *)m; - __rte_mbuf_sanity_check(m, RTE_MBUF_PKT, 1); + __rte_mbuf_sanity_check(m, 1); while (m2->pkt.next != NULL) m2 = m2->pkt.next; return m2; @@ -941,7 +896,7 @@ static inline struct rte_mbuf *rte_pktmbuf_lastseg(struct rte_mbuf *m) static inline char *rte_pktmbuf_prepend(struct rte_mbuf *m, uint16_t len) { - __rte_mbuf_sanity_check(m, RTE_MBUF_PKT, 1); + __rte_mbuf_sanity_check(m, 1); if (unlikely(len > rte_pktmbuf_headroom(m))) return NULL; @@ -973,7 +928,7 @@ static inline char *rte_pktmbuf_append(struct rte_mbuf *m, uint16_t len) void *tail; struct rte_mbuf *m_last; - __rte_mbuf_sanity_check(m, RTE_MBUF_PKT, 1); + __rte_mbuf_sanity_check(m, 1); m_last = rte_pktmbuf_lastseg(m); if (unlikely(len > rte_pktmbuf_tailroom(m_last))) @@ -1001,7 +956,7 @@ static inline char *rte_pktmbuf_append(struct rte_mbuf *m, uint16_t len) */ static inline char *rte_pktmbuf_adj(struct rte_mbuf *m, uint16_t len) { - __rte_mbuf_sanity_check(m, RTE_MBUF_PKT, 1); + __rte_mbuf_sanity_check(m, 1); if (unlikely(len > m->pkt.data_len)) return NULL; @@ -1030,7 +985,7 @@ static inline int rte_pktmbuf_trim(struct rte_mbuf *m, uint16_t len) { struct rte_mbuf *m_last; - __rte_mbuf_sanity_check(m, RTE_MBUF_PKT, 1); + __rte_mbuf_sanity_check(m, 1); m_last = rte_pktmbuf_lastseg(m); if (unlikely(len > m_last->pkt.data_len)) @@ -1052,7 +1007,7 @@ static inline int rte_pktmbuf_trim(struct rte_mbuf *m, uint16_t len) */ static inline int rte_pktmbuf_is_contiguous(const struct rte_mbuf *m) { - __rte_mbuf_sanity_check(m, RTE_MBUF_PKT, 1); + __rte_mbuf_sanity_check(m, 1); return !!(m->pkt.nb_segs == 1); } diff --git a/lib/librte_pmd_e1000/em_rxtx.c b/lib/librte_pmd_e1000/em_rxtx.c index f254858..3304f50 100644 --- a/lib/librte_pmd_e1000/em_rxtx.c +++ b/lib/librte_pmd_e1000/em_rxtx.c @@ -85,7 +85,7 @@ rte_rxmbuf_alloc(struct rte_mempool *mp) struct rte_mbuf *m; m = __rte_mbuf_raw_alloc(mp); - __rte_mbuf_sanity_check_raw(m, RTE_MBUF_PKT, 0); + __rte_mbuf_sanity_check_raw(m, 0); return (m); } diff --git a/lib/librte_pmd_e1000/igb_rxtx.c b/lib/librte_pmd_e1000/igb_rxtx.c index 977c4a2..b0112be 100644 --- a/lib/librte_pmd_e1000/igb_rxtx.c +++ b/lib/librte_pmd_e1000/igb_rxtx.c @@ -90,7 +90,7 @@ rte_rxmbuf_alloc(struct rte_mempool *mp) struct rte_mbuf *m; m = __rte_mbuf_raw_alloc(mp); - __rte_mbuf_sanity_check_raw(m, RTE_MBUF_PKT, 0); + __rte_mbuf_sanity_check_raw(m, 0); return (m); } diff --git a/lib/librte_pmd_i40e/i40e_rxtx.c b/lib/librte_pmd_i40e/i40e_rxtx.c index 83b9462..76ff019 100644 --- a/lib/librte_pmd_i40e/i40e_rxtx.c +++ b/lib/librte_pmd_i40e/i40e_rxtx.c @@ -473,7 +473,7 @@ rte_rxmbuf_alloc(struct rte_mempool *mp) struct rte_mbuf *m; m = __rte_mbuf_raw_alloc(mp); - __rte_mbuf_sanity_check_raw(m, RTE_MBUF_PKT, 0); + __rte_mbuf_sanity_check_raw(m, 0); return m; } @@ -687,7 +687,6 @@ i40e_rx_alloc_bufs(struct i40e_rx_queue *rxq) for (i = 0; i < rxq->rx_free_thresh; i++) { mb = rxep[i].mbuf; rte_mbuf_refcnt_set(mb, 1); - mb->type = RTE_MBUF_PKT; mb->pkt.next = NULL; mb->pkt.data = (char *)mb->buf_addr + RTE_PKTMBUF_HEADROOM; mb->pkt.nb_segs = 1; @@ -2020,7 +2019,6 @@ i40e_alloc_rx_queue_mbufs(struct i40e_rx_queue *rxq) } rte_mbuf_refcnt_set(mbuf, 1); - mbuf->type = RTE_MBUF_PKT; mbuf->pkt.next = NULL; mbuf->pkt.data = (char *)mbuf->buf_addr + RTE_PKTMBUF_HEADROOM; mbuf->pkt.nb_segs = 1; diff --git a/lib/librte_pmd_ixgbe/ixgbe_rxtx.c b/lib/librte_pmd_ixgbe/ixgbe_rxtx.c index dfc2076..40ea4f8 100644 --- a/lib/librte_pmd_ixgbe/ixgbe_rxtx.c +++ b/lib/librte_pmd_ixgbe/ixgbe_rxtx.c @@ -96,7 +96,7 @@ rte_rxmbuf_alloc(struct rte_mempool *mp) struct rte_mbuf *m; m = __rte_mbuf_raw_alloc(mp); - __rte_mbuf_sanity_check_raw(m, RTE_MBUF_PKT, 0); + __rte_mbuf_sanity_check_raw(m, 0); return (m); } @@ -995,7 +995,6 @@ ixgbe_rx_alloc_bufs(struct igb_rx_queue *rxq) /* populate the static rte mbuf fields */ mb = rxep[i].mbuf; rte_mbuf_refcnt_set(mb, 1); - mb->type = RTE_MBUF_PKT; mb->pkt.next = NULL; mb->pkt.data = (char *)mb->buf_addr + RTE_PKTMBUF_HEADROOM; mb->pkt.nb_segs = 1; @@ -3213,7 +3212,6 @@ ixgbe_alloc_rx_queue_mbufs(struct igb_rx_queue *rxq) } rte_mbuf_refcnt_set(mbuf, 1); - mbuf->type = RTE_MBUF_PKT; mbuf->pkt.next = NULL; mbuf->pkt.data = (char *)mbuf->buf_addr + RTE_PKTMBUF_HEADROOM; mbuf->pkt.nb_segs = 1; diff --git a/lib/librte_pmd_virtio/virtio_rxtx.c b/lib/librte_pmd_virtio/virtio_rxtx.c index fcd8bd1..186514d 100644 --- a/lib/librte_pmd_virtio/virtio_rxtx.c +++ b/lib/librte_pmd_virtio/virtio_rxtx.c @@ -227,7 +227,7 @@ rte_rxmbuf_alloc(struct rte_mempool *mp) struct rte_mbuf *m; m = __rte_mbuf_raw_alloc(mp); - __rte_mbuf_sanity_check_raw(m, RTE_MBUF_PKT, 0); + __rte_mbuf_sanity_check_raw(m, 0); return m; } diff --git a/lib/librte_pmd_vmxnet3/vmxnet3_rxtx.c b/lib/librte_pmd_vmxnet3/vmxnet3_rxtx.c index 2d9f5e0..2470c8e 100644 --- a/lib/librte_pmd_vmxnet3/vmxnet3_rxtx.c +++ b/lib/librte_pmd_vmxnet3/vmxnet3_rxtx.c @@ -100,7 +100,7 @@ rte_rxmbuf_alloc(struct rte_mempool *mp) struct rte_mbuf *m; m = __rte_mbuf_raw_alloc(mp); - __rte_mbuf_sanity_check_raw(m, RTE_MBUF_PKT, 0); + __rte_mbuf_sanity_check_raw(m, 0); return m; } diff --git a/lib/librte_pmd_xenvirt/rte_eth_xenvirt.c b/lib/librte_pmd_xenvirt/rte_eth_xenvirt.c index 450332a..ba82319 100644 --- a/lib/librte_pmd_xenvirt/rte_eth_xenvirt.c +++ b/lib/librte_pmd_xenvirt/rte_eth_xenvirt.c @@ -81,7 +81,7 @@ rte_rxmbuf_alloc(struct rte_mempool *mp) struct rte_mbuf *m; m = __rte_mbuf_raw_alloc(mp); - __rte_mbuf_sanity_check_raw(m, RTE_MBUF_PKT, 0); + __rte_mbuf_sanity_check_raw(m, 0); return m; } -- 1.9.3