@@ -53,6 +53,39 @@ static void wpa_supplicant_ctrl_iface_send(struct ctrl_iface_priv *priv,
int level, const char *buf,
size_t len);
+static int sockaddr_compare(struct sockaddr *a, struct sockaddr *b)
+{
+ struct sockaddr_in *in_a, *in_b;
+ struct sockaddr_in6 *in6_a, *in6_b;
+
+ if (a->sa_family != b->sa_family)
+ return 1;
+
+ switch (a->sa_family) {
+ case AF_INET:
+ in_a = (struct sockaddr_in *) a;
+ in_b = (struct sockaddr_in *) b;
+
+ if (in_a->sin_port != in_b->sin_port)
+ return 1;
+ if (in_a->sin_addr.s_addr != in_b->sin_addr.s_addr)
+ return 1;
+ break;
+ case AF_INET6:
+ in6_a = (struct sockaddr_in6 *) a;
+ in6_b = (struct sockaddr_in6 *) b;
+
+ if (in6_a->sin6_port != in6_b->sin6_port)
+ return 1;
+ if (os_memcmp(&in6_a->sin6_addr, &in6_b->sin6_addr, sizeof(in6_a->sin6_addr)))
+ return 1;
+ break;
+ default:
+ return 1;
+ }
+
+ return 0;
+}
static int wpa_supplicant_ctrl_iface_attach(struct ctrl_iface_priv *priv,
#ifdef CONFIG_CTRL_IFACE_UDP_IPV6
@@ -100,15 +133,7 @@ static int wpa_supplicant_ctrl_iface_detach(struct ctrl_iface_priv *priv,
dst = priv->ctrl_dst;
while (dst) {
-#ifdef CONFIG_CTRL_IFACE_UDP_IPV6
- if (from->sin6_port == dst->addr.sin6_port &&
- !os_memcmp(&from->sin6_addr, &dst->addr.sin6_addr,
- sizeof(from->sin6_addr))) {
-#else /* CONFIG_CTRL_IFACE_UDP_IPV6 */
- if (from->sin_addr.s_addr == dst->addr.sin_addr.s_addr &&
- from->sin_port == dst->addr.sin_port) {
-#endif /* CONFIG_CTRL_IFACE_UDP_IPV6 */
-
+ if (!sockaddr_compare((struct sockaddr *) from, (struct sockaddr *) &dst->addr)) {
getnameinfo((struct sockaddr *) from, fromlen,
host, sizeof(host),
service, sizeof(service),
@@ -148,14 +173,7 @@ static int wpa_supplicant_ctrl_iface_level(struct ctrl_iface_priv *priv,
dst = priv->ctrl_dst;
while (dst) {
-#if CONFIG_CTRL_IFACE_UDP_IPV6
- if (from->sin6_port == dst->addr.sin6_port &&
- !os_memcmp(&from->sin6_addr, &dst->addr.sin6_addr,
- sizeof(from->sin6_addr))) {
-#else /* CONFIG_CTRL_IFACE_UDP_IPV6 */
- if (from->sin_addr.s_addr == dst->addr.sin_addr.s_addr &&
- from->sin_port == dst->addr.sin_port) {
-#endif /* CONFIG_CTRL_IFACE_UDP_IPV6 */
+ if (!sockaddr_compare((struct sockaddr *) from, (struct sockaddr *) &dst->addr)) {
getnameinfo((struct sockaddr *) from, fromlen,
host, sizeof(host),
service, sizeof(service),
Kill not needed #ifdefs and use helper sockaddr_compare function. Signed-off-by: Janusz Dziedzic <janusz.dziedzic@tieto.com> --- wpa_supplicant/ctrl_iface_udp.c | 52 +++++++++++++++++++++++++++-------------- 1 file changed, 35 insertions(+), 17 deletions(-)