From e3b71e90ddee6cdad2beb5eaa939382066c7346c Mon Sep 17 00:00:00 2001 From: Alex Gonzalez Date: Tue, 26 Aug 2014 19:10:35 +0200 Subject: [PATCH] btfilter: Rewrite netlink listener code. https://jira.digi.com/browse/DEL-1174 Signed-off-by: Alex Gonzalez --- ...ilt_wan-Rewrite-the-netlink-listener.patch | 127 ++++++++++++++++++ .../btfilter/btfilter_v3.4p4-b3.4.0.158.bb | 1 + 2 files changed, 128 insertions(+) create mode 100644 meta-digi-dey/recipes-connectivity/btfilter/btfilter-v3.4p4-b3.4.0.158/0003-abtfilt_wan-Rewrite-the-netlink-listener.patch diff --git a/meta-digi-dey/recipes-connectivity/btfilter/btfilter-v3.4p4-b3.4.0.158/0003-abtfilt_wan-Rewrite-the-netlink-listener.patch b/meta-digi-dey/recipes-connectivity/btfilter/btfilter-v3.4p4-b3.4.0.158/0003-abtfilt_wan-Rewrite-the-netlink-listener.patch new file mode 100644 index 000000000..955fe6df7 --- /dev/null +++ b/meta-digi-dey/recipes-connectivity/btfilter/btfilter-v3.4p4-b3.4.0.158/0003-abtfilt_wan-Rewrite-the-netlink-listener.patch @@ -0,0 +1,127 @@ +From 641f02fe3638d291a0ef53c076bda7e68e2f7d28 Mon Sep 17 00:00:00 2001 +From: Alex Gonzalez +Date: Tue, 26 Aug 2014 16:57:14 +0200 +Subject: [PATCH] abtfilt_wan: Rewrite the netlink listener. + +Not sure how old this code is but it is not working properly any more. + +Not only it incorrectly detects the netlink messages as corrupted, but it +also assumes an RTM_DELLINK will be issued for the link down event which +is not correct. + +I have updated the code trying to touch as little things as possible. + +Signed-off-by: Alex Gonzalez +--- + abtfilt_wlan.c | 87 +++++++++++++++++++++++++++++++++++++--------------------- + 1 file changed, 56 insertions(+), 31 deletions(-) + +diff --git a/abtfilt_wlan.c b/abtfilt_wlan.c +index b1966cef7ef2..64dffde37f19 100644 +--- a/abtfilt_wlan.c ++++ b/abtfilt_wlan.c +@@ -232,6 +232,59 @@ Abf_WlanDispatchIO(ATHBT_FILTER_INFO *pInfo, unsigned long int req, + return A_OK; + } + ++static void ++print_link(struct ifinfomsg *ifi, int len, int up) ++{ ++ struct rtattr *attrib; ++ ++ for(attrib = IFLA_RTA(ifi); RTA_OK(attrib, len); ++ attrib = RTA_NEXT(attrib, len)) { ++ switch(attrib->rta_type) { ++ case IFLA_IFNAME: ++ A_DEBUG("[%d:%s] Link %s\n", ifi->ifi_index, ++ (char *)RTA_DATA(attrib), up ? "UP" : "DOWN"); ++ break; ++ default: ++ break; ++ } ++ } ++} ++ ++static void ++parse_message(ATH_BT_FILTER_INSTANCE *pInstance, int len, char *buf) ++{ ++ struct nlmsghdr *msg_ptr; ++ struct ifinfomsg *ifi; ++ int len1; ++ ++ for(msg_ptr = (struct nlmsghdr *)buf; NLMSG_OK(msg_ptr, len); ++ msg_ptr = NLMSG_NEXT(msg_ptr, len)) { ++ /* Finish reading */ ++ if(msg_ptr->nlmsg_type == NLMSG_DONE) ++ break; ++ ++ /* Message is some kind of error */ ++ if(msg_ptr->nlmsg_type == NLMSG_ERROR) { ++ A_ERR("Message is an error.\n"); ++ break; ++ } ++ ++ if(msg_ptr->nlmsg_type == RTM_NEWLINK) { ++ ifi = NLMSG_DATA(msg_ptr); ++ len1 = msg_ptr->nlmsg_len - NLMSG_LENGTH(sizeof(*ifi)); ++ if(ifi->ifi_flags & IFF_RUNNING){ ++ print_link(ifi, len1, 1); ++ NewLinkEvent(pInstance, msg_ptr, len1); ++ } ++ else { ++ print_link(ifi, len1, 0); ++ DelLinkEvent(pInstance, msg_ptr, len1); ++ } ++ break; ++ } ++ } ++} ++ + /* Internal functions */ + static void * + WlanEventThread(void *arg) +@@ -322,41 +375,13 @@ WlanEventThread(void *arg) + } while (left == -1 && errno == EINTR); + + if (left < 0) { +- A_ERR("[%s] recvfrom(netlink)\n", __FUNCTION__); ++ A_ERR("[%s] recvfrom(netlink) error %d\n", __FUNCTION__, ++ left); + continue; + // break; + } + +- h = (struct nlmsghdr *) buf; +- while (left >= (int)sizeof(*h)) { +- int len, plen; +- +- len = h->nlmsg_len; +- plen = len - sizeof(*h); +- if (len > left || plen < 0) { +- A_ERR("[%s] malformed netlink message\n", __FUNCTION__); +- continue; +- } +- +- //A_DEBUG("RTM Message Type: %s\n", +- // ((h->nlmsg_type == RTM_NEWLINK) ? +- // "RTM_NEWLINK" : ((h->nlmsg_type == RTM_DELLINK) ? +- // "RTM_DELLINK" : "RTM_OTHER"))); +- switch (h->nlmsg_type) { +- case RTM_NEWLINK: +- NewLinkEvent(pInstance, h, plen); +- break; +- case RTM_DELLINK: +- DelLinkEvent(pInstance, h, plen); +- break; +- default: +- break; +- } +- +- len = NLMSG_ALIGN(len); +- left -= len; +- h = (struct nlmsghdr *) ((char *) h + len); +- } ++ parse_message(pInstance, left, buf); + } + } + diff --git a/meta-digi-dey/recipes-connectivity/btfilter/btfilter_v3.4p4-b3.4.0.158.bb b/meta-digi-dey/recipes-connectivity/btfilter/btfilter_v3.4p4-b3.4.0.158.bb index ce26258ae..9812a0270 100644 --- a/meta-digi-dey/recipes-connectivity/btfilter/btfilter_v3.4p4-b3.4.0.158.bb +++ b/meta-digi-dey/recipes-connectivity/btfilter/btfilter_v3.4p4-b3.4.0.158.bb @@ -12,6 +12,7 @@ PR = "${DISTRO}.r0" SRC_URI = "${DIGI_MIRROR}/${PN}-${PV}.tar.bz2 \ file://0001-enable-libnl3.patch \ file://0002-cross-compile.patch \ + file://0003-abtfilt_wan-Rewrite-the-netlink-listener.patch \ file://bluez-init" SRC_URI[md5sum] = "06a26d3a368c33b508d660ea84d476ee"