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