@@ -71,6 +71,11 @@ typedef struct tport_nat_s tport_nat_t;
7171#include  <sofia-sip/rbtree.h> 
7272
7373#include  "tport_internal.h" 
74+ #include  <ifaddrs.h> 
75+ #if  HAVE_NET_IF_H 
76+ #include  <net/if.h> 
77+ #endif 
78+ #include  <sys/ioctl.h> 
7479
7580#if  HAVE_FUNC 
7681#elif  HAVE_FUNCTION 
@@ -797,6 +802,51 @@ int tport_bind_socket(int socket,
797802  }
798803#endif 
799804
805+   if  (tport_bind_socket_iface (socket , su , ai ) <  0 ) {
806+     return  -1 ;
807+   }
808+ 
809+   return  0 ;
810+ }
811+ 
812+ int  tport_bind_socket_iface (int  s ,
813+         su_sockaddr_t  * su ,
814+ 		    su_addrinfo_t  * ai )
815+ {
816+   struct  ifaddrs  * addrs , * iap ;
817+   struct  sockaddr_in  * sa ;
818+   struct  ifreq  ifr ;
819+   char  ipaddr [SU_ADDRSIZE  +  2 ];
820+ 
821+   getifaddrs (& addrs );
822+   for  (iap  =  addrs ; iap  !=  NULL ; iap  =  iap -> ifa_next ) {
823+     if  (iap -> ifa_addr  &&  (iap -> ifa_flags  &  IFF_UP ) &&  iap -> ifa_addr -> sa_family  ==  su -> su_family ) {
824+       sa  =  (struct  sockaddr_in  * )(iap -> ifa_addr );
825+       if (sa -> sin_addr .s_addr  ==  su -> su_sin .sin_addr .s_addr ) {
826+         memset (& ifr , 0 , sizeof (struct  ifreq ));
827+         strncpy (ifr .ifr_name , (char  const  * ) iap -> ifa_name , IFNAMSIZ );
828+ 
829+         /* Assign socket to an already active access point (interface) */ 
830+         ioctl (s , SIOCSIFNAME , & ifr );
831+         if  (setsockopt (s , SOL_SOCKET , SO_BINDTODEVICE , (void  * )& ifr , sizeof (ifr )) <  0 ) {
832+             SU_DEBUG_3 (("socket: %d setsockopt(SO_BINDTODEVICE) error binding to ifc %s: %s\n" ,
833+                  s , ifr .ifr_name , su_strerror (su_errno ())));
834+             freeifaddrs (addrs );
835+             return  -1 ;
836+         }
837+         SU_DEBUG_9 (("socket: %d, bound %s to ifc: %s\n" , s ,
838+             su_inet_ntop (su -> su_family , SU_ADDR (su ), ipaddr , sizeof (ipaddr )),
839+             ifr .ifr_name ));
840+         freeifaddrs (addrs );
841+         return  0 ;
842+       }
843+     }
844+   }
845+   freeifaddrs (addrs );
846+ 
847+   SU_DEBUG_3 (("socket: %d: did not find ifc to bind %s\n" ,
848+ 	    s , su_inet_ntop (su -> su_family , SU_ADDR (su ), ipaddr , sizeof (ipaddr ))));
849+   /* Technically it's not a "failure" */ 
800850  return  0 ;
801851}
802852
0 commit comments