1*d30ea906Sjfb8856606 /* SPDX-License-Identifier: BSD-3-Clause
2*d30ea906Sjfb8856606  * Copyright(c) 2010-2014 Intel Corporation.
3a9643ea8Slogwang  * Copyright (c) 2009, Olivier MATZ <[email protected]>
4a9643ea8Slogwang  * All rights reserved.
5a9643ea8Slogwang  */
6a9643ea8Slogwang 
7a9643ea8Slogwang #ifndef _PARSE_IPADDR_H_
8a9643ea8Slogwang #define _PARSE_IPADDR_H_
9a9643ea8Slogwang 
10a9643ea8Slogwang #include <cmdline_parse.h>
11a9643ea8Slogwang #include <netinet/in.h>
12a9643ea8Slogwang 
13a9643ea8Slogwang #ifdef __cplusplus
14a9643ea8Slogwang extern "C" {
15a9643ea8Slogwang #endif
16a9643ea8Slogwang 
17a9643ea8Slogwang #define CMDLINE_IPADDR_V4      0x01
18a9643ea8Slogwang #define CMDLINE_IPADDR_V6      0x02
19a9643ea8Slogwang #define CMDLINE_IPADDR_NETWORK 0x04
20a9643ea8Slogwang 
21a9643ea8Slogwang struct cmdline_ipaddr {
22a9643ea8Slogwang 	uint8_t family;
23a9643ea8Slogwang 	union {
24a9643ea8Slogwang 		struct in_addr ipv4;
25a9643ea8Slogwang 		struct in6_addr ipv6;
26a9643ea8Slogwang 	} addr;
27a9643ea8Slogwang 	unsigned int prefixlen; /* in case of network only */
28a9643ea8Slogwang };
29a9643ea8Slogwang typedef struct cmdline_ipaddr cmdline_ipaddr_t;
30a9643ea8Slogwang 
31a9643ea8Slogwang struct cmdline_token_ipaddr_data {
32a9643ea8Slogwang 	uint8_t flags;
33a9643ea8Slogwang };
34a9643ea8Slogwang 
35a9643ea8Slogwang struct cmdline_token_ipaddr {
36a9643ea8Slogwang 	struct cmdline_token_hdr hdr;
37a9643ea8Slogwang 	struct cmdline_token_ipaddr_data ipaddr_data;
38a9643ea8Slogwang };
39a9643ea8Slogwang typedef struct cmdline_token_ipaddr cmdline_parse_token_ipaddr_t;
40a9643ea8Slogwang 
41a9643ea8Slogwang extern struct cmdline_token_ops cmdline_token_ipaddr_ops;
42a9643ea8Slogwang 
43a9643ea8Slogwang int cmdline_parse_ipaddr(cmdline_parse_token_hdr_t *tk, const char *srcbuf,
44a9643ea8Slogwang 	void *res, unsigned ressize);
45a9643ea8Slogwang int cmdline_get_help_ipaddr(cmdline_parse_token_hdr_t *tk, char *dstbuf,
46a9643ea8Slogwang 	unsigned int size);
47a9643ea8Slogwang 
48a9643ea8Slogwang #define TOKEN_IPADDR_INITIALIZER(structure, field)      \
49a9643ea8Slogwang {                                                       \
50a9643ea8Slogwang 	/* hdr */                                           \
51a9643ea8Slogwang 	{                                                   \
52a9643ea8Slogwang 		&cmdline_token_ipaddr_ops,      /* ops */       \
53a9643ea8Slogwang 		offsetof(structure, field),     /* offset */    \
54a9643ea8Slogwang 	},                                                  \
55a9643ea8Slogwang 	/* ipaddr_data */                                   \
56a9643ea8Slogwang 	{                                                   \
57a9643ea8Slogwang 		CMDLINE_IPADDR_V4 |             /* flags */     \
58a9643ea8Slogwang 		CMDLINE_IPADDR_V6,                              \
59a9643ea8Slogwang 	},                                                  \
60a9643ea8Slogwang }
61a9643ea8Slogwang 
62a9643ea8Slogwang #define TOKEN_IPV4_INITIALIZER(structure, field)        \
63a9643ea8Slogwang {                                                       \
64a9643ea8Slogwang 	/* hdr */                                           \
65a9643ea8Slogwang 	{                                                   \
66a9643ea8Slogwang 		&cmdline_token_ipaddr_ops,      /* ops */       \
67a9643ea8Slogwang 		offsetof(structure, field),     /* offset */    \
68a9643ea8Slogwang 	},                                                  \
69a9643ea8Slogwang 	/* ipaddr_data */                                   \
70a9643ea8Slogwang 	{                                                   \
71a9643ea8Slogwang 		CMDLINE_IPADDR_V4,              /* flags */     \
72a9643ea8Slogwang 	},                                                  \
73a9643ea8Slogwang }
74a9643ea8Slogwang 
75a9643ea8Slogwang #define TOKEN_IPV6_INITIALIZER(structure, field)        \
76a9643ea8Slogwang {                                                       \
77a9643ea8Slogwang 	/* hdr */                                           \
78a9643ea8Slogwang 	{                                                   \
79a9643ea8Slogwang 		&cmdline_token_ipaddr_ops,      /* ops */       \
80a9643ea8Slogwang 		offsetof(structure, field),     /* offset */    \
81a9643ea8Slogwang 	},                                                  \
82a9643ea8Slogwang 	/* ipaddr_data */                                   \
83a9643ea8Slogwang 	{                                                   \
84a9643ea8Slogwang 		CMDLINE_IPADDR_V6,              /* flags */     \
85a9643ea8Slogwang 	},                                                  \
86a9643ea8Slogwang }
87a9643ea8Slogwang 
88a9643ea8Slogwang #define TOKEN_IPNET_INITIALIZER(structure, field)       \
89a9643ea8Slogwang {                                                       \
90a9643ea8Slogwang 	/* hdr */                                           \
91a9643ea8Slogwang 	{                                                   \
92a9643ea8Slogwang 		&cmdline_token_ipaddr_ops,      /* ops */       \
93a9643ea8Slogwang 		offsetof(structure, field),     /* offset */    \
94a9643ea8Slogwang 	},                                                  \
95a9643ea8Slogwang 	/* ipaddr_data */                                   \
96a9643ea8Slogwang 	{                                                   \
97a9643ea8Slogwang 		CMDLINE_IPADDR_V4 |             /* flags */     \
98a9643ea8Slogwang 		CMDLINE_IPADDR_V6 |                             \
99a9643ea8Slogwang 		CMDLINE_IPADDR_NETWORK,                         \
100a9643ea8Slogwang 	},                                                  \
101a9643ea8Slogwang }
102a9643ea8Slogwang 
103a9643ea8Slogwang #define TOKEN_IPV4NET_INITIALIZER(structure, field)     \
104a9643ea8Slogwang {                                                       \
105a9643ea8Slogwang 	/* hdr */                                           \
106a9643ea8Slogwang 	{                                                   \
107a9643ea8Slogwang 		&cmdline_token_ipaddr_ops,      /* ops */       \
108a9643ea8Slogwang 		offsetof(structure, field),     /* offset */    \
109a9643ea8Slogwang 	},                                                  \
110a9643ea8Slogwang 	/* ipaddr_data */                                   \
111a9643ea8Slogwang 	{                                                   \
112a9643ea8Slogwang 		CMDLINE_IPADDR_V4 |             /* flags */     \
113a9643ea8Slogwang 		CMDLINE_IPADDR_NETWORK,                         \
114a9643ea8Slogwang 	},                                                  \
115a9643ea8Slogwang }
116a9643ea8Slogwang 
117a9643ea8Slogwang #define TOKEN_IPV6NET_INITIALIZER(structure, field)     \
118a9643ea8Slogwang {                                                       \
119a9643ea8Slogwang 	/* hdr */                                           \
120a9643ea8Slogwang 	{                                                   \
121a9643ea8Slogwang 		&cmdline_token_ipaddr_ops,      /* ops */       \
122a9643ea8Slogwang 		offsetof(structure, field),     /* offset */    \
123a9643ea8Slogwang 	},                                                  \
124a9643ea8Slogwang 	/* ipaddr_data */                                   \
125a9643ea8Slogwang 	{                                                   \
126a9643ea8Slogwang 		CMDLINE_IPADDR_V4 |             /* flags */     \
127a9643ea8Slogwang 		CMDLINE_IPADDR_NETWORK,                         \
128a9643ea8Slogwang 	},                                                  \
129a9643ea8Slogwang }
130a9643ea8Slogwang 
131a9643ea8Slogwang #ifdef __cplusplus
132a9643ea8Slogwang }
133a9643ea8Slogwang #endif
134a9643ea8Slogwang 
135a9643ea8Slogwang #endif /* _PARSE_IPADDR_H_ */
136