Hi osmo_sock experts,
I'm currently looking at making the osmo-hnbgw interface addresses configurable, an I came across a detail. This is not really pressing, but while I'm at it I might as well cover all of the addresses.
So far I see in osmo-iuh's hnbgw.c the local address osmo-hnbgw uses to accept Iuh connections from a 3G cell, and the remote addresses of IuCS and IuPS, each passed to osmo_sock_init():
3G cell -------> 1.2.3.4 OSMO-HNBGW IuPS-local? -------> 10.9.8.7 OSMO-SGSN
So we tell one socket to listen on local 1.2.3.4 for Iuh. We tell another to send IuPS to 10.9.8.7.
But how would I tell the IuPS to use a given local interface 1.2.3.5 to contact the SGSN's address? Would I bind() to a given local IP address and connect() to the remote one? I must admit that the details are not 100% clear to me. AFAIK it can be important to set a local IP address and port to send from. So if there's something I don't understand yet I would appreciate a hint.
Anyway, in osmo_sock_init, I see:
if ((flags & (OSMO_SOCK_F_BIND | OSMO_SOCK_F_CONNECT)) == (OSMO_SOCK_F_BIND | OSMO_SOCK_F_CONNECT)) { fprintf(stderr, "invalid: both bind and connect flags set:" " %s:%u\n", host, port); return -EINVAL; }
Should we have another osmo_sock_init that can set up a socket like this code I found somewhere at sysmocom to define both ends of a connection?
fd = socket(AF_INET, SOCK_DGRAM, 0); if (fd < 0) { printf("socket() failed: %s\n", strerror(errno)); return -1; }
memset(&bindaddr, 0, sizeof(bindaddr)); bindaddr.sin_family = AF_INET; bindaddr.sin_port = htons(lport); rc = inet_pton(AF_INET, baddr, &(bindaddr.sin_addr)); if (rc != 1) { printf("inet_pton() failed with %i: %s\n", rc, strerror(errno)); return -1; }
rc = bind(fd, (struct sockaddr *)&bindaddr, sizeof(bindaddr)); if (rc < 0) { printf("bind() failed: %s\n", strerror(errno)); return -1; }
memset(&destaddr, 0, sizeof(destaddr)); destaddr.sin_family = AF_INET; destaddr.sin_port = htons(dport); rc = inet_pton(AF_INET, dest, &(destaddr.sin_addr)); if (rc != 1) { printf("inet_pton() failed with %i: %s\n", rc, strerror(errno)); return -1; }
rc = connect(fd, (const struct sockaddr *)&destaddr, sizeof(destaddr)); if (rc < 0) { printf("connect() failed: %s\n", strerror(errno)); return -1; }
rc = send(fd, buf, len, 0); if (rc != len) { printf("send() failed\n"); return -1; }
Thanks,
~Neels