"Fossies" - the Fresh Open Source Software Archive 
Member "dhcpcd-9.4.1/src/ipv4.h" (22 Oct 2021, 5234 Bytes) of package /linux/misc/dhcpcd-9.4.1.tar.xz:
As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style:
standard) with prefixed line numbers and
code folding option.
Alternatively you can here
view or
download the uninterpreted source code file.
For more information about "ipv4.h" see the
Fossies "Dox" file reference documentation and the latest
Fossies "Diffs" side-by-side code changes report:
9.4.0_vs_9.4.1.
1 /* SPDX-License-Identifier: BSD-2-Clause */
2 /*
3 * dhcpcd - DHCP client daemon
4 * Copyright (c) 2006-2021 Roy Marples <roy@marples.name>
5 * All rights reserved
6
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 */
28
29 #ifndef IPV4_H
30 #define IPV4_H
31
32 #include "dhcpcd.h"
33
34 /* Prefer our macro */
35 #ifdef HTONL
36 #undef HTONL
37 #endif
38
39 #ifndef BYTE_ORDER
40 #define BIG_ENDIAN 1234
41 #define LITTLE_ENDIAN 4321
42 #if defined(_BIG_ENDIAN)
43 #define BYTE_ORDER BIG_ENDIAN
44 #elif defined(_LITTLE_ENDIAN)
45 #define BYTE_ORDER LITTLE_ENDIAN
46 #else
47 #error Endian unknown
48 #endif
49 #endif
50
51 #if BYTE_ORDER == BIG_ENDIAN
52 #define HTONL(A) (A)
53 #elif BYTE_ORDER == LITTLE_ENDIAN
54 #define HTONL(A) \
55 ((((uint32_t)(A) & 0xff000000) >> 24) | \
56 (((uint32_t)(A) & 0x00ff0000) >> 8) | \
57 (((uint32_t)(A) & 0x0000ff00) << 8) | \
58 (((uint32_t)(A) & 0x000000ff) << 24))
59 #endif /* BYTE_ORDER */
60
61 #ifdef __sun
62 /* Solaris lacks these defines.
63 * While it supports DaD, to seems to only expose IFF_DUPLICATE
64 * so we have no way of knowing if it's tentative or not.
65 * I don't even know if Solaris has any special treatment for tentative. */
66 # define IN_IFF_TENTATIVE 0x01
67 # define IN_IFF_DUPLICATED 0x02
68 # define IN_IFF_DETACHED 0x00
69 #endif
70
71 #ifdef IN_IFF_TENTATIVE
72 #define IN_IFF_NOTUSEABLE \
73 (IN_IFF_TENTATIVE | IN_IFF_DUPLICATED | IN_IFF_DETACHED)
74 #endif
75
76 #define IN_ARE_ADDR_EQUAL(a, b) ((a)->s_addr == (b)->s_addr)
77 #define IN_IS_ADDR_UNSPECIFIED(a) ((a)->s_addr == INADDR_ANY)
78
79 #ifdef __linux__
80 #define IP_LIFETIME
81 #endif
82
83 struct ipv4_addr {
84 TAILQ_ENTRY(ipv4_addr) next;
85 struct in_addr addr;
86 struct in_addr mask;
87 struct in_addr brd;
88 struct interface *iface;
89 int addr_flags;
90 unsigned int flags;
91 #ifdef IP_LIFETIME
92 uint32_t vltime;
93 uint32_t pltime;
94 #endif
95 char saddr[INET_ADDRSTRLEN + 3];
96 #ifdef ALIAS_ADDR
97 char alias[IF_NAMESIZE];
98 #endif
99 };
100 TAILQ_HEAD(ipv4_addrhead, ipv4_addr);
101
102 #define IPV4_AF_STALE (1U << 0)
103 #define IPV4_AF_NEW (1U << 1)
104
105 #define IPV4_ADDR_EQ(a1, a2) ((a1) && (a1)->addr.s_addr == (a2)->addr.s_addr)
106 #define IPV4_MASK1_EQ(a1, a2) ((a1) && (a1)->mask.s_addr == (a2)->mask.s_addr)
107 #define IPV4_MASK_EQ(a1, a2) (IPV4_ADDR_EQ(a1, a2) && IPV4_MASK1_EQ(a1, a2))
108 #define IPV4_BRD1_EQ(a1, a2) ((a1) && (a1)->brd.s_addr == (a2)->brd.s_addr)
109 #define IPV4_BRD_EQ(a1, a2) (IPV4_MASK_EQ(a1, a2) && IPV4_BRD1_EQ(a1, a2))
110
111 struct ipv4_state {
112 struct ipv4_addrhead addrs;
113 };
114
115 #define IPV4_STATE(ifp) \
116 ((struct ipv4_state *)(ifp)->if_data[IF_DATA_IPV4])
117 #define IPV4_CSTATE(ifp) \
118 ((const struct ipv4_state *)(ifp)->if_data[IF_DATA_IPV4])
119
120 #ifdef INET
121 struct ipv4_state *ipv4_getstate(struct interface *);
122 int ipv4_ifcmp(const struct interface *, const struct interface *);
123 uint8_t inet_ntocidr(struct in_addr);
124 int inet_cidrtoaddr(int, struct in_addr *);
125 uint32_t ipv4_getnetmask(uint32_t);
126 int ipv4_hasaddr(const struct interface *);
127
128 bool inet_getroutes(struct dhcpcd_ctx *, rb_tree_t *);
129
130 #define STATE_ADDED 0x01
131 #define STATE_FAKE 0x02
132 #define STATE_EXPIRED 0x04
133
134 int ipv4_deladdr(struct ipv4_addr *, int);
135 struct ipv4_addr *ipv4_addaddr(struct interface *,
136 const struct in_addr *, const struct in_addr *, const struct in_addr *,
137 uint32_t, uint32_t);
138 struct ipv4_addr *ipv4_applyaddr(void *);
139
140 struct ipv4_addr *ipv4_iffindaddr(struct interface *,
141 const struct in_addr *, const struct in_addr *);
142 struct ipv4_addr *ipv4_iffindlladdr(struct interface *);
143 struct ipv4_addr *ipv4_findaddr(struct dhcpcd_ctx *, const struct in_addr *);
144 struct ipv4_addr *ipv4_findmaskaddr(struct dhcpcd_ctx *,
145 const struct in_addr *);
146 struct ipv4_addr *ipv4_findmaskbrd(struct dhcpcd_ctx *,
147 const struct in_addr *);
148 void ipv4_markaddrsstale(struct interface *);
149 void ipv4_deletestaleaddrs(struct interface *);
150 void ipv4_handleifa(struct dhcpcd_ctx *, int, struct if_head *, const char *,
151 const struct in_addr *, const struct in_addr *, const struct in_addr *,
152 int, pid_t);
153
154 void ipv4_free(struct interface *);
155 #endif /* INET */
156
157 #endif /* IPV4_H */