From 311b48c70ba74c79d141262188d4e15a336de368 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. Change-Id: Ideabe252ff6c56c6e01ccbc3a27044bac09933f3 Closes-BUG: #1436798 --- 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 5ceefedce..4642b3c0a 100644 --- a/dp-core/vr_flow.c +++ b/dp-core/vr_flow.c @@ -107,7 +107,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; @@ -118,7 +118,6 @@ static void vr_clear_link_local_port(struct vrouter *router, int family, int proto, int port) { - unsigned char *data; unsigned int tmp; @@ -136,15 +135,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; @@ -162,8 +162,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 @@ -201,7 +203,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; + fe->fe_key.key_len = 0; fe->fe_type = VP_TYPE_NULL; memset(&fe->fe_key, 0, sizeof(fe->fe_key)); @@ -322,6 +330,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; } @@ -913,6 +922,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; @@ -1518,6 +1532,8 @@ vr_link_local_ports_reset(struct vrouter *router) memset(router->vr_link_local_ports, 0, router->vr_link_local_ports_size); } + + return; } static void @@ -1528,6 +1544,8 @@ vr_link_local_ports_exit(struct vrouter *router) router->vr_link_local_ports = NULL; router->vr_link_local_ports_size = 0; } + + return; } static int