Browse Source

enable sctp multihoming support

- listen on multiple sctp addresses, the primary address being the first
 one in the list.
Andrei Pelinescu-Onciul 17 years ago
parent
commit
66b00f85db
1 changed files with 31 additions and 1 deletions
  1. 31 1
      sctp_server.c

+ 31 - 1
sctp_server.c

@@ -57,13 +57,25 @@ int sctp_init_sock(struct socket_info* sock_info)
 	union sockaddr_union* addr;
 	int optval;
 	socklen_t optlen;
+	struct addr_info* ai;
 	
 	addr=&sock_info->su;
 	sock_info->proto=PROTO_SCTP;
 	if (init_su(addr, &sock_info->address, sock_info->port_no)<0){
-		LOG(L_ERR, "ERROR: sctp_init_sock: could not init sockaddr_union\n");
+		LOG(L_ERR, "ERROR: sctp_init_sock: could not init sockaddr_union for"
+					"primary sctp address %.*s:%d\n",
+					sock_info->address_str.len, sock_info->address_str.s,
+					sock_info->port_no );
 		goto error;
 	}
+	for (ai=sock_info->addr_info_lst; ai; ai=ai->next)
+		if (init_su(&ai->su, &ai->address, sock_info->port_no)<0){
+			LOG(L_ERR, "ERROR: sctp_init_sock: could not init"
+					"backup sctp sockaddr_union for %.*s:%d\n",
+					ai->address_str.len, ai->address_str.s,
+					sock_info->port_no );
+			goto error;
+		}
 	sock_info->socket = socket(AF2PF(addr->s.sa_family), SOCK_SEQPACKET, 
 								IPPROTO_SCTP);
 	if (sock_info->socket==-1){
@@ -190,6 +202,24 @@ int sctp_init_sock(struct socket_info* sock_info)
 	#endif
 		goto error;
 	}
+	for (ai=sock_info->addr_info_lst; ai; ai=ai->next)
+		if (sctp_bindx(sock_info->socket, &ai->su.s, 1, SCTP_BINDX_ADD_ADDR)
+					==-1){
+			LOG(L_ERR, "ERROR: sctp_init_sock: sctp_bindx(%x, %.*s:%d, 1, ...)"
+						" on %s:%d : [%d] %s (trying to continue)\n",
+						sock_info->socket,
+						ai->address_str.len, ai->address_str.s, 
+						sock_info->port_no,
+						sock_info->address_str.s, sock_info->port_no,
+						errno, strerror(errno));
+		#ifdef USE_IPV6
+			if (ai->su.s.sa_family==AF_INET6)
+				LOG(L_ERR, "ERROR: sctp_init_sock: might be caused by using a "
+							"link local address, try site local or global\n");
+		#endif
+			/* try to continue, a secondary address bind failure is not 
+			 * critical */
+		}
 	if (listen(sock_info->socket, 1)<0){
 		LOG(L_ERR, "ERROR: sctp_init_sock: listen(%x, 1) on %s: %s\n",
 					sock_info->socket, sock_info->address_str.s,