xref: /aosp_15_r20/external/mdnsresponder/mDNSPosix/mDNSUNP.h (revision 48a54d368dc4fa860885eef7b70b6c53499e7c25)
1*48a54d36SAndroid Build Coastguard Worker /* -*- Mode: C; tab-width: 4 -*-
2*48a54d36SAndroid Build Coastguard Worker  *
3*48a54d36SAndroid Build Coastguard Worker  * Copyright (c) 2002-2004 Apple Computer, Inc. All rights reserved.
4*48a54d36SAndroid Build Coastguard Worker  *
5*48a54d36SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
6*48a54d36SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
7*48a54d36SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
8*48a54d36SAndroid Build Coastguard Worker  *
9*48a54d36SAndroid Build Coastguard Worker  *     http://www.apache.org/licenses/LICENSE-2.0
10*48a54d36SAndroid Build Coastguard Worker  *
11*48a54d36SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
12*48a54d36SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
13*48a54d36SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*48a54d36SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
15*48a54d36SAndroid Build Coastguard Worker  * limitations under the License.
16*48a54d36SAndroid Build Coastguard Worker  */
17*48a54d36SAndroid Build Coastguard Worker 
18*48a54d36SAndroid Build Coastguard Worker #ifndef __mDNSUNP_h
19*48a54d36SAndroid Build Coastguard Worker #define __mDNSUNP_h
20*48a54d36SAndroid Build Coastguard Worker 
21*48a54d36SAndroid Build Coastguard Worker #include <sys/types.h>
22*48a54d36SAndroid Build Coastguard Worker #include <sys/socket.h>
23*48a54d36SAndroid Build Coastguard Worker #include <net/if.h>
24*48a54d36SAndroid Build Coastguard Worker #include <netinet/in.h>
25*48a54d36SAndroid Build Coastguard Worker 
26*48a54d36SAndroid Build Coastguard Worker #ifdef HAVE_LINUX
27*48a54d36SAndroid Build Coastguard Worker #include <linux/socket.h>
28*48a54d36SAndroid Build Coastguard Worker #define IPV6_2292_PKTINFO  IPV6_2292PKTINFO
29*48a54d36SAndroid Build Coastguard Worker #define IPV6_2292_HOPLIMIT IPV6_2292HOPLIMIT
30*48a54d36SAndroid Build Coastguard Worker #else
31*48a54d36SAndroid Build Coastguard Worker // The following are the supported non-linux posix OSes -
32*48a54d36SAndroid Build Coastguard Worker // netbsd, freebsd and openbsd.
33*48a54d36SAndroid Build Coastguard Worker #if HAVE_IPV6
34*48a54d36SAndroid Build Coastguard Worker #define IPV6_2292_PKTINFO  19
35*48a54d36SAndroid Build Coastguard Worker #define IPV6_2292_HOPLIMIT 20
36*48a54d36SAndroid Build Coastguard Worker #endif
37*48a54d36SAndroid Build Coastguard Worker #endif
38*48a54d36SAndroid Build Coastguard Worker 
39*48a54d36SAndroid Build Coastguard Worker #ifdef  __cplusplus
40*48a54d36SAndroid Build Coastguard Worker     extern "C" {
41*48a54d36SAndroid Build Coastguard Worker #endif
42*48a54d36SAndroid Build Coastguard Worker 
43*48a54d36SAndroid Build Coastguard Worker #ifdef NOT_HAVE_SOCKLEN_T
44*48a54d36SAndroid Build Coastguard Worker     typedef unsigned int socklen_t;
45*48a54d36SAndroid Build Coastguard Worker #endif
46*48a54d36SAndroid Build Coastguard Worker 
47*48a54d36SAndroid Build Coastguard Worker #if !defined(_SS_MAXSIZE) && !defined(__ANDROID__)
48*48a54d36SAndroid Build Coastguard Worker #if HAVE_IPV6
49*48a54d36SAndroid Build Coastguard Worker #define sockaddr_storage sockaddr_in6
50*48a54d36SAndroid Build Coastguard Worker #else
51*48a54d36SAndroid Build Coastguard Worker #define sockaddr_storage sockaddr
52*48a54d36SAndroid Build Coastguard Worker #endif // HAVE_IPV6
53*48a54d36SAndroid Build Coastguard Worker #endif // !defined(_SS_MAXSIZE) && !defined(__ANDROID__)
54*48a54d36SAndroid Build Coastguard Worker 
55*48a54d36SAndroid Build Coastguard Worker #ifndef NOT_HAVE_SA_LEN
56*48a54d36SAndroid Build Coastguard Worker #define GET_SA_LEN(X) (sizeof(struct sockaddr) > ((struct sockaddr*)&(X))->sa_len ? \
57*48a54d36SAndroid Build Coastguard Worker                        sizeof(struct sockaddr) : ((struct sockaddr*)&(X))->sa_len   )
58*48a54d36SAndroid Build Coastguard Worker #elif HAVE_IPV6
59*48a54d36SAndroid Build Coastguard Worker #define GET_SA_LEN(X) (((struct sockaddr*)&(X))->sa_family == AF_INET  ? sizeof(struct sockaddr_in) : \
60*48a54d36SAndroid Build Coastguard Worker                        ((struct sockaddr*)&(X))->sa_family == AF_INET6 ? sizeof(struct sockaddr_in6) : sizeof(struct sockaddr))
61*48a54d36SAndroid Build Coastguard Worker #else
62*48a54d36SAndroid Build Coastguard Worker #define GET_SA_LEN(X) (((struct sockaddr*)&(X))->sa_family == AF_INET ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr))
63*48a54d36SAndroid Build Coastguard Worker #endif
64*48a54d36SAndroid Build Coastguard Worker 
65*48a54d36SAndroid Build Coastguard Worker #define IFI_NAME    16          /* same as IFNAMSIZ in <net/if.h> */
66*48a54d36SAndroid Build Coastguard Worker #define IFI_HADDR    8          /* allow for 64-bit EUI-64 in future */
67*48a54d36SAndroid Build Coastguard Worker 
68*48a54d36SAndroid Build Coastguard Worker // Renamed from my_in_pktinfo because in_pktinfo is used by Linux.
69*48a54d36SAndroid Build Coastguard Worker 
70*48a54d36SAndroid Build Coastguard Worker struct my_in_pktinfo {
71*48a54d36SAndroid Build Coastguard Worker     struct sockaddr_storage ipi_addr;
72*48a54d36SAndroid Build Coastguard Worker     int                     ipi_ifindex;            /* received interface index */
73*48a54d36SAndroid Build Coastguard Worker     char                    ipi_ifname[IFI_NAME];   /* received interface name  */
74*48a54d36SAndroid Build Coastguard Worker };
75*48a54d36SAndroid Build Coastguard Worker 
76*48a54d36SAndroid Build Coastguard Worker /* From the text (Stevens, section 20.2): */
77*48a54d36SAndroid Build Coastguard Worker /* 'As an example of recvmsg we will write a function named recvfrom_flags that */
78*48a54d36SAndroid Build Coastguard Worker /* is similar to recvfrom but also returns: */
79*48a54d36SAndroid Build Coastguard Worker /*	1. the returned msg_flags value, */
80*48a54d36SAndroid Build Coastguard Worker /*	2. the destination addres of the received datagram (from the IP_RECVDSTADDR socket option, and */
81*48a54d36SAndroid Build Coastguard Worker /*	3. the index of the interface on which the datagram was received (the IP_RECVIF socket option).' */
82*48a54d36SAndroid Build Coastguard Worker extern ssize_t recvfrom_flags(int fd, void *ptr, size_t nbytes, int *flagsp,
83*48a54d36SAndroid Build Coastguard Worker                struct sockaddr *sa, socklen_t *salenptr, struct my_in_pktinfo *pktp, u_char *ttl);
84*48a54d36SAndroid Build Coastguard Worker 
85*48a54d36SAndroid Build Coastguard Worker struct ifi_info {
86*48a54d36SAndroid Build Coastguard Worker   char    ifi_name[IFI_NAME];   /* interface name, null terminated */
87*48a54d36SAndroid Build Coastguard Worker   u_char  ifi_haddr[IFI_HADDR]; /* hardware address */
88*48a54d36SAndroid Build Coastguard Worker   u_short ifi_hlen;             /* #bytes in hardware address: 0, 6, 8 */
89*48a54d36SAndroid Build Coastguard Worker   short   ifi_flags;            /* IFF_xxx constants from <net/if.h> */
90*48a54d36SAndroid Build Coastguard Worker   short   ifi_myflags;          /* our own IFI_xxx flags */
91*48a54d36SAndroid Build Coastguard Worker   int     ifi_index;            /* interface index */
92*48a54d36SAndroid Build Coastguard Worker   struct sockaddr  *ifi_addr;   /* primary address */
93*48a54d36SAndroid Build Coastguard Worker   struct sockaddr  *ifi_netmask;
94*48a54d36SAndroid Build Coastguard Worker   struct sockaddr  *ifi_brdaddr;/* broadcast address */
95*48a54d36SAndroid Build Coastguard Worker   struct sockaddr  *ifi_dstaddr;/* destination address */
96*48a54d36SAndroid Build Coastguard Worker   struct ifi_info  *ifi_next;   /* next of these structures */
97*48a54d36SAndroid Build Coastguard Worker };
98*48a54d36SAndroid Build Coastguard Worker 
99*48a54d36SAndroid Build Coastguard Worker #if defined(AF_INET6) && HAVE_IPV6 && HAVE_LINUX
100*48a54d36SAndroid Build Coastguard Worker #define PROC_IFINET6_PATH "/proc/net/if_inet6"
101*48a54d36SAndroid Build Coastguard Worker extern struct ifi_info  *get_ifi_info_linuxv6(int family, int doaliases);
102*48a54d36SAndroid Build Coastguard Worker #endif
103*48a54d36SAndroid Build Coastguard Worker 
104*48a54d36SAndroid Build Coastguard Worker #if defined(AF_INET6) && HAVE_IPV6
105*48a54d36SAndroid Build Coastguard Worker #define INET6_ADDRSTRLEN 46 /*Maximum length of IPv6 address */
106*48a54d36SAndroid Build Coastguard Worker #endif
107*48a54d36SAndroid Build Coastguard Worker 
108*48a54d36SAndroid Build Coastguard Worker 
109*48a54d36SAndroid Build Coastguard Worker 
110*48a54d36SAndroid Build Coastguard Worker #define IFI_ALIAS   1           /* ifi_addr is an alias */
111*48a54d36SAndroid Build Coastguard Worker 
112*48a54d36SAndroid Build Coastguard Worker /* From the text (Stevens, section 16.6): */
113*48a54d36SAndroid Build Coastguard Worker /* 'Since many programs need to know all the interfaces on a system, we will develop a */
114*48a54d36SAndroid Build Coastguard Worker /* function of our own named get_ifi_info that returns a linked list of structures, one */
115*48a54d36SAndroid Build Coastguard Worker /* for each interface that is currently "up."' */
116*48a54d36SAndroid Build Coastguard Worker extern struct ifi_info  *get_ifi_info(int family, int doaliases);
117*48a54d36SAndroid Build Coastguard Worker 
118*48a54d36SAndroid Build Coastguard Worker /* 'The free_ifi_info function, which takes a pointer that was */
119*48a54d36SAndroid Build Coastguard Worker /* returned by get_ifi_info and frees all the dynamic memory.' */
120*48a54d36SAndroid Build Coastguard Worker extern void             free_ifi_info(struct ifi_info *);
121*48a54d36SAndroid Build Coastguard Worker 
122*48a54d36SAndroid Build Coastguard Worker #ifdef NOT_HAVE_DAEMON
123*48a54d36SAndroid Build Coastguard Worker extern int daemon(int nochdir, int noclose);
124*48a54d36SAndroid Build Coastguard Worker #endif
125*48a54d36SAndroid Build Coastguard Worker 
126*48a54d36SAndroid Build Coastguard Worker #ifdef  __cplusplus
127*48a54d36SAndroid Build Coastguard Worker     }
128*48a54d36SAndroid Build Coastguard Worker #endif
129*48a54d36SAndroid Build Coastguard Worker 
130*48a54d36SAndroid Build Coastguard Worker #endif
131