/** * Parses port configuration. * @param[out] mode the filter mode. * @param[out] port_list port list. * @param[in] node_param the xml_node object represents the node params. * @param[in] port_node_name the node name for port number. */ static inline void parse_port_configuration( uint8_t& mode, PORT_LIST& port_list, const xml_node& node_param, const char_t* port_node_name) { xml_node node_port = node_param.child(port_node_name); if (!node_port.empty()) { if(parse_filter_mode(node_port, mode)) { for (xml_node node_number = node_port.child("number"); !node_number.empty(); node_number = node_number.next_sibling("number")) { if(xml_attribute attr = node_number.attribute("value")) { port_list.push_back(attr.as_uint()); } else { signal_error(port_node_name); } } if (port_list.empty()) { // checks whether the old specification is specified xml_attribute attr = node_port.attribute("number"); if(attr.empty()) { signal_error(port_node_name); } port_list.push_back(attr.as_uint()); } } else { signal_error(port_node_name); } } }
/** * configures the filter * @param n the xml subtree */ virtual void _configure(const pugi::xml_node& n ) { if(pugi::xml_node c = n.child("ip_src")) { if(parse_filter_mode(c,m_ip_src_mode)) { if(pugi::xml_attribute attr = c.attribute("address")) { m_ip_src_address = string_to_ip(attr.value()); } else signal_error ("ip_src"); if(pugi::xml_attribute attr = c.attribute("netmask")) { m_ip_src_mask = string_to_ip(attr.value()); } else signal_error ("ip_src"); } else signal_error("ip_src"); } if(pugi::xml_node c = n.child("ip_dst")) { if(parse_filter_mode(c,m_ip_dst_mode)) { if(pugi::xml_attribute attr = c.attribute("address")) { m_ip_dst_address = string_to_ip(attr.value()); } else signal_error ("ip_dst"); if(pugi::xml_attribute attr = c.attribute("netmask")) { m_ip_dst_mask = string_to_ip(attr.value()); } else signal_error ("ip_dst"); } else signal_error("ip_dst"); } if(pugi::xml_node c = n.child("l4_protocol")) { if(parse_filter_mode(c,m_layer4_mode)) { if(pugi::xml_attribute attr = c.attribute("number")) { m_layer4_proto = attr.as_uint(); } else signal_error("l4_protocol"); } else signal_error("l4_protocol"); } if(pugi::xml_node c = n.child("src_port")) { if(parse_filter_mode(c,m_src_port_mode)) { if(pugi::xml_attribute attr = c.attribute("number")) { m_src_port = attr.as_uint(); } else signal_error("src_port"); } else signal_error("src_port"); } if(pugi::xml_node c = n.child("dst_port")) { if(parse_filter_mode(c,m_dst_port_mode)) { if(pugi::xml_attribute attr = c.attribute("number")) { m_dst_port = attr.as_uint(); } else signal_error("dst_port"); } else signal_error("dst_port"); } }