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_ */