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))
default:
goto abort;
}
- u->error = false;
return;
abort:
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))
default:
goto abort;
}
- u->error = false;
return;
abort:
apply_mask &= s->flags;
+ if (apply_mask & DEV_OPT_MASTER) {
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(6,1,0)
+ system_set_master(dev, s->master_ifindex);
+ 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
+ }
+
memset(&ifr, 0, sizeof(ifr));
strncpy(ifr.ifr_name, dev->ifname, sizeof(ifr.ifr_name) - 1);
if (apply_mask & DEV_OPT_MTU) {
system_set_drop_unsolicited_na(dev, s->drop_unsolicited_na ? "1" : "0");
if (apply_mask & DEV_OPT_ARP_ACCEPT)
system_set_arp_accept(dev, s->arp_accept ? "1" : "0");
- 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);
-#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
- }
system_set_ethtool_settings(dev, s);
}