--- embedtools/src/dwds.c 2010/10/27 16:45:35 1.1.2.7 +++ embedtools/src/dwds.c 2010/10/28 09:08:58 1.1.2.8 @@ -53,8 +53,62 @@ sigHandler(int sig) } static int -RtMsg(struct dwds_if *wds, struct rt_msghdr *msg, size_t len) +RtMsg(struct dwds_if **wds, struct rt_msghdr *msg, size_t len) { + struct if_announcemsghdr *ifan; + const u_char *v; + struct ether_addr bssid; + + assert(wds); + assert(msg); + + if (msg->rtm_version != RTM_VERSION) { + syslog(LOG_ERR, "Error:: routing message version %d not understood!\n", msg->rtm_version); + return -1; + } + + switch (msg->rtm_type) { + case RTM_IFANNOUNCE: + ifan = (struct if_announcemsghdr*) msg; + switch (ifan->ifan_what) { + case IFAN_ARRIVAL: + VERB(1) syslog(LOG_INFO, "RTM_IFANNOUNCE: if# %d, what: arrival\n", + ifan->ifan_index); + break; + case IFAN_DEPARTURE: + VERB(1) syslog(LOG_INFO, "RTM_IFANNOUNCE: if# %d, what: departure\n", + ifan->ifan_index); + wifi_destroyWDS(ifan->ifan_name, wds); + break; + } + break; + case RTM_IEEE80211: +#define V(type) ((struct type *)(&ifan[1])) + ifan = (struct if_announcemsghdr*) msg; + switch (ifan->ifan_what) { + case RTM_IEEE80211_DISASSOC: + v = cfg_GetAttribute(&cfg, CFG("dwds"), CFG("discover_on_join")); + if (!v || !strtol((char*) v, NULL, 0)) + break; + /* fall thru ... */ + case RTM_IEEE80211_LEAVE: + break; + + case RTM_IEEE80211_JOIN: + case RTM_IEEE80211_REJOIN: + case RTM_IEEE80211_ASSOC: + case RTM_IEEE80211_REASSOC: + v = cfg_GetAttribute(&cfg, CFG("dwds"), CFG("discover_on_join")); + if (!v || !strtol((char*) v, NULL, 0)) + break; + /* fall thru ... */ + case RTM_IEEE80211_WDS: + break; + } +#undef V + break; + } + return 0; } @@ -145,7 +199,7 @@ main(int argc, char **argv) syslog(LOG_ERR, "Error:: read() #%d - %s\n", errno, strerror(errno)); Kill++; } else - RtMsg(wds, (struct rt_msghdr*) msg, len); + RtMsg(&wds, (struct rt_msghdr*) msg, len); } close(s);