From: Sridhar S. <sr...@us...> - 2003-08-22 18:04:49
|
On Fri, 22 Aug 2003, Gao, Kevin wrote: > > > > On Thu, 21 Aug 2003, Gao, Kevin wrote: > > > > > Dear Sridhar, > > > > > > I have found 3 issues confused me. > > > > > > 1. In spec draft-ietf-tsvwg-sctpsocket-07.txt, > > > > > > Page 57: > > > > > > 8.1 sctp_bindx() > > > The syntax of sctp_bindx() is, > > > > > > int sctp_bindx(int sd, struct sockaddr *addrs, int addrcnt, > > > int flags); > > > > > > If sd is an IPv4 socket, the addresses passed must be > > IPv4 addresses. > > > If the sd is an IPv6 socket, the addresses passed can > > either be IPv4 > > > or IPv6 addresses. > > > > > > But in code ./sctp/net/sctp/socket.c, The function is defined as: > > > int sctp_bindx(struct sock *sk, struct sockaddr_storage *addrs, int > > > addrcnt, > > > int flags) > > > > > > Is it any inconsistancy between them? > > > > Yes. The arg struct sockaddr_storage is changed to struct > > sockaddr in a > > few APIs in the latest 07 version of the sctp socket API > > draft. Apart from > > sctp_bindx(), the following APIs are also changed. > > sctp_getpaddrs() > > sctp_getladdrs() > > sctp_freepaddrs() > > sctp_getladdrs() > > > > I guess the main reason for this change is to limit the size > > of data that is > > passed between user and kernel space. The size of struct > > sockaddr_storage in > > linux is 128 bytes and it is much more than the size of > > struct sockaddr_in(16 > > bytes) or struct sockaddr_in6(28 bytes) necessary to hold a > > v4 or a v6 address > > respectively. With this change, on an ipv4 socket, > > sctp_bindx() takes an > > array of struct sockaddr_in structures. On an ipv6 socket, we > > can pass either > > a v4 or v6 addresses, so it has to be a packed array of > > struct sockaddr_in and > > struct sockaddr_in6 structures. The address list can be > > traversed by looking at > > the address family and using the appropriate size. > > > > lksctp is not yet updated to draft 07 API changes. We need to > > fix this. > > In spec we know that we can bind more than one address in the > same chunk. So I think use sockaddr_storage is to bind more than > one address once. Otherwise, neither sockaddr_in6 nor sockaddr_in > needs 128 bytes for storage. So based on the syntax of bindx. > I think use sockaddr_storage as parameter is more reasonable Even with sockaddr *, we can bind more than one address. looks like you are confusing between the real sctp_bindx() API in the library: tools/src/lib/bindx.c:sctp_bindx() and the kernel routine in net/sctp/socket.c. The kernel routine is not used as reflected by the comments and it can be removed, but it was left so that it may be used in future if we want to implement bindx as a system call. I don't think this will happen as it requires changes to the core networking data structures and routines. For ex: bindx() has to be added to struct proto. As SCTP is the only current user of bindx(), it is tough to convince the nw maintainers to make this change. So we decided on a library interface using setsockopt(). I hope this will help in clarifying your other issues too. Thanks Sridhar |