$OpenBSD: patch-socket_c,v 1.2 2010/07/08 09:18:25 fkr Exp $
--- socket.c.orig	Fri Dec 11 05:59:45 2009
+++ socket.c	Tue Jul  6 23:49:11 2010
@@ -503,6 +503,20 @@ socket_set_tcp_nodelay (int sd, int state)
 #endif
 }
 
+static void
+socket_set_rtable (int sd, int rtable)
+{
+#ifdef TARGET_OPENBSD
+  if (rtable > 0)
+  {
+    if (setsockopt (sd, IPPROTO_IP, SO_RTABLE, &rtable, sizeof(rtable)) == -1)
+      msg (M_SOCKERR, "Socket flags: SO_RTABLE=%d failed, cannot bind on specified routing domain", rtable);
+    else
+      dmsg (D_SOCKET_DEBUG, "Socket flags: SO_RTABLE=%d succeeded", rtable);
+  }
+#endif
+}
+
 static bool
 socket_set_flags (int sd, unsigned int sockflags)
 {
@@ -1181,6 +1195,7 @@ link_socket_init_phase1 (struct link_socket *sock,
 			 int mtu_discover_type,
 			 int rcvbuf,
 			 int sndbuf,
+			 int rtable,
 			 unsigned int sockflags)
 {
   ASSERT (sock);
@@ -1291,6 +1306,10 @@ link_socket_init_phase1 (struct link_socket *sock,
   else if (mode != LS_MODE_TCP_ACCEPT_FROM)
     {
       create_socket (sock);
+
+      /* set the routing domain for the socket */
+      socket_set_rtable (sock->sd, rtable);
+
       resolve_bind_local (sock);
       resolve_remote (sock, 1, NULL, NULL);
     }
