CMake: bump the minimum required CMake version to 3.5
[project/netifd.git] / system-linux.c
index b64c00755606330d1f8acb9df6c68ee9867a4eba..4463a2a8282a1151cb99734d65dd57689a7fad52 100644 (file)
@@ -169,19 +169,14 @@ static void
 handler_nl_event(struct uloop_fd *u, unsigned int events)
 {
        struct event_socket *ev = container_of(u, struct event_socket, uloop);
-       int err;
-       socklen_t errlen = sizeof(err);
+       int ret;
 
-       if (!u->error) {
-               nl_recvmsgs_default(ev->sock);
+       ret = nl_recvmsgs_default(ev->sock);
+       if (ret >= 0)
                return;
-       }
-
-       if (getsockopt(u->fd, SOL_SOCKET, SO_ERROR, (void *)&err, &errlen))
-               goto abort;
 
-       switch(err) {
-       case ENOBUFS:
+       switch (-ret) {
+       case NLE_NOMEM:
                /* Increase rx buffer size on netlink socket */
                ev->bufsize *= 2;
                if (nl_socket_set_buffer_size(ev->sock, ev->bufsize, 0))
@@ -195,7 +190,6 @@ handler_nl_event(struct uloop_fd *u, unsigned int events)
        default:
                goto abort;
        }
-       u->error = false;
        return;
 
 abort:
@@ -797,24 +791,19 @@ handle_hotplug_event(struct uloop_fd *u, unsigned int events)
        struct sockaddr_nl nla;
        unsigned char *buf = NULL;
        int size;
-       int err;
-       socklen_t errlen = sizeof(err);
 
-       if (!u->error) {
-               while ((size = nl_recv(ev->sock, &nla, &buf, NULL)) > 0) {
-                       if (nla.nl_pid == 0)
-                               handle_hotplug_msg((char *) buf, size);
+       while ((size = nl_recv(ev->sock, &nla, &buf, NULL)) > 0) {
+               if (nla.nl_pid == 0)
+                       handle_hotplug_msg((char *) buf, size);
 
-                       free(buf);
-               }
-               return;
+               free(buf);
        }
 
-       if (getsockopt(u->fd, SOL_SOCKET, SO_ERROR, (void *)&err, &errlen))
-               goto abort;
+       switch (-size) {
+       case 0:
+               return;
 
-       switch(err) {
-       case ENOBUFS:
+       case NLE_NOMEM:
                /* Increase rx buffer size on netlink socket */
                ev->bufsize *= 2;
                if (nl_socket_set_buffer_size(ev->sock, ev->bufsize, 0))
@@ -824,7 +813,6 @@ handle_hotplug_event(struct uloop_fd *u, unsigned int events)
        default:
                goto abort;
        }
-       u->error = false;
        return;
 
 abort:
@@ -2262,7 +2250,8 @@ system_if_apply_settings(struct device *dev, struct device_settings *s, uint64_t
        if (apply_mask & DEV_OPT_MASTER) {
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(6,1,0)
                system_set_master(dev, s->master_ifindex);
-               system_refresh_orig_macaddr(dev, &dev->orig_settings);
+               if (!(apply_mask & (DEV_OPT_MACADDR | DEV_OPT_DEFAULT_MACADDR)) || dev->external)
+                       system_refresh_orig_macaddr(dev, &dev->orig_settings);
 #else
                netifd_log_message(L_WARNING, "%s Your kernel is older than linux 6.1.0, changing DSA port conduit is not supported!", dev->ifname);
 #endif