|
|
|
@ -27,6 +27,7 @@ static bool __ip_bind(socket_t *s, unsigned int, const sockaddr_t *);
|
|
|
|
|
static bool __ip_connect(socket_t *s, const endpoint_t *);
|
|
|
|
|
static bool __ip_listen(socket_t *s, int backlog);
|
|
|
|
|
static bool __ip_accept(socket_t *s, socket_t *new_sock);
|
|
|
|
|
static bool __ip_getsockname(socket_t *s);
|
|
|
|
|
static bool __ip_timestamping(socket_t *s);
|
|
|
|
|
static bool __ip4_pktinfo(socket_t *s);
|
|
|
|
|
static bool __ip6_pktinfo(socket_t *s);
|
|
|
|
@ -87,6 +88,7 @@ static struct socket_family __socket_families[__SF_LAST] = {
|
|
|
|
|
.connect = __ip_connect,
|
|
|
|
|
.listen = __ip_listen,
|
|
|
|
|
.accept = __ip_accept,
|
|
|
|
|
.getsockname = __ip_getsockname,
|
|
|
|
|
.timestamping = __ip_timestamping,
|
|
|
|
|
.pktinfo = __ip4_pktinfo,
|
|
|
|
|
.recvfrom = __ip_recvfrom,
|
|
|
|
@ -122,6 +124,7 @@ static struct socket_family __socket_families[__SF_LAST] = {
|
|
|
|
|
.connect = __ip_connect,
|
|
|
|
|
.listen = __ip_listen,
|
|
|
|
|
.accept = __ip_accept,
|
|
|
|
|
.getsockname = __ip_getsockname,
|
|
|
|
|
.timestamping = __ip_timestamping,
|
|
|
|
|
.pktinfo = __ip6_pktinfo,
|
|
|
|
|
.recvfrom = __ip_recvfrom,
|
|
|
|
@ -313,6 +316,15 @@ static bool __ip_accept(socket_t *s, socket_t *newsock) {
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
static bool __ip_getsockname(socket_t *s) {
|
|
|
|
|
struct sockaddr_storage sin;
|
|
|
|
|
socklen_t sinlen;
|
|
|
|
|
int ret = getsockname(s->fd, (struct sockaddr *) &sin, &sinlen);
|
|
|
|
|
if (ret != 0)
|
|
|
|
|
return false;
|
|
|
|
|
s->family->sockaddr2endpoint(&s->local, &sin);
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
INLINE ssize_t __ip_recvfrom_options(socket_t *s, void *buf, size_t len, endpoint_t *ep, struct timeval *tv,
|
|
|
|
|
sockaddr_t *to, bool (*parse)(struct cmsghdr *, sockaddr_t *))
|
|
|
|
|
{
|
|
|
|
|