1 /*
2  * Copyright (c) 2017, The Linux Foundation. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are
6  * met:
7  *    * Redistributions of source code must retain the above copyright
8  *      notice, this list of conditions and the following disclaimer.
9  *    * Redistributions in binary form must reproduce the above
10  *      copyright notice, this list of conditions and the following
11  *      disclaimer in the documentation and/or other materials provided
12  *      with the distribution.
13  *    * Neither the name of The Linux Foundation nor the names of its
14  *      contributors may be used to endorse or promote products derived
15  *      from this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
18  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
21  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
24  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
26  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28  */
29 #ifndef _PREFIX_PARSER_H_
30 #define _PREFIX_PARSER_H_
31 
32 /* External Includes */
33 #include <string.h>
34 #include <sys/types.h>
35 #include <vector>
36 
37 /* Internal Includes */
38 #include "IOffloadManager.h"
39 
40 /* Avoiding namespace pollution */
41 using IP_FAM = ::IOffloadManager::IP_FAM;
42 using Prefix = ::IOffloadManager::Prefix;
43 
44 using ::std::string;
45 using ::std::vector;
46 
47 
48 class PrefixParser {
49 public:
50     PrefixParser();
51     bool add(vector<string> /* in */);
52     bool add(string /* in */);
53     bool addV4(vector<string> /* in */);
54     bool addV4(string /* in */);
55     bool addV6(vector<string> /* in */);
56     bool addV6(string /* in */);
57     int size();
58     bool allAreFullyQualified();
59     Prefix getFirstPrefix();
60     Prefix getFirstPrefix(IP_FAM);
61     string getLastErrAsStr();
62 private:
63     bool add(string /* in */, IP_FAM /* famHint */);
64     bool add(vector<string> /* in */, IP_FAM /* famHint */);
65     static IP_FAM guessIPFamily(string /* in */);
66     static bool splitIntoAddrAndMask(string /* in */, string& /* addr */,
67             string& /* mask */);
68     static int parseSubnetMask(string /* in */, IP_FAM /* famHint */);
69     static bool parseV4Addr(string /* in */, Prefix& /* out */);
70     static bool parseV6Addr(string /* in */, Prefix& /* out */);
71     static bool populateV4Mask(int /* mask */, Prefix& /* out */);
72     static bool populateV6Mask(int /* mask */, Prefix& /* out */);
73     static uint32_t createMask(int /* mask */);
74     static Prefix makeBlankPrefix(IP_FAM /* famHint */);
75     bool isMaskValid(int /* mask */, IP_FAM /* fam */);
76     static const uint32_t FULLY_QUALIFIED_MASK = ~0;
77     vector<Prefix> mPrefixes;
78     string mLastErr;
79 }; /* PrefixParser */
80 #endif /* _PREFIX_PARSER_H_ */