From 9f07da4aea0683dec4fdcd270c80e68b4acd057a Mon Sep 17 00:00:00 2001 From: Pierre Pfister Date: Thu, 19 May 2016 14:49:30 +0100 Subject: [Netlink] Bugfix - Use indexes rather than pointers Change-Id: I76d3400b4d62e871def81420203407761c8d5c7f Signed-off-by: Pierre Pfister --- netlink/librtnl/netns.c | 6 +++--- netlink/librtnl/rtnl.c | 17 +++++++++-------- 2 files changed, 12 insertions(+), 11 deletions(-) (limited to 'netlink') diff --git a/netlink/librtnl/netns.c b/netlink/librtnl/netns.c index 0101392..6af2645 100644 --- a/netlink/librtnl/netns.c +++ b/netlink/librtnl/netns.c @@ -581,7 +581,7 @@ static void ns_recv_error(rtnl_error_t err, uword o) { //An error was received. Reset everything. - netns_p *ns = (netns_p *)o; + netns_p *ns = &netns_main.netnss[o]; u32 *indexes = 0; u32 *i = 0; @@ -604,7 +604,7 @@ ns_recv_error(rtnl_error_t err, uword o) static void ns_recv_rtnl(struct nlmsghdr *hdr, uword o) { - netns_p *ns = (netns_p *)o; + netns_p *ns = &netns_main.netnss[o]; switch (hdr->nlmsg_type) { case RTM_NEWROUTE: case RTM_DELROUTE: @@ -657,7 +657,7 @@ netns_get(char *name) rtnl_stream_t s = { .recv_message = ns_recv_rtnl, .error = ns_recv_error, - .opaque = (uword)ns, + .opaque = (uword)(ns - nm->netnss), }; strcpy(s.name, name); diff --git a/netlink/librtnl/rtnl.c b/netlink/librtnl/rtnl.c index a0726c9..c0b2327 100644 --- a/netlink/librtnl/rtnl.c +++ b/netlink/librtnl/rtnl.c @@ -101,9 +101,10 @@ rtnl_cancel_timeout(rtnl_ns_t *ns) static clib_error_t *rtnl_read_cb(struct unix_file * f) { + rtnl_main_t *rm = &rtnl_main; vlib_main_t *vm = vlib_get_main(); - rtnl_ns_t *ns = (rtnl_ns_t *) f->private_data; - vlib_process_signal_event_pointer(vm, rtnl_process_node.index, RTNL_E_READ, ns); + rtnl_ns_t *ns = &rm->streams[f->private_data]; + vlib_process_signal_event(vm, rtnl_process_node.index, RTNL_E_READ, (uword)(ns - rm->streams)); return 0; } @@ -222,6 +223,7 @@ static void *rtnl_thread_fn(void *p) static int rtnl_socket_open(rtnl_ns_t *ns) { + rtnl_main_t *rm = &rtnl_main; pthread_t thread; void *thread_ret; if(pthread_create(&thread, NULL, rtnl_thread_fn, ns)) { @@ -257,7 +259,7 @@ static int rtnl_socket_open(rtnl_ns_t *ns) unix_file_t template = {0}; template.read_function = rtnl_read_cb; template.file_descriptor = ns->rtnl_socket; - template.private_data = (uword) ns; + template.private_data = (uword) (ns - rm->streams); ns->unix_index = unix_file_add (&unix_main, &template); return 0; } @@ -442,7 +444,7 @@ rtnl_process_read(rtnl_ns_t *ns) while(1) { if((len = recv(ns->rtnl_socket, buff, RTNL_BUFFSIZ, MSG_DONTWAIT)) < 0) { if(errno != EAGAIN) { - clib_warning("rtnetlink recv error: %s", strerror(errno)); + clib_warning("rtnetlink recv error (%d) [%s]: %s", ns->rtnl_socket, ns->stream.name, strerror(errno)); return -1; } return 0; @@ -506,7 +508,7 @@ rtnl_process (vlib_main_t * vm, rtnl_ns_t *ns; uword *d; vec_foreach(d, event_data) { - ns = (rtnl_ns_t *)d[0]; + ns = &rm->streams[d[0]]; switch (event_type) { case RTNL_E_CLOSE: @@ -558,7 +560,7 @@ rtnl_stream_open(rtnl_stream_t *template) ns->state = RTNL_S_INIT; ns->ns_fd = fd; ns->stream = *template; - vlib_process_signal_event_pointer(vm, rtnl_process_node.index, RTNL_E_OPEN, ns); + vlib_process_signal_event(vm, rtnl_process_node.index, RTNL_E_OPEN, (uword)(ns - rm->streams)); return ns - rm->streams; } @@ -568,8 +570,7 @@ rtnl_stream_close(u32 stream_index) vlib_main_t *vm = vlib_get_main(); rtnl_main_t *rm = &rtnl_main; ASSERT(!pool_is_free_index(rm->streams, stream_index)); - rtnl_ns_t *ns = pool_elt_at_index(rm->streams, stream_index); - vlib_process_signal_event_pointer(vm, rtnl_process_node.index, RTNL_E_CLOSE, ns); + vlib_process_signal_event(vm, rtnl_process_node.index, RTNL_E_CLOSE, stream_index); } clib_error_t * -- cgit 1.2.3-korg