From 56427da393dde37a656d3260e9d430e54c8a8982 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josef=20S=C3=B6ntgen?= Date: Mon, 28 Feb 2022 10:56:31 +0100 Subject: [PATCH] wifi: add interface query functions Various libraries, like libnl and wpa_driver_nl80211, used hardcoded values for the interface index (ifindex) and name (ifname). To accomdate the legacy as well as the upcoming new driver we add functions to query these information where at least the index differs. Issue #4455. --- repos/dde_linux/src/lib/libnl/if.cc | 11 ++++++----- repos/dde_linux/src/lib/wifi/init.cc | 12 ++++++++++++ repos/dde_linux/src/lib/wifi/symbol.map | 3 +++ repos/dde_linux/src/lib/wpa_driver_nl80211/ioctl.cc | 4 +++- 4 files changed, 24 insertions(+), 6 deletions(-) diff --git a/repos/dde_linux/src/lib/libnl/if.cc b/repos/dde_linux/src/lib/libnl/if.cc index e121b3982e..e99254d4db 100644 --- a/repos/dde_linux/src/lib/libnl/if.cc +++ b/repos/dde_linux/src/lib/libnl/if.cc @@ -3,20 +3,21 @@ #include -#define WLAN_DEV "wlan0" - extern "C" { +unsigned int wifi_ifindex(void); +char const * wifi_ifname(void); + unsigned int if_nametoindex(const char *ifname) { - /* we make sure the index is always 1 in the wifi driver */ - return 1; + return wifi_ifindex(); } char *if_indextoname(unsigned int ifindex, char *ifname) { - Genode::memcpy(ifname, WLAN_DEV, Genode::strlen(WLAN_DEV)); + char const *p = wifi_ifname(); + Genode::memcpy(ifname, p, Genode::strlen(p)); return ifname; } diff --git a/repos/dde_linux/src/lib/wifi/init.cc b/repos/dde_linux/src/lib/wifi/init.cc index 1f2db4a3fe..391f240963 100644 --- a/repos/dde_linux/src/lib/wifi/init.cc +++ b/repos/dde_linux/src/lib/wifi/init.cc @@ -67,6 +67,18 @@ void wifi_set_rfkill(bool blocked) } +extern "C" unsigned int wifi_ifindex(void) +{ + return 1; +} + + +extern "C" char const wifi_ifname(void) +{ + return "wlan0"; +} + + /************************** ** socketcall poll hack ** **************************/ diff --git a/repos/dde_linux/src/lib/wifi/symbol.map b/repos/dde_linux/src/lib/wifi/symbol.map index 261c62a9f3..765e7b3952 100644 --- a/repos/dde_linux/src/lib/wifi/symbol.map +++ b/repos/dde_linux/src/lib/wifi/symbol.map @@ -14,6 +14,9 @@ _*wifi_*_rfkill*; _*wifi_kick_*; + /* interface libnl/wpa_driver_nl80211*/ + wifi_if*; + /* used by libnl's time() */ jiffies; diff --git a/repos/dde_linux/src/lib/wpa_driver_nl80211/ioctl.cc b/repos/dde_linux/src/lib/wpa_driver_nl80211/ioctl.cc index 37ba5eff9b..7394398211 100644 --- a/repos/dde_linux/src/lib/wpa_driver_nl80211/ioctl.cc +++ b/repos/dde_linux/src/lib/wpa_driver_nl80211/ioctl.cc @@ -31,6 +31,8 @@ extern Wifi::Socket_call socket_call; extern "C" { +unsigned int wifi_ifindex(void); + int ioctl(int fd, unsigned long request, ...) { long arg; @@ -46,7 +48,7 @@ int ioctl(int fd, unsigned long request, ...) Genode::error("ioctl: request SIOCGIFADDR not implemented."); return -1; case SIOCGIFINDEX: - ifr->ifr_ifindex = 1; + ifr->ifr_ifindex = wifi_ifindex(); return 0; case SIOCGIFHWADDR: socket_call.get_mac_address((unsigned char*)ifr->ifr_hwaddr.sa_data);