1/*-
2 *   BSD LICENSE
3 *
4 *   Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
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 *
11 *     * Redistributions of source code must retain the above copyright
12 *       notice, this list of conditions and the following disclaimer.
13 *     * Redistributions in binary form must reproduce the above copyright
14 *       notice, this list of conditions and the following disclaimer in
15 *       the documentation and/or other materials provided with the
16 *       distribution.
17 *     * Neither the name of Intel Corporation nor the names of its
18 *       contributors may be used to endorse or promote products derived
19 *       from this software without specific prior written permission.
20 *
21 *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24 *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25 *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31 *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 */
33
34/*
35 * Copyright (c) 2009, Olivier MATZ <zer0@droids-corp.org>
36 * All rights reserved.
37 * Redistribution and use in source and binary forms, with or without
38 * modification, are permitted provided that the following conditions are met:
39 *
40 *     * Redistributions of source code must retain the above copyright
41 *       notice, this list of conditions and the following disclaimer.
42 *     * Redistributions in binary form must reproduce the above copyright
43 *       notice, this list of conditions and the following disclaimer in the
44 *       documentation and/or other materials provided with the distribution.
45 *     * Neither the name of the University of California, Berkeley nor the
46 *       names of its contributors may be used to endorse or promote products
47 *       derived from this software without specific prior written permission.
48 *
49 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY
50 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
51 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
52 * DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
53 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
54 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
55 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
56 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
57 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
58 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
59 */
60
61#ifndef _PARSE_IPADDR_H_
62#define _PARSE_IPADDR_H_
63
64#include <cmdline_parse.h>
65#include <netinet/in.h>
66
67#ifdef __cplusplus
68extern "C" {
69#endif
70
71#define CMDLINE_IPADDR_V4      0x01
72#define CMDLINE_IPADDR_V6      0x02
73#define CMDLINE_IPADDR_NETWORK 0x04
74
75struct cmdline_ipaddr {
76	uint8_t family;
77	union {
78		struct in_addr ipv4;
79		struct in6_addr ipv6;
80	} addr;
81	unsigned int prefixlen; /* in case of network only */
82};
83typedef struct cmdline_ipaddr cmdline_ipaddr_t;
84
85struct cmdline_token_ipaddr_data {
86	uint8_t flags;
87};
88
89struct cmdline_token_ipaddr {
90	struct cmdline_token_hdr hdr;
91	struct cmdline_token_ipaddr_data ipaddr_data;
92};
93typedef struct cmdline_token_ipaddr cmdline_parse_token_ipaddr_t;
94
95extern struct cmdline_token_ops cmdline_token_ipaddr_ops;
96
97int cmdline_parse_ipaddr(cmdline_parse_token_hdr_t *tk, const char *srcbuf,
98	void *res, unsigned ressize);
99int cmdline_get_help_ipaddr(cmdline_parse_token_hdr_t *tk, char *dstbuf,
100	unsigned int size);
101
102#define TOKEN_IPADDR_INITIALIZER(structure, field)      \
103{                                                       \
104	/* hdr */                                           \
105	{                                                   \
106		&cmdline_token_ipaddr_ops,      /* ops */       \
107		offsetof(structure, field),     /* offset */    \
108	},                                                  \
109	/* ipaddr_data */                                   \
110	{                                                   \
111		CMDLINE_IPADDR_V4 |             /* flags */     \
112		CMDLINE_IPADDR_V6,                              \
113	},                                                  \
114}
115
116#define TOKEN_IPV4_INITIALIZER(structure, field)        \
117{                                                       \
118	/* hdr */                                           \
119	{                                                   \
120		&cmdline_token_ipaddr_ops,      /* ops */       \
121		offsetof(structure, field),     /* offset */    \
122	},                                                  \
123	/* ipaddr_data */                                   \
124	{                                                   \
125		CMDLINE_IPADDR_V4,              /* flags */     \
126	},                                                  \
127}
128
129#define TOKEN_IPV6_INITIALIZER(structure, field)        \
130{                                                       \
131	/* hdr */                                           \
132	{                                                   \
133		&cmdline_token_ipaddr_ops,      /* ops */       \
134		offsetof(structure, field),     /* offset */    \
135	},                                                  \
136	/* ipaddr_data */                                   \
137	{                                                   \
138		CMDLINE_IPADDR_V6,              /* flags */     \
139	},                                                  \
140}
141
142#define TOKEN_IPNET_INITIALIZER(structure, field)       \
143{                                                       \
144	/* hdr */                                           \
145	{                                                   \
146		&cmdline_token_ipaddr_ops,      /* ops */       \
147		offsetof(structure, field),     /* offset */    \
148	},                                                  \
149	/* ipaddr_data */                                   \
150	{                                                   \
151		CMDLINE_IPADDR_V4 |             /* flags */     \
152		CMDLINE_IPADDR_V6 |                             \
153		CMDLINE_IPADDR_NETWORK,                         \
154	},                                                  \
155}
156
157#define TOKEN_IPV4NET_INITIALIZER(structure, field)     \
158{                                                       \
159	/* hdr */                                           \
160	{                                                   \
161		&cmdline_token_ipaddr_ops,      /* ops */       \
162		offsetof(structure, field),     /* offset */    \
163	},                                                  \
164	/* ipaddr_data */                                   \
165	{                                                   \
166		CMDLINE_IPADDR_V4 |             /* flags */     \
167		CMDLINE_IPADDR_NETWORK,                         \
168	},                                                  \
169}
170
171#define TOKEN_IPV6NET_INITIALIZER(structure, field)     \
172{                                                       \
173	/* hdr */                                           \
174	{                                                   \
175		&cmdline_token_ipaddr_ops,      /* ops */       \
176		offsetof(structure, field),     /* offset */    \
177	},                                                  \
178	/* ipaddr_data */                                   \
179	{                                                   \
180		CMDLINE_IPADDR_V4 |             /* flags */     \
181		CMDLINE_IPADDR_NETWORK,                         \
182	},                                                  \
183}
184
185#ifdef __cplusplus
186}
187#endif
188
189#endif /* _PARSE_IPADDR_H_ */
190