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,
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)