Hello,
I am not able to get a behavior similar to SO_BINDTODEVICE (on linux) using the
IP_BOUND_IF option on
SunOS dev-224 5.10 Generic_127127-11 sun4v sparc SUNW,SPARC-Enterprise-T5220
Below is a piece of some sample connect code I am testing with. I was expecting
the SYNs to go out on the specified interface, but it seems like the kernel
makes a choice based on the dest IP addr. Binding to specific IP (assigned to
an interface) doesn't seem to help either.
On the other hand, this code work just fine on linux, irrespective of dest IP
or the local bind address, I can specify 0.0.0.0 as the local bind address and
it will still send the pkt out of the specified interface.
What am I missing here?
I would appreciate any help I can get.
Thanks for your time.
-- Pranav
------------------------- code ---------------------------------
//socket
if ((sock = socket(AF_INET, SOCK_STREAM, 0) ) < 0) {
perror("socket()");
}
//bind
memset(&from, 0, sizeof(from));
from.sin_family = AF_INET;
from.sin_addr.s_addr = inet_addr(argv[1]);
from.sin_port = htons(0);
if(bind(sock, (struct sockaddr *)&from, sizeof(from)) < 0) {
perror("bind()");
}
//bound
#ifdef LINUX
fprintf(stdout, "interface %s\n", argv[2]);
strncpy( interface.ifr_ifrn.ifrn_name, argv[2], 20);
if(setsockopt (sock, SOL_SOCKET, SO_BINDTODEVICE, (char *)&interface,
sizeof(interface)) < 0) {
perror("setsockopt");
}
#elif SOLARIS
index = if_nametoindex(argv[2]);
fprintf(stdout, "index for %s=%d\n", argv[2], index);
if(setsockopt (sock, IPPROTO_IP, IP_BOUND_IF, &index, sizeof(index)) < 0){
perror("setsockopt");
}
#endif
//connect
memset(&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = inet_addr(argv[3]);
sin.sin_port = htons(5000);
This message posted from opensolaris.org
_______________________________________________
opensolaris-help mailing list
[email protected]