diff --git a/nx/external/bsd/include/sys/socket.h b/nx/external/bsd/include/sys/socket.h
index c8195dc2..d52ec8b9 100644
--- a/nx/external/bsd/include/sys/socket.h
+++ b/nx/external/bsd/include/sys/socket.h
@@ -440,6 +440,30 @@ struct cmsghdr {
 // socket credential stuff, we don't need this
 // cmsg macros, uses some obscure macro
 
+#define __ALIGNBYTES32 (sizeof(__uint32_t) - 1)
+#define __ALIGN32(p)   ((__size_t)((char *)(__size_t)(p) + __ALIGNBYTES32) &~ __ALIGNBYTES32)
+
+/*
+ * RFC 2292 requires to check msg_controllen, in case that the kernel returns
+ * an empty list for some reasons.
+ */
+#define	CMSG_FIRSTHDR(mhdr) \
+	((mhdr)->msg_controllen >= sizeof(struct cmsghdr) ? \
+	 (struct cmsghdr *)(mhdr)->msg_control : \
+	 (struct cmsghdr *)NULL)
+
+
+/*
+ * Given pointer to struct cmsghdr, return pointer to next cmsghdr
+ * RFC 2292 says that CMSG_NXTHDR(mhdr, NULL) is equivalent to CMSG_FIRSTHDR(mhdr)
+ */
+#define	CMSG_NXTHDR(mhdr, cmsg)	\
+	(((char *)(cmsg) + __ALIGN32((cmsg)->cmsg_len) + \
+			    __ALIGN32(sizeof(struct cmsghdr)) > \
+	    ((char *)(mhdr)->msg_control) + (mhdr)->msg_controllen) ? \
+	    (struct cmsghdr *)NULL : \
+	    (struct cmsghdr *)((char *)(cmsg) + __ALIGN32((cmsg)->cmsg_len)))
+
 /* "Socket"-level control message types: */
 #define	SCM_RIGHTS	0x01		/* access rights (array of int) */
 #if __BSD_VISIBLE