From 53a1a696c33fc64c76bd29831ed61c8e50fbc495 Mon Sep 17 00:00:00 2001 From: Hannes Reinecke Date: Wed, 14 May 2014 16:01:10 +0200 Subject: fipvlan: clean up state machine for pfd_add pfd_add just adds the fd to the internal list without any checking. So use the 'fip_ready' flag to track this. Signed-off-by: Hannes Reinecke --- fipvlan.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/fipvlan.c b/fipvlan.c index 9f3b07d..a183233 100644 --- a/fipvlan.c +++ b/fipvlan.c @@ -398,10 +398,17 @@ static void rtnl_recv_newlink(struct nlmsghdr *nh) /* already tracking, update operstate and return */ iff->running = running; if (!iff->running) { - pfd_remove(iff->ps); + if (iff->fip_ready) { + pfd_remove(iff->ps); + iff->fip_ready = false; + } return; } - pfd_add(iff->ps); + if (iff->ps >= 0 && !iff->fip_ready) { + pfd_add(iff->ps); + iff->fip_ready = true; + } + if (!config.start) return; @@ -441,6 +448,7 @@ static void rtnl_recv_newlink(struct nlmsghdr *nh) iff->ifindex = ifm->ifi_index; iff->running = running; iff->fip_ready = false; + iff->ps = -1; if (ifla[IFLA_LINK]) iff->iflink = *(int *)RTA_DATA(ifla[IFLA_LINK]); else @@ -814,7 +822,8 @@ static int probe_fip_interface(struct iff *iff) if (iff->req_sent) return 0; - if (!iff->fip_ready) { + if (iff->ps < 0) { + iff->fip_ready = false; iff->ps = fip_socket(iff->ifindex, FIP_NONE); if (iff->ps < 0) { FIP_LOG_DBG("if %d not ready\n", iff->ifindex); @@ -822,6 +831,8 @@ static int probe_fip_interface(struct iff *iff) } setsockopt(iff->ps, SOL_PACKET, PACKET_ORIGDEV, &origdev, sizeof(origdev)); + } + if (!iff->fip_ready) { pfd_add(iff->ps); iff->fip_ready = true; } -- 1.8.4.5