From 44c224691b44354c594ba786d59dfe17f99ec895 Mon Sep 17 00:00:00 2001 From: "Anand H. Krishnan" Date: Mon, 20 Apr 2015 12:41:11 +0530 Subject: [PATCH] Free the defer data in case of errors To make sure that we flush all the packets that are queued in a flow entry, we run a defer function. If for any reason this defer was not scheduled (because the function was called with no hold queue), the defer data has to be freed. Closes-BUG: #1436798 (cherry picked from commit 8c30ce9a3e254d45dc4de595cc066f2da21c18d6) Conflicts: dp-core/vr_flow.c Change-Id: Ideabe252ff6c56c6e01ccbc3a27044bac09933f3 --- dp-core/vr_flow.c | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/dp-core/vr_flow.c b/dp-core/vr_flow.c index 4d6a5cb82..d34b01ad1 100644 --- a/dp-core/vr_flow.c +++ b/dp-core/vr_flow.c @@ -72,7 +72,7 @@ vr_valid_link_local_port(struct vrouter *router, int family, if (proto == VR_IP_PROTO_UDP) tmp += (router->vr_link_local_ports_size * 8 / 2); - data = router->vr_link_local_ports[(tmp /8)]; + data = router->vr_link_local_ports[(tmp / 8)]; if (data & (1 << (tmp % 8))) return true; @@ -83,7 +83,6 @@ static void vr_clear_link_local_port(struct vrouter *router, int family, int proto, int port) { - unsigned char *data; unsigned int tmp; @@ -101,15 +100,16 @@ vr_clear_link_local_port(struct vrouter *router, int family, if (proto == VR_IP_PROTO_UDP) tmp += (router->vr_link_local_ports_size * 8 / 2); - data = &router->vr_link_local_ports[(tmp /8)]; + data = &router->vr_link_local_ports[(tmp / 8)]; *data &= (~(1 << (tmp % 8))); + + return; } static void vr_set_link_local_port(struct vrouter *router, int family, int proto, int port) { - unsigned char *data; unsigned int tmp; @@ -127,8 +127,10 @@ vr_set_link_local_port(struct vrouter *router, int family, if (proto == VR_IP_PROTO_UDP) tmp += (router->vr_link_local_ports_size * 8 / 2); - data = &router->vr_link_local_ports[tmp /8]; + data = &router->vr_link_local_ports[tmp / 8]; *data |= (1 << (tmp % 8)); + + return; } static void @@ -166,7 +168,13 @@ vr_reset_flow_entry(struct vrouter *router, struct vr_flow_entry *fe, unsigned int index) { memset(&fe->fe_stats, 0, sizeof(fe->fe_stats)); - memset(&fe->fe_hold_list, 0, sizeof(fe->fe_hold_list));; + + if (fe->fe_hold_list) { + vr_printf("vrouter: Potential memory leak @ %s:%d\n", + __FILE__, __LINE__); + } + fe->fe_hold_list = NULL; + memset(&fe->fe_key, 0, sizeof(fe->fe_key)); vr_flow_reset_mirror(router, fe, index); @@ -323,6 +331,7 @@ vr_flow_queue_free_defer(struct vr_flow_md *flmd, struct vr_flow_queue *vfq) vdd->vdd_data = (void *)vfq; vr_defer(flmd->flmd_router, vr_flow_queue_free, (void *)vdd); + flmd->flmd_defer_data = NULL; return; } @@ -1131,6 +1140,11 @@ vr_flow_flush(void *arg) } exit_flush: + if (flmd->flmd_defer_data) { + vr_put_defer_data(flmd->flmd_defer_data); + flmd->flmd_defer_data = NULL; + } + vr_free(flmd); return; @@ -1664,6 +1678,8 @@ vr_link_local_ports_reset(struct vrouter *router) memset(router->vr_link_local_ports, 0, router->vr_link_local_ports_size); } + + return; } @@ -1676,6 +1692,8 @@ vr_link_local_ports_exit(struct vrouter *router) router->vr_link_local_ports = NULL; router->vr_link_local_ports_size = 0; } + + return; } int