Currently dp_netdev_upcall() resolves checksums on all packets, but this isn't strictly needed. The checksums will be resolved before transmission. However, we do have to resolve the checksums before sending a packet to the controller as offload flags aren't retained.
Signed-off-by: Mike Pattrick <[email protected]> --- lib/dpif-netdev.c | 2 -- ofproto/ofproto-dpif-upcall.c | 13 ++++++++++--- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index 9a59a1b03..8f7aaffbb 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -7980,8 +7980,6 @@ dp_netdev_upcall(struct dp_netdev_pmd_thread *pmd, struct dp_packet *packet_, ds_destroy(&ds); } - dp_packet_ol_send_prepare(packet_, 0); - return dp->upcall_cb(packet_, flow, ufid, pmd->core_id, type, userdata, actions, wc, put_actions, dp->upcall_aux); } diff --git a/ofproto/ofproto-dpif-upcall.c b/ofproto/ofproto-dpif-upcall.c index cc10f57b5..e974d844a 100644 --- a/ofproto/ofproto-dpif-upcall.c +++ b/ofproto/ofproto-dpif-upcall.c @@ -1574,15 +1574,20 @@ process_upcall(struct udpif *udpif, struct upcall *upcall, const struct frozen_state *state = &recirc_node->state; struct ofproto_async_msg *am = xmalloc(sizeof *am); + + /* Resolve offloaded checksums, if any. */ + struct dp_packet *packet_clone = dp_packet_clone(packet); + dp_packet_ol_send_prepare(packet_clone, 0); + *am = (struct ofproto_async_msg) { .controller_id = cookie->controller.controller_id, .oam = OAM_PACKET_IN, .pin = { .up = { .base = { - .packet = xmemdup(dp_packet_data(packet), - dp_packet_size(packet)), - .packet_len = dp_packet_size(packet), + .packet = xmemdup(dp_packet_data(packet_clone), + dp_packet_size(packet_clone)), + .packet_len = dp_packet_size(packet_clone), .reason = cookie->controller.reason, .table_id = state->table_id, .cookie = get_32aligned_be64( @@ -1598,6 +1603,8 @@ process_upcall(struct udpif *udpif, struct upcall *upcall, }, }; + dp_packet_delete(packet_clone); + if (cookie->controller.continuation) { am->pin.up.stack = (state->stack_size ? xmemdup(state->stack, state->stack_size) -- 2.39.3 _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
