From 0b1da5a1d0ebaf3adcb27079d305d24e9d77c9b3 Mon Sep 17 00:00:00 2001 From: Benau Date: Sat, 27 Jul 2019 02:12:35 +0800 Subject: [PATCH] Checking for IPV6 only before connecting to game server in iOS --- CMakeLists.txt | 3 +- lib/enet/unix.c | 7 + sources.cmake | 2 +- src/network/ios_ipv6.cpp | 293 +++++++++++++++++++++++++++++++++++++++ src/network/ios_ipv6.hpp | 26 ++++ src/network/route.h | 249 +++++++++++++++++++++++++++++++++ 6 files changed, 578 insertions(+), 2 deletions(-) create mode 100644 src/network/ios_ipv6.cpp create mode 100644 src/network/ios_ipv6.hpp create mode 100644 src/network/route.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 0e9bd5afc..05f103ff6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -48,6 +48,7 @@ if (IOS) ADD_DEFINITIONS(-DIOS_STK) set(CMAKE_XCODE_ATTRIBUTE_TARGETED_DEVICE_FAMILY "1,2") option(USE_GLES2 "Use OpenGL ES2 renderer" ON) + find_library(RESOLV_LIBRARY NAMES resolv libresolv) endif() if((UNIX AND NOT APPLE) AND NOT SERVER_ONLY) @@ -577,7 +578,7 @@ if(NOT SERVER_ONLY) -framework UIKit -framework CoreMotion -framework Foundation - -framework GLKit") + -framework GLKit ${RESOLV_LIBRARY}") else() target_link_libraries(supertuxkart GLESv2) endif() diff --git a/lib/enet/unix.c b/lib/enet/unix.c index 581246942..39abfa276 100644 --- a/lib/enet/unix.c +++ b/lib/enet/unix.c @@ -58,9 +58,16 @@ typedef int socklen_t; static enet_uint32 timeBase = 0; +#ifdef IOS_STK +extern void iOSInitialize(void); +#endif + int enet_initialize (void) { +#ifdef IOS_STK + iOSInitialize(); +#endif return 0; } diff --git a/sources.cmake b/sources.cmake index ba4868d71..d4f28ae4d 100644 --- a/sources.cmake +++ b/sources.cmake @@ -1,5 +1,5 @@ # Modify this file to change the last-modified date when you add/remove a file. -# This will then trigger a new cmake run automatically. +# This will then trigger a new cmake run automatically. file(GLOB_RECURSE STK_HEADERS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "src/*.hpp") file(GLOB_RECURSE STK_SOURCES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "src/*.cpp") file(GLOB_RECURSE STK_SHADERS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "data/shaders/*") diff --git a/src/network/ios_ipv6.cpp b/src/network/ios_ipv6.cpp new file mode 100644 index 000000000..dbaf389e7 --- /dev/null +++ b/src/network/ios_ipv6.cpp @@ -0,0 +1,293 @@ +// SuperTuxKart - a fun racing game with go-kart +// Copyright (C) 2019 SuperTuxKart-Team +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 3 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +// Minimum code to allow iOS device to connect to ipv4 non-firewalled game server + +#ifdef IOS_STK + +#include "network/ios_ipv6.hpp" +#include "config/stk_config.hpp" +#include "config/user_config.hpp" +#include "utils/string_utils.hpp" +#include "utils/log.hpp" + +#include + +#include +#include +#include +#include +#include +#include + +#if TARGET_IPHONE_SIMULATOR +#include +#else +#include "route.h" +#endif + +#include +#include +#define RESOLV_CONFIG_PATH ("/etc/resolv.conf") + +#define NAME_SVR ("nameserver") +#define NAME_SVR_LEN (10) + + +bool g_ipv6_only; +ENetAddress g_connected_address; + +namespace Mars +{ +// Based on Mars from tencent, licensed under MIT +#define SUCCESS (0) +#define FAILED (-1) +#define ROUNDUP(a) \ +((a) > 0 ? (1 + (((a) - 1) | (sizeof(long) - 1))) : sizeof(long)) + + enum TLocalIPStack + { + ELocalIPStack_None = 0, + ELocalIPStack_IPv4 = 1, + ELocalIPStack_IPv6 = 2, + ELocalIPStack_Dual = 3, + }; + + typedef union sockaddr_union + { + struct sockaddr generic; + struct sockaddr_in in; + struct sockaddr_in6 in6; + } sockaddr_union; + + int getdefaultgateway(struct in_addr * addr) + { + /* net.route.0.inet.flags.gateway */ + int mib[] = {CTL_NET, PF_ROUTE, 0, AF_INET, + NET_RT_FLAGS, RTF_GATEWAY}; + size_t l; + char * buf, * p; + struct rt_msghdr * rt; + struct sockaddr * sa; + struct sockaddr * sa_tab[RTAX_MAX]; + int i; + int r = FAILED; + if (sysctl(mib, sizeof(mib)/sizeof(int), 0, &l, 0, 0) < 0) + { + return FAILED; + } + if (l>0) + { + buf = (char*)malloc(l); + if (sysctl(mib, sizeof(mib)/sizeof(int), buf, &l, 0, 0) < 0) + { + free(buf); + return FAILED; + } + for(p=buf; prtm_msglen) + { + rt = (struct rt_msghdr *)p; + sa = (struct sockaddr *)(rt + 1); + for(i=0; irtm_addrs & (1 << i)) + { + sa_tab[i] = sa; + sa = (struct sockaddr *)((char *)sa + ROUNDUP(sa->sa_len)); + } else + { + sa_tab[i] = NULL; + } + } + if ( ((rt->rtm_addrs & (RTA_DST|RTA_GATEWAY)) == (RTA_DST|RTA_GATEWAY)) + && sa_tab[RTAX_DST]->sa_family == AF_INET) + { + // && sa_tab[RTAX_GATEWAY]->sa_family == AF_INET) { + if (((struct sockaddr_in *)sa_tab[RTAX_DST])->sin_addr.s_addr == 0) + { + *addr = ((struct sockaddr_in *)(sa_tab[RTAX_GATEWAY]))->sin_addr; + r = SUCCESS; + break; + } + } + } + free(buf); + } + return r; + } + + int getdefaultgateway6(struct in6_addr * addr) + { + /* net.route.0.inet6.flags.gateway */ + int mib[] = {CTL_NET, PF_ROUTE, 0, AF_INET6, + NET_RT_FLAGS, RTF_GATEWAY}; + size_t l; + char * buf, * p; + struct rt_msghdr * rt; + struct sockaddr * sa; + struct sockaddr * sa_tab[RTAX_MAX]; + int i; + int r = FAILED; + if (sysctl(mib, sizeof(mib)/sizeof(int), 0, &l, 0, 0) < 0) + { + return FAILED; + } + if (l>0) + { + buf = (char*)malloc(l); + if (sysctl(mib, sizeof(mib)/sizeof(int), buf, &l, 0, 0) < 0) + { + free(buf); + return FAILED; + } + for(p=buf; prtm_msglen) + { + rt = (struct rt_msghdr *)p; + sa = (struct sockaddr *)(rt + 1); + for(i=0; irtm_addrs & (1 << i)) + { + sa_tab[i] = sa; + sa = (struct sockaddr *)((char *)sa + ROUNDUP(sa->sa_len)); + } else + { + sa_tab[i] = NULL; + } + } + if ( ((rt->rtm_addrs & (RTA_DST|RTA_GATEWAY)) == (RTA_DST|RTA_GATEWAY)) + && sa_tab[RTAX_DST]->sa_family == AF_INET6) + { + // && sa_tab[RTAX_GATEWAY]->sa_family == AF_INET6) { + if (IN6_IS_ADDR_UNSPECIFIED(&((struct sockaddr_in6 *)sa_tab[RTAX_DST])->sin6_addr)) + { + *addr = ((struct sockaddr_in6 *)(sa_tab[RTAX_GATEWAY]))->sin6_addr; + r = SUCCESS; + break; + } + } + } + free(buf); + } + return r; + } + + static int _test_connect(int pf, struct sockaddr *addr, size_t addrlen) + { + int s = socket(pf, SOCK_DGRAM, IPPROTO_UDP); + if (s < 0) + return 0; + int ret; + do + { + ret = connect(s, addr, addrlen); + } + while (ret < 0 && errno == EINTR); + int success = (ret == 0); + do + { + ret = close(s); + } + while (ret < 0 && errno == EINTR); + return success; + } + + static int _have_ipv6() + { + static const struct sockaddr_in6 sin6_test = + { + .sin6_len = sizeof(sockaddr_in6), + .sin6_family = AF_INET6, + .sin6_port = htons(0xFFFF), + .sin6_addr.s6_addr = { + 0x20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} + }; + sockaddr_union addr = { .in6 = sin6_test }; + return _test_connect(PF_INET6, &addr.generic, sizeof(addr.in6)); + } + + static int _have_ipv4() + { + static const struct sockaddr_in sin_test = + { + .sin_len = sizeof(sockaddr_in), + .sin_family = AF_INET, + .sin_port = htons(0xFFFF), + .sin_addr.s_addr = htonl(0x08080808L), // 8.8.8.8 + }; + sockaddr_union addr = { .in = sin_test }; + return _test_connect(PF_INET, &addr.generic, sizeof(addr.in)); + } + + TLocalIPStack local_ipstack_detect() + { + in6_addr addr6_gateway = {0}; + if (0 != getdefaultgateway6(&addr6_gateway)){ return ELocalIPStack_IPv4;} + if (IN6_IS_ADDR_UNSPECIFIED(&addr6_gateway)) { return ELocalIPStack_IPv4;} + + in_addr addr_gateway = {0}; + if (0 != getdefaultgateway(&addr_gateway)) { return ELocalIPStack_IPv6;} + if (INADDR_NONE == addr_gateway.s_addr || INADDR_ANY == addr_gateway.s_addr ) { return ELocalIPStack_IPv6;} + + int have_ipv4 = _have_ipv4(); + int have_ipv6 = _have_ipv6(); + int local_stack = 0; + if (have_ipv4) { local_stack |= ELocalIPStack_IPv4; } + if (have_ipv6) { local_stack |= ELocalIPStack_IPv6; } + if (ELocalIPStack_Dual != local_stack) { return (TLocalIPStack)local_stack; } + + int dns_ip_stack = 0; + struct __res_state stat = {0}; + res_ninit(&stat); + union res_sockaddr_union addrs[MAXNS] = {0}; + int count = res_getservers(const_cast(&stat), addrs, MAXNS); + for (int i = 0; i < count; ++i) + { + if (AF_INET == addrs[i].sin.sin_family) + { + dns_ip_stack |= ELocalIPStack_IPv4; + } + else if (AF_INET6 == addrs[i].sin.sin_family) + { + dns_ip_stack |= ELocalIPStack_IPv6; + } + } + res_ndestroy(&stat); + + return (TLocalIPStack)(ELocalIPStack_None == dns_ip_stack ? + local_stack : dns_ip_stack); + } +} + +bool isIPV6Only() +{ + return g_ipv6_only; +} + +void iOSInitialize() +{ + // Clear previous setting, in case user changed wifi or mobile data + g_ipv6_only = false; + g_connected_address.host = 0; + g_connected_address.port = 0; + + using namespace Mars; + int ipstack = local_ipstack_detect(); + g_ipv6_only = ipstack == ELocalIPStack_IPv6; + +} // iOSInitialize +#endif diff --git a/src/network/ios_ipv6.hpp b/src/network/ios_ipv6.hpp new file mode 100644 index 000000000..517ed4581 --- /dev/null +++ b/src/network/ios_ipv6.hpp @@ -0,0 +1,26 @@ +// SuperTuxKart - a fun racing game with go-kart +// Copyright (C) 2019 SuperTuxKart-Team +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 3 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +#ifdef __cplusplus +extern "C" { +#endif +bool isIPV6Only(); +void iOSInitialize(); +#ifdef __cplusplus +} +#endif + diff --git a/src/network/route.h b/src/network/route.h new file mode 100644 index 000000000..602c6d5bb --- /dev/null +++ b/src/network/route.h @@ -0,0 +1,249 @@ +/* + * Copyright (c) 2000-2013 Apple Inc. All rights reserved. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ + * + * This file contains Original Code and/or Modifications of Original Code + * as defined in and that are subject to the Apple Public Source License + * Version 2.0 (the 'License'). You may not use this file except in + * compliance with the License. The rights granted to you under the License + * may not be used to create, or enable the creation or redistribution of, + * unlawful or unlicensed copies of an Apple operating system, or to + * circumvent, violate, or enable the circumvention or violation of, any + * terms of an Apple operating system software license agreement. + * + * Please obtain a copy of the License at + * http://www.opensource.apple.com/apsl/ and read it before using this file. + * + * The Original Code and all software distributed under the License are + * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. + * Please see the License for the specific language governing rights and + * limitations under the License. + * + * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ + */ +/* + * Copyright (c) 1980, 1986, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)route.h 8.3 (Berkeley) 4/19/94 + * $FreeBSD: src/sys/net/route.h,v 1.36.2.1 2000/08/16 06:14:23 jayanth Exp $ + */ + +#ifndef _NET_ROUTE_H_ +#define _NET_ROUTE_H_ +#include +#include +#include +#include + +/* + * These numbers are used by reliable protocols for determining + * retransmission behavior and are included in the routing structure. + */ +struct rt_metrics { + u_int32_t rmx_locks; /* Kernel leaves these values alone */ + u_int32_t rmx_mtu; /* MTU for this path */ + u_int32_t rmx_hopcount; /* max hops expected */ + int32_t rmx_expire; /* lifetime for route, e.g. redirect */ + u_int32_t rmx_recvpipe; /* inbound delay-bandwidth product */ + u_int32_t rmx_sendpipe; /* outbound delay-bandwidth product */ + u_int32_t rmx_ssthresh; /* outbound gateway buffer limit */ + u_int32_t rmx_rtt; /* estimated round trip time */ + u_int32_t rmx_rttvar; /* estimated rtt variance */ + u_int32_t rmx_pksent; /* packets sent using this route */ + u_int32_t rmx_filler[4]; /* will be used for T/TCP later */ +}; + +/* + * rmx_rtt and rmx_rttvar are stored as microseconds; + */ +#define RTM_RTTUNIT 1000000 /* units for rtt, rttvar, as units per sec */ + + + +#define RTF_UP 0x1 /* route usable */ +#define RTF_GATEWAY 0x2 /* destination is a gateway */ +#define RTF_HOST 0x4 /* host entry (net otherwise) */ +#define RTF_REJECT 0x8 /* host or net unreachable */ +#define RTF_DYNAMIC 0x10 /* created dynamically (by redirect) */ +#define RTF_MODIFIED 0x20 /* modified dynamically (by redirect) */ +#define RTF_DONE 0x40 /* message confirmed */ +#define RTF_DELCLONE 0x80 /* delete cloned route */ +#define RTF_CLONING 0x100 /* generate new routes on use */ +#define RTF_XRESOLVE 0x200 /* external daemon resolves name */ +#define RTF_LLINFO 0x400 /* generated by link layer (e.g. ARP) */ +#define RTF_STATIC 0x800 /* manually added */ +#define RTF_BLACKHOLE 0x1000 /* just discard pkts (during updates) */ +#define RTF_NOIFREF 0x2000 /* not eligible for RTF_IFREF */ +#define RTF_PROTO2 0x4000 /* protocol specific routing flag */ +#define RTF_PROTO1 0x8000 /* protocol specific routing flag */ + +#define RTF_PRCLONING 0x10000 /* protocol requires cloning */ +#define RTF_WASCLONED 0x20000 /* route generated through cloning */ +#define RTF_PROTO3 0x40000 /* protocol specific routing flag */ +/* 0x80000 unused */ +#define RTF_PINNED 0x100000 /* future use */ +#define RTF_LOCAL 0x200000 /* route represents a local address */ +#define RTF_BROADCAST 0x400000 /* route represents a bcast address */ +#define RTF_MULTICAST 0x800000 /* route represents a mcast address */ +#define RTF_IFSCOPE 0x1000000 /* has valid interface scope */ +#define RTF_CONDEMNED 0x2000000 /* defunct; no longer modifiable */ +#define RTF_IFREF 0x4000000 /* route holds a ref to interface */ +#define RTF_PROXY 0x8000000 /* proxying, no interface scope */ +#define RTF_ROUTER 0x10000000 /* host is a router */ +/* 0x20000000 and up unassigned */ + +#define RTF_BITS \ + "\020\1UP\2GATEWAY\3HOST\4REJECT\5DYNAMIC\6MODIFIED\7DONE" \ + "\10DELCLONE\11CLONING\12XRESOLVE\13LLINFO\14STATIC\15BLACKHOLE" \ + "\16NOIFREF\17PROTO2\20PROTO1\21PRCLONING\22WASCLONED\23PROTO3" \ + "\25PINNED\26LOCAL\27BROADCAST\30MULTICAST\31IFSCOPE\32CONDEMNED" \ + "\33IFREF\34PROXY\35ROUTER" + +/* + * Routing statistics. + */ +struct rtstat { + short rts_badredirect; /* bogus redirect calls */ + short rts_dynamic; /* routes created by redirects */ + short rts_newgateway; /* routes modified by redirects */ + short rts_unreach; /* lookups which failed */ + short rts_wildcard; /* lookups satisfied by a wildcard */ +}; + +/* + * Structures for routing messages. + */ +struct rt_msghdr { + u_short rtm_msglen; /* to skip over non-understood messages */ + u_char rtm_version; /* future binary compatibility */ + u_char rtm_type; /* message type */ + u_short rtm_index; /* index for associated ifp */ + int rtm_flags; /* flags, incl. kern & message, e.g. DONE */ + int rtm_addrs; /* bitmask identifying sockaddrs in msg */ + pid_t rtm_pid; /* identify sender */ + int rtm_seq; /* for sender to identify action */ + int rtm_errno; /* why failed */ + int rtm_use; /* from rtentry */ + u_int32_t rtm_inits; /* which metrics we are initializing */ + struct rt_metrics rtm_rmx; /* metrics themselves */ +}; + +struct rt_msghdr2 { + u_short rtm_msglen; /* to skip over non-understood messages */ + u_char rtm_version; /* future binary compatibility */ + u_char rtm_type; /* message type */ + u_short rtm_index; /* index for associated ifp */ + int rtm_flags; /* flags, incl. kern & message, e.g. DONE */ + int rtm_addrs; /* bitmask identifying sockaddrs in msg */ + int32_t rtm_refcnt; /* reference count */ + int rtm_parentflags; /* flags of the parent route */ + int rtm_reserved; /* reserved field set to 0 */ + int rtm_use; /* from rtentry */ + u_int32_t rtm_inits; /* which metrics we are initializing */ + struct rt_metrics rtm_rmx; /* metrics themselves */ +}; + + +#define RTM_VERSION 5 /* Up the ante and ignore older versions */ + +/* + * Message types. + */ +#define RTM_ADD 0x1 /* Add Route */ +#define RTM_DELETE 0x2 /* Delete Route */ +#define RTM_CHANGE 0x3 /* Change Metrics or flags */ +#define RTM_GET 0x4 /* Report Metrics */ +#define RTM_LOSING 0x5 /* Kernel Suspects Partitioning */ +#define RTM_REDIRECT 0x6 /* Told to use different route */ +#define RTM_MISS 0x7 /* Lookup failed on this address */ +#define RTM_LOCK 0x8 /* fix specified metrics */ +#define RTM_OLDADD 0x9 /* caused by SIOCADDRT */ +#define RTM_OLDDEL 0xa /* caused by SIOCDELRT */ +#define RTM_RESOLVE 0xb /* req to resolve dst to LL addr */ +#define RTM_NEWADDR 0xc /* address being added to iface */ +#define RTM_DELADDR 0xd /* address being removed from iface */ +#define RTM_IFINFO 0xe /* iface going up/down etc. */ +#define RTM_NEWMADDR 0xf /* mcast group membership being added to if */ +#define RTM_DELMADDR 0x10 /* mcast group membership being deleted */ +#define RTM_IFINFO2 0x12 /* */ +#define RTM_NEWMADDR2 0x13 /* */ +#define RTM_GET2 0x14 /* */ + +/* + * Bitmask values for rtm_inits and rmx_locks. + */ +#define RTV_MTU 0x1 /* init or lock _mtu */ +#define RTV_HOPCOUNT 0x2 /* init or lock _hopcount */ +#define RTV_EXPIRE 0x4 /* init or lock _expire */ +#define RTV_RPIPE 0x8 /* init or lock _recvpipe */ +#define RTV_SPIPE 0x10 /* init or lock _sendpipe */ +#define RTV_SSTHRESH 0x20 /* init or lock _ssthresh */ +#define RTV_RTT 0x40 /* init or lock _rtt */ +#define RTV_RTTVAR 0x80 /* init or lock _rttvar */ + +/* + * Bitmask values for rtm_addrs. + */ +#define RTA_DST 0x1 /* destination sockaddr present */ +#define RTA_GATEWAY 0x2 /* gateway sockaddr present */ +#define RTA_NETMASK 0x4 /* netmask sockaddr present */ +#define RTA_GENMASK 0x8 /* cloning mask sockaddr present */ +#define RTA_IFP 0x10 /* interface name sockaddr present */ +#define RTA_IFA 0x20 /* interface addr sockaddr present */ +#define RTA_AUTHOR 0x40 /* sockaddr for author of redirect */ +#define RTA_BRD 0x80 /* for NEWADDR, broadcast or p-p dest addr */ + +/* + * Index offsets for sockaddr array for alternate internal encoding. + */ +#define RTAX_DST 0 /* destination sockaddr present */ +#define RTAX_GATEWAY 1 /* gateway sockaddr present */ +#define RTAX_NETMASK 2 /* netmask sockaddr present */ +#define RTAX_GENMASK 3 /* cloning mask sockaddr present */ +#define RTAX_IFP 4 /* interface name sockaddr present */ +#define RTAX_IFA 5 /* interface addr sockaddr present */ +#define RTAX_AUTHOR 6 /* sockaddr for author of redirect */ +#define RTAX_BRD 7 /* for NEWADDR, broadcast or p-p dest addr */ +#define RTAX_MAX 8 /* size of array to allocate */ + +struct rt_addrinfo { + int rti_addrs; + struct sockaddr* rti_info[RTAX_MAX]; +}; + + +#endif /* _NET_ROUTE_H_ */ +