From: Igor Maravic <[email protected]> Enabled creation of input socket before calling the function join_multicast group(). This enable us to get packages from the interface even if we didn't registered multicast listener on if/vif.
Signed-off-by: Igor Maravic <[email protected]> --- xorp/fea/data_plane/io/io_ip_dummy.cc | 19 +++++++++++ xorp/fea/data_plane/io/io_ip_dummy.hh | 12 +++++++ xorp/fea/data_plane/io/io_ip_socket.cc | 32 ++++++++++++++++++ xorp/fea/data_plane/io/io_ip_socket.hh | 12 +++++++ xorp/fea/io_ip.hh | 12 +++++++ xorp/fea/io_ip_manager.cc | 55 ++++++++++++++++++++++++++++++++ xorp/fea/io_ip_manager.hh | 11 ++++++ 7 files changed, 153 insertions(+), 0 deletions(-) diff --git a/xorp/fea/data_plane/io/io_ip_dummy.cc b/xorp/fea/data_plane/io/io_ip_dummy.cc index b2f4656..44e1542 100644 --- a/xorp/fea/data_plane/io/io_ip_dummy.cc +++ b/xorp/fea/data_plane/io/io_ip_dummy.cc @@ -140,6 +140,25 @@ IoIpDummy::set_default_multicast_interface(const string& if_name, } int +IoIpDummy::create_input_socket(const string& if_name, + const string& vif_name, + string& error_msg) +{ + const IfTreeVif* vifp; + + // Find the vif + vifp = iftree().find_vif(if_name, vif_name); + if (vifp == NULL) { + error_msg = c_format("Creating input socket failed: " + "interface %s vif %s not found", + if_name.c_str(), + vif_name.c_str()); + return (XORP_ERROR); + } + return (XORP_OK); +} + +int IoIpDummy::join_multicast_group(const string& if_name, const string& vif_name, const IPvX& group, diff --git a/xorp/fea/data_plane/io/io_ip_dummy.hh b/xorp/fea/data_plane/io/io_ip_dummy.hh index 2708acd..fda6842 100644 --- a/xorp/fea/data_plane/io/io_ip_dummy.hh +++ b/xorp/fea/data_plane/io/io_ip_dummy.hh @@ -116,6 +116,18 @@ public: string& error_msg); /** + * Create input socket. + * + * @param if_name the name of the interface to listen on + * @param vif_name the name of the vif to listen on + * @error error_msg the error message (if error). + * @return XORP_OK on success, otherwise XORP_ERROR + */ + int create_input_socket(const string& if_name, + const string& vif_name, + string& error_msg); + + /** * Join a multicast group on an interface. * * @param if_name the name of the interface to join the multicast group. diff --git a/xorp/fea/data_plane/io/io_ip_socket.cc b/xorp/fea/data_plane/io/io_ip_socket.cc index a7f4a4d..c22ec0a 100644 --- a/xorp/fea/data_plane/io/io_ip_socket.cc +++ b/xorp/fea/data_plane/io/io_ip_socket.cc @@ -519,6 +519,38 @@ IoIpSocket::set_default_multicast_interface(const string& if_name, } int +IoIpSocket::create_input_socket(const string& if_name, + const string& vif_name, + string& error_msg) +{ + error_msg.clear(); + + if (!iftree().find_vif(if_name, vif_name)) { + error_msg += c_format("Creating of input socket failed: " + "interface %s vif %s not found", + if_name.c_str(), + vif_name.c_str()); + goto out_err; + } + + if (!findOrCreateInputSocket(if_name, vif_name, error_msg)) { + string em = c_format("ERROR: Could not find or create input socket, " + "if_name: %s vif_name: %s error_msg: %s", + if_name.c_str(), vif_name.c_str(), error_msg.c_str()); + XLOG_WARNING("%s", em.c_str()); + error_msg += em; + goto out_err; + } + return XORP_OK; + +out_err: + if (error_msg.size()) { + XLOG_ERROR("ERROR in %s: %s", __func__, error_msg.c_str()); + } + return XORP_ERROR; +} + +int IoIpSocket::join_multicast_group(const string& if_name, const string& vif_name, const IPvX& group, diff --git a/xorp/fea/data_plane/io/io_ip_socket.hh b/xorp/fea/data_plane/io/io_ip_socket.hh index 35714d7..841d1e7 100644 --- a/xorp/fea/data_plane/io/io_ip_socket.hh +++ b/xorp/fea/data_plane/io/io_ip_socket.hh @@ -123,6 +123,18 @@ public: string& error_msg); /** + * Create input socket. + * + * @param if_name the name of the interface to listen on + * @param vif_name the name of the vif to listen on + * @error error_msg the error message (if error). + * @return XORP_OK on success, otherwise XORP_ERROR + */ + int create_input_socket(const string& if_name, + const string& vif_name, + string& error_msg); + + /** * Join a multicast group on an interface. * * @param if_name the name of the interface to join the multicast group. diff --git a/xorp/fea/io_ip.hh b/xorp/fea/io_ip.hh index c6d6a68..635fc41 100644 --- a/xorp/fea/io_ip.hh +++ b/xorp/fea/io_ip.hh @@ -191,6 +191,18 @@ public: string& error_msg) = 0; /** + * Create input socket. + * + * @param if_name the name of the interface to listen on + * @param vif_name the name of the vif to listen on + * @error error_msg the error message (if error). + * @return XORP_OK on success, otherwise XORP_ERROR + */ + virtual int create_input_socket(const string& if_name, + const string& vif_name, + string& error_msg) = 0; + + /** * Join a multicast group on an interface. * * @param if_name the name of the interface to join the multicast group. diff --git a/xorp/fea/io_ip_manager.cc b/xorp/fea/io_ip_manager.cc index a599b9f..ddaae3f 100644 --- a/xorp/fea/io_ip_manager.cc +++ b/xorp/fea/io_ip_manager.cc @@ -384,6 +384,58 @@ IoIpComm::recv_system_multicast_upcall(const vector<uint8_t>& payload) } } +void +IoIpComm::create_input_socket(const string& if_name, + const string& vif_name) +{ + bool err = false; + string error_msg; + + if (_io_ip_plugins.empty()) { + error_msg = c_format("No I/O IP plugin to create input socket " + "on interface %s vif %s protocol %u", + if_name.c_str(), vif_name.c_str(), + _ip_protocol); + goto error; + } + + // + // Check the arguments + // + if (if_name.empty()) { + error_msg = c_format("Cannot create input socket: empty interface name"); + goto error; + } + if (vif_name.empty()) { + error_msg = c_format("Cannot create input socket on interface %s: " + "empty vif name", if_name.c_str()); + goto error; + } + + do { + IoIpPlugins::iterator plugin_iter; + for (plugin_iter = _io_ip_plugins.begin(); + plugin_iter != _io_ip_plugins.end(); ++plugin_iter) { + IoIp* io_ip = plugin_iter->second; + if (io_ip->create_input_socket(if_name, vif_name, + error_msg) != XORP_OK) { + err = true; + if (!error_msg.empty()) + error_msg += " "; + error_msg += error_msg; + } + } + } while (0); //dummy loop to avoid compiler warning + + if (err) + goto error; + + return; +error: + XLOG_WARNING("%s\n", error_msg.c_str()); + return; +} + int IoIpComm::join_multicast_group(const string& if_name, const string& vif_name, @@ -932,6 +984,9 @@ IoIpManager::register_receiver(int family, // Add the filter to those associated with receiver_name filters.insert(FilterBag::value_type(receiver_name, filter)); + //Create input socket for if vif pair + io_ip_comm->create_input_socket(if_name, vif_name); + // Register interest in watching the receiver if (_fea_node.fea_io().add_instance_watch(receiver_name, this, error_msg) != XORP_OK) { diff --git a/xorp/fea/io_ip_manager.hh b/xorp/fea/io_ip_manager.hh index 3df7afa..04da094 100644 --- a/xorp/fea/io_ip_manager.hh +++ b/xorp/fea/io_ip_manager.hh @@ -373,6 +373,17 @@ public: virtual void recv_system_multicast_upcall(const vector<uint8_t>& payload); /** + * Create input socket. + * + * @param if_name the name of the interface to listen on + * @param vif_name the name of the vif to listen on + * @error error_msg the error message (if error). + * @return XORP_OK on success, otherwise XORP_ERROR + */ + void create_input_socket(const string& if_name, + const string& vif_name); + + /** * Join an IP multicast group. * * @param if_name the interface through which packets should be accepted. -- 1.7.5.4 _______________________________________________ Xorp-hackers mailing list [email protected] http://mailman.ICSI.Berkeley.EDU/mailman/listinfo/xorp-hackers
