mirror of
https://git.rtems.org/rtems-libbsd/
synced 2025-10-14 09:23:01 +08:00
Update to FreeBSD 9.3
This commit is contained in:
@@ -64,12 +64,15 @@ __FBSDID("$FreeBSD$");
|
||||
#include <sys/socket.h>
|
||||
#include <net/if.h>
|
||||
#include <netinet/in.h>
|
||||
#include <net/if_types.h>
|
||||
#include <ifaddrs.h>
|
||||
#include <sys/queue.h>
|
||||
#ifdef INET6
|
||||
#include <net/if_var.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <netinet6/in6_var.h> /* XXX */
|
||||
#include <netinet6/in6_var.h>
|
||||
#include <netinet6/nd6.h>
|
||||
#endif
|
||||
#include <arpa/inet.h>
|
||||
#include <arpa/nameser.h>
|
||||
@@ -246,6 +249,9 @@ static int get_portmatch(const struct addrinfo *, const char *);
|
||||
static int get_port(struct addrinfo *, const char *, int);
|
||||
static const struct afd *find_afd(int);
|
||||
static int addrconfig(struct addrinfo *);
|
||||
#ifdef INET6
|
||||
static int is_ifdisabled(char *);
|
||||
#endif
|
||||
static void set_source(struct ai_order *, struct policyhead *);
|
||||
static int comp_dst(const void *, const void *);
|
||||
#ifdef INET6
|
||||
@@ -1003,7 +1009,8 @@ comp_dst(const void *arg1, const void *arg2)
|
||||
* We compare the match length in a same AF only.
|
||||
*/
|
||||
if (dst1->aio_ai->ai_addr->sa_family ==
|
||||
dst2->aio_ai->ai_addr->sa_family) {
|
||||
dst2->aio_ai->ai_addr->sa_family &&
|
||||
dst1->aio_ai->ai_addr->sa_family != AF_INET) {
|
||||
if (dst1->aio_matchlen > dst2->aio_matchlen) {
|
||||
return(-1);
|
||||
}
|
||||
@@ -1522,10 +1529,11 @@ find_afd(int af)
|
||||
}
|
||||
|
||||
/*
|
||||
* post-2553: AI_ADDRCONFIG check. if we use getipnodeby* as backend, backend
|
||||
* will take care of it.
|
||||
* the semantics of AI_ADDRCONFIG is not defined well. we are not sure
|
||||
* if the code is right or not.
|
||||
* RFC 3493: AI_ADDRCONFIG check. Determines which address families are
|
||||
* configured on the local system and correlates with pai->ai_family value.
|
||||
* If an address family is not configured on the system, it will not be
|
||||
* queried for. For this purpose, loopback addresses are not considered
|
||||
* configured addresses.
|
||||
*
|
||||
* XXX PF_UNSPEC -> PF_INET6 + PF_INET mapping needs to be in sync with
|
||||
* _dns_getaddrinfo.
|
||||
@@ -1533,37 +1541,80 @@ find_afd(int af)
|
||||
static int
|
||||
addrconfig(struct addrinfo *pai)
|
||||
{
|
||||
int s, af;
|
||||
struct ifaddrs *ifaddrs, *ifa;
|
||||
struct sockaddr_in *sin;
|
||||
#ifdef INET6
|
||||
struct sockaddr_in6 *sin6;
|
||||
#endif
|
||||
int seen_inet = 0, seen_inet6 = 0;
|
||||
|
||||
/*
|
||||
* TODO:
|
||||
* Note that implementation dependent test for address
|
||||
* configuration should be done everytime called
|
||||
* (or apropriate interval),
|
||||
* because addresses will be dynamically assigned or deleted.
|
||||
*/
|
||||
af = pai->ai_family;
|
||||
if (af == AF_UNSPEC) {
|
||||
if ((s = _socket(AF_INET6, SOCK_DGRAM, 0)) < 0)
|
||||
af = AF_INET;
|
||||
else {
|
||||
_close(s);
|
||||
if ((s = _socket(AF_INET, SOCK_DGRAM, 0)) < 0)
|
||||
af = AF_INET6;
|
||||
else
|
||||
_close(s);
|
||||
if (getifaddrs(&ifaddrs) != 0)
|
||||
return (0);
|
||||
|
||||
for (ifa = ifaddrs; ifa != NULL; ifa = ifa->ifa_next) {
|
||||
if (ifa->ifa_addr == NULL || (ifa->ifa_flags & IFF_UP) == 0)
|
||||
continue;
|
||||
switch (ifa->ifa_addr->sa_family) {
|
||||
case AF_INET:
|
||||
if (seen_inet)
|
||||
continue;
|
||||
sin = (struct sockaddr_in *)(ifa->ifa_addr);
|
||||
if (IN_LOOPBACK(htonl(sin->sin_addr.s_addr)))
|
||||
continue;
|
||||
seen_inet = 1;
|
||||
break;
|
||||
#ifdef INET6
|
||||
case AF_INET6:
|
||||
if (seen_inet6)
|
||||
continue;
|
||||
sin6 = (struct sockaddr_in6 *)(ifa->ifa_addr);
|
||||
if (IN6_IS_ADDR_LOOPBACK(&sin6->sin6_addr))
|
||||
continue;
|
||||
if ((ifa->ifa_flags & IFT_LOOP) != 0 &&
|
||||
IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr))
|
||||
continue;
|
||||
if (is_ifdisabled(ifa->ifa_name))
|
||||
continue;
|
||||
seen_inet6 = 1;
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
if (af != AF_UNSPEC) {
|
||||
if ((s = _socket(af, SOCK_DGRAM, 0)) < 0)
|
||||
return 0;
|
||||
_close(s);
|
||||
freeifaddrs(ifaddrs);
|
||||
|
||||
switch(pai->ai_family) {
|
||||
case AF_INET6:
|
||||
return (seen_inet6);
|
||||
case AF_INET:
|
||||
return (seen_inet);
|
||||
case AF_UNSPEC:
|
||||
if (seen_inet == seen_inet6)
|
||||
return (seen_inet);
|
||||
pai->ai_family = seen_inet ? AF_INET : AF_INET6;
|
||||
return (1);
|
||||
}
|
||||
pai->ai_family = af;
|
||||
return 1;
|
||||
return (1);
|
||||
}
|
||||
|
||||
#ifdef INET6
|
||||
static int
|
||||
is_ifdisabled(char *name)
|
||||
{
|
||||
struct in6_ndireq nd;
|
||||
int fd;
|
||||
|
||||
if ((fd = _socket(AF_INET6, SOCK_DGRAM, 0)) < 0)
|
||||
return (-1);
|
||||
memset(&nd, 0, sizeof(nd));
|
||||
strlcpy(nd.ifname, name, sizeof(nd.ifname));
|
||||
if (_ioctl(fd, SIOCGIFINFO_IN6, &nd) < 0) {
|
||||
_close(fd);
|
||||
return (-1);
|
||||
}
|
||||
_close(fd);
|
||||
return ((nd.ndi.flags & ND6_IFF_IFDISABLED) != 0);
|
||||
}
|
||||
|
||||
/* convert a string to a scope identifier. XXX: IPv6 specific */
|
||||
static int
|
||||
ip6_str2scopeid(char *scope, struct sockaddr_in6 *sin6, u_int32_t *scopeid)
|
||||
|
@@ -201,6 +201,7 @@ ipsec_dump_ipsecrequest(buf, len, xisr, bound)
|
||||
break;
|
||||
case IPPROTO_TCP:
|
||||
proto = "tcp";
|
||||
break;
|
||||
default:
|
||||
__ipsec_errcode = EIPSEC_INVAL_PROTO;
|
||||
return NULL;
|
||||
|
Reference in New Issue
Block a user