]> git.ipfire.org Git - thirdparty/dhcpcd.git/commitdiff
BSD: Use SO_RERROR on the route(4) socket.
authorRoy Marples <roy@marples.name>
Wed, 7 Nov 2018 18:57:20 +0000 (18:57 +0000)
committerRoy Marples <roy@marples.name>
Wed, 7 Nov 2018 18:57:20 +0000 (18:57 +0000)
This allows NetBSD to receive ENOBUFS again so it can detect
route(4) overflow.
This was recently defaulted to off globably, but is now settable
per socket.

src/if-bsd.c

index c1a6be861a8000b615d06ee8bfa7026b02137e26..e9ebfdcef01e659d526109ccaebe23edbe25e561 100644 (file)
@@ -125,6 +125,9 @@ int
 if_opensockets_os(struct dhcpcd_ctx *ctx)
 {
        struct priv *priv;
+#ifdef SO_RERROR
+       int on = 1;
+#endif
 #if defined(RO_MSGFILTER) || defined(ROUTE_MSGFILTER)
        unsigned char msgfilter[] = {
            RTM_IFINFO,
@@ -161,6 +164,15 @@ if_opensockets_os(struct dhcpcd_ctx *ctx)
        if (ctx->link_fd == -1)
                return -1;
 
+#ifdef SO_RERROR
+       /* Tell recvmsg(2) to return ENOBUFS if the receiving socket overflows
+        * from too many route(4) messages so we can re-sync our state
+        * with reality. */
+       if (setsockopt(ctx->link_fd, SOL_SOCKET, SO_RERROR,
+           &on, sizeof(on)) == -1)
+               logerr("%s: SO_RERROR", __func__);
+#endif
+
 #if defined(RO_MSGFILTER)
        if (setsockopt(ctx->link_fd, PF_ROUTE, RO_MSGFILTER,
            &msgfilter, sizeof(msgfilter)) == -1)