Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
76 changes: 76 additions & 0 deletions orchagent/request_parser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,15 @@ void Request::parseAttrs(const KeyOpFieldsValuesTuple& request)
case REQ_T_SET:
attr_item_set_[fvField(*i)] = parseSet(fvValue(*i));
break;
case REQ_T_MAC_ADDRESS_LIST:
attr_item_mac_addresses_list_[fvField(*i)] = parseMacAddressList(fvValue(*i));
break;
case REQ_T_IP_LIST:
attr_item_ip_list_[fvField(*i)] = parseIpAddressList(fvValue(*i));
break;
case REQ_T_UINT_LIST:
attr_item_uint_list_[fvField(*i)] = parseUintList(fvValue(*i));
break;
default:
throw std::logic_error(std::string("Not implemented attribute type parser for attribute:") + fvField(*i));
}
Expand Down Expand Up @@ -352,3 +361,70 @@ sai_packet_action_t Request::parsePacketAction(const std::string& str)

return found->second;
}

vector<IpAddress> Request::parseIpAddressList(const std::string& str)
{
try
{
vector<IpAddress> addrs;
string substr;
std::istringstream iss(str);
while (getline(iss, substr, ','))
{
IpAddress addr(substr);
addrs.emplace_back(addr);
}
return addrs;
}
catch (std::invalid_argument& _)
{
throw std::invalid_argument(std::string("Invalid ip address list: ") + str);
}
}

vector<MacAddress> Request::parseMacAddressList(const std::string& str)
{
try
{
vector<MacAddress> addrs;
string substr;
std::istringstream iss(str);
while (getline(iss, substr, ','))
{
uint8_t mac[ETHER_ADDR_LEN];
if (!MacAddress::parseMacString(substr, mac))
{
throw std::invalid_argument(std::string("Invalid mac address: ") + str);
}
addrs.emplace_back(MacAddress(mac));
}
return addrs;
}
catch (std::invalid_argument& _)
{
throw std::invalid_argument(std::string("Invalid mac address list: ") + str);
}
}

vector<uint64_t> Request::parseUintList(const std::string& str)
{
try
{
vector<uint64_t> res;
string substr;
std::istringstream iss(str);
while (getline(iss, substr, ','))
{
res.emplace_back(std::stoul(substr));
}
return res;
}
catch (std::invalid_argument& _)
{
throw std::invalid_argument(std::string("Invalid unsigned integer list: ") + str);
}
catch(std::out_of_range& _)
{
throw std::invalid_argument(std::string("Out of range unsigned integer: ") + str);
}
}
28 changes: 28 additions & 0 deletions orchagent/request_parser.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include "ipprefix.h"
#include <sstream>
#include <set>
#include <vector>

typedef enum _request_types_t
{
Expand All @@ -18,6 +19,9 @@ typedef enum _request_types_t
REQ_T_VLAN,
REQ_T_UINT,
REQ_T_SET,
REQ_T_MAC_ADDRESS_LIST,
REQ_T_IP_LIST,
REQ_T_UINT_LIST,
} request_types_t;

typedef struct _request_description
Expand Down Expand Up @@ -146,6 +150,24 @@ class Request
return table_name_;
}

const std::vector<swss::IpAddress>& getAttrIPList(const std::string& attr_name) const
{
assert(is_parsed_);
return attr_item_ip_list_.at(attr_name);
}

const std::vector<swss::MacAddress>& getAttrMacAddressList(const std::string& attr_name) const
{
assert(is_parsed_);
return attr_item_mac_addresses_list_.at(attr_name);
}

const std::vector<uint64_t>& getAttrUintList(const std::string& attr_name) const
{
assert(is_parsed_);
return attr_item_uint_list_.at(attr_name);
}

protected:
Request(const request_description_t& request_description, const char key_separator)
: request_description_(request_description),
Expand All @@ -167,6 +189,9 @@ class Request
uint64_t parseUint(const std::string& str);
uint16_t parseVlan(const std::string& str);
std::set<std::string> parseSet(const std::string& str);
std::vector<swss::IpAddress> parseIpAddressList(const std::string& str);
std::vector<swss::MacAddress> parseMacAddressList(const std::string& str);
std::vector<uint64_t> parseUintList(const std::string& str);

sai_packet_action_t parsePacketAction(const std::string& str);

Expand Down Expand Up @@ -194,6 +219,9 @@ class Request
std::unordered_map<std::string, swss::IpPrefix> attr_item_ip_prefix_;
std::unordered_map<std::string, uint64_t> attr_item_uint_;
std::unordered_map<std::string, std::set<std::string>> attr_item_set_;
std::unordered_map<std::string, std::vector<swss::IpAddress>> attr_item_ip_list_;
std::unordered_map<std::string, std::vector<swss::MacAddress>> attr_item_mac_addresses_list_;
std::unordered_map<std::string, std::vector<uint64_t>> attr_item_uint_list_;
};

#endif // __REQUEST_PARSER_H