Changeset View
Changeset View
Standalone View
Standalone View
sys/compat/linux/linux.c
Show First 20 Lines • Show All 495 Lines • ▼ Show 20 Lines | linux_ifhwaddr(struct ifnet *ifp, struct l_sockaddr *lsa) | ||||
} | } | ||||
if (!IFP_IS_ETH(ifp)) | if (!IFP_IS_ETH(ifp)) | ||||
return (ENOENT); | return (ENOENT); | ||||
if (if_foreach_addr_type(ifp, AF_LINK, linux_ifhwaddr_cb, lsa) > 0) | if (if_foreach_addr_type(ifp, AF_LINK, linux_ifhwaddr_cb, lsa) > 0) | ||||
return (0); | return (0); | ||||
return (ENOENT); | return (ENOENT); | ||||
} | } | ||||
int | sa_family_t | ||||
linux_to_bsd_domain(int domain) | linux_to_bsd_domain(sa_family_t domain) | ||||
{ | { | ||||
switch (domain) { | switch (domain) { | ||||
case LINUX_AF_UNSPEC: | case LINUX_AF_UNSPEC: | ||||
return (AF_UNSPEC); | return (AF_UNSPEC); | ||||
case LINUX_AF_UNIX: | case LINUX_AF_UNIX: | ||||
return (AF_LOCAL); | return (AF_LOCAL); | ||||
case LINUX_AF_INET: | case LINUX_AF_INET: | ||||
return (AF_INET); | return (AF_INET); | ||||
case LINUX_AF_INET6: | case LINUX_AF_INET6: | ||||
return (AF_INET6); | return (AF_INET6); | ||||
case LINUX_AF_AX25: | case LINUX_AF_AX25: | ||||
return (AF_CCITT); | return (AF_CCITT); | ||||
case LINUX_AF_IPX: | case LINUX_AF_IPX: | ||||
return (AF_IPX); | return (AF_IPX); | ||||
case LINUX_AF_APPLETALK: | case LINUX_AF_APPLETALK: | ||||
return (AF_APPLETALK); | return (AF_APPLETALK); | ||||
case LINUX_AF_NETLINK: | case LINUX_AF_NETLINK: | ||||
return (AF_NETLINK); | return (AF_NETLINK); | ||||
} | } | ||||
return (-1); | return (AF_UNKNOWN); | ||||
} | } | ||||
int | sa_family_t | ||||
bsd_to_linux_domain(int domain) | bsd_to_linux_domain(sa_family_t domain) | ||||
{ | { | ||||
switch (domain) { | switch (domain) { | ||||
case AF_UNSPEC: | case AF_UNSPEC: | ||||
return (LINUX_AF_UNSPEC); | return (LINUX_AF_UNSPEC); | ||||
case AF_LOCAL: | case AF_LOCAL: | ||||
return (LINUX_AF_UNIX); | return (LINUX_AF_UNIX); | ||||
case AF_INET: | case AF_INET: | ||||
return (LINUX_AF_INET); | return (LINUX_AF_INET); | ||||
case AF_INET6: | case AF_INET6: | ||||
return (LINUX_AF_INET6); | return (LINUX_AF_INET6); | ||||
case AF_CCITT: | case AF_CCITT: | ||||
return (LINUX_AF_AX25); | return (LINUX_AF_AX25); | ||||
case AF_IPX: | case AF_IPX: | ||||
return (LINUX_AF_IPX); | return (LINUX_AF_IPX); | ||||
case AF_APPLETALK: | case AF_APPLETALK: | ||||
return (LINUX_AF_APPLETALK); | return (LINUX_AF_APPLETALK); | ||||
case AF_NETLINK: | case AF_NETLINK: | ||||
return (LINUX_AF_NETLINK); | return (LINUX_AF_NETLINK); | ||||
} | } | ||||
return (-1); | return (AF_UNKNOWN); | ||||
} | } | ||||
/* | /* | ||||
* Based on the fact that: | * Based on the fact that: | ||||
* 1. Native and Linux storage of struct sockaddr | * 1. Native and Linux storage of struct sockaddr | ||||
* and struct sockaddr_in6 are equal. | * and struct sockaddr_in6 are equal. | ||||
* 2. On Linux sa_family is the first member of all struct sockaddr. | * 2. On Linux sa_family is the first member of all struct sockaddr. | ||||
*/ | */ | ||||
int | int | ||||
bsd_to_linux_sockaddr(const struct sockaddr *sa, struct l_sockaddr **lsa, | bsd_to_linux_sockaddr(const struct sockaddr *sa, struct l_sockaddr **lsa, | ||||
socklen_t len) | socklen_t len) | ||||
{ | { | ||||
struct l_sockaddr *kosa; | struct l_sockaddr *kosa; | ||||
int bdom; | sa_family_t bdom; | ||||
*lsa = NULL; | *lsa = NULL; | ||||
if (len < 2 || len > UCHAR_MAX) | if (len < 2 || len > UCHAR_MAX) | ||||
return (EINVAL); | return (EINVAL); | ||||
bdom = bsd_to_linux_domain(sa->sa_family); | bdom = bsd_to_linux_domain(sa->sa_family); | ||||
if (bdom == -1) | if (bdom == AF_UNKNOWN) | ||||
return (EAFNOSUPPORT); | return (EAFNOSUPPORT); | ||||
kosa = malloc(len, M_LINUX, M_WAITOK); | kosa = malloc(len, M_LINUX, M_WAITOK); | ||||
bcopy(sa, kosa, len); | bcopy(sa, kosa, len); | ||||
kosa->sa_family = bdom; | kosa->sa_family = bdom; | ||||
*lsa = kosa; | *lsa = kosa; | ||||
return (0); | return (0); | ||||
} | } | ||||
Show All 30 Lines | |||||
#endif | #endif | ||||
kosa = malloc(salen, M_SONAME, M_WAITOK); | kosa = malloc(salen, M_SONAME, M_WAITOK); | ||||
if ((error = copyin(osa, kosa, *len))) | if ((error = copyin(osa, kosa, *len))) | ||||
goto out; | goto out; | ||||
bdom = linux_to_bsd_domain(kosa->sa_family); | bdom = linux_to_bsd_domain(kosa->sa_family); | ||||
if (bdom == -1) { | if (bdom == AF_UNKNOWN) { | ||||
error = EAFNOSUPPORT; | error = EAFNOSUPPORT; | ||||
goto out; | goto out; | ||||
} | } | ||||
#ifdef INET6 | #ifdef INET6 | ||||
/* | /* | ||||
* Older Linux IPv6 code uses obsolete RFC2133 struct sockaddr_in6, | * Older Linux IPv6 code uses obsolete RFC2133 struct sockaddr_in6, | ||||
* which lacks the scope id compared with RFC2553 one. If we detect | * which lacks the scope id compared with RFC2553 one. If we detect | ||||
▲ Show 20 Lines • Show All 261 Lines • Show Last 20 Lines |