[Xorp-hackers] Question on RIB
Pavlin Radoslavov
pavlin at icir.org
Fri Oct 26 15:58:20 PDT 2007
Ben Greear <greearb at candelatech.com> wrote:
> I found the problem: The Vif reuse logic wasn't quite right:
> (rib.cc)
>
> @@ -509,14 +524,18 @@
> new_rib_vif->set_deleted(false);
> _deleted_vifs.erase(vi);
> new_rib_vif->copy_in(vif);
> + _vifs[vifname] = new_rib_vif;
> + debug_msg("Reused previously deleted vif\n");
> } else {
> // Create a new vif
Nice catch!
The fix (slightly modified) is applied to CVS.
> I'm attaching a full patch with more debugging logic for rib
> in case you'd care to apply it.
Adding that amount of debug messages to CVS is probably an overkill
and makes the current code more difficult to read.
For the time being I'd rather leave it out. If we keep seeing more
and more bugs in that part of the code then I might add it to
facilitate the bug chasing.
Thanks,
Pavlin
> Thanks,
> Ben
>
> --
> Ben Greear <greearb at candelatech.com>
> Candela Technologies Inc http://www.candelatech.com
>
> Index: rib.cc
> ===================================================================
> RCS file: /cvs/xorp/rib/rib.cc,v
> retrieving revision 1.68
> diff -u -r1.68 rib.cc
> --- rib.cc 3 Oct 2007 00:05:48 -0000 1.68
> +++ rib.cc 26 Oct 2007 22:35:44 -0000
> @@ -495,9 +507,12 @@
> map<string, RibVif*>::iterator vi;
> RibVif* new_rib_vif = NULL;
>
> - debug_msg("RIB::new_vif: %s\n", vifname.c_str());
> - if (_vifs.find(vifname) != _vifs.end())
> + debug_msg("RIB::new_vif: this: %p name: %s %s\n",
> + this, name().c_str(), vifname.c_str());
> + if (_vifs.find(vifname) != _vifs.end()) {
> + debug_msg("RIB::new_vif, vif %s already exists.\n", vifname.c_str());
> return XORP_ERROR;
> + }
>
> //
> // If the vif is pending deletion, then reuse it instead
> @@ -509,14 +524,18 @@
> new_rib_vif->set_deleted(false);
> _deleted_vifs.erase(vi);
> new_rib_vif->copy_in(vif);
> + _vifs[vifname] = new_rib_vif;
> + debug_msg("Reused previously deleted vif\n");
> } else {
> // Create a new vif
> new_rib_vif = new RibVif(this, vif);
> _vifs[vifname] = new_rib_vif;
> + debug_msg("Created new vif\n");
> }
> XLOG_ASSERT(new_rib_vif != NULL);
>
> if (new_rib_vif->is_underlying_vif_up()) {
> + debug_msg("Underlying VIF was up\n");
> //
> // Add the directly connected routes associated with this vif
> //
> @@ -535,6 +554,9 @@
> add_connected_route(*new_rib_vif, subnet_addr, addr, peer_addr);
> }
> }
> + else {
> + debug_msg("Underlying vif was NOT up, not adding directly connected routes at this time.\n");
> + }
>
> return XORP_OK;
> }
> @@ -685,6 +707,8 @@
> if (vi == _vifs.end()) {
> XLOG_ERROR("Attempting to add address to non-existant Vif \"%s\"",
> vifname.c_str());
> + XLOG_ERROR("RIB: this: %p name: %s\n%s\n",
> + this, name().c_str(), str().c_str());
> return XORP_ERROR;
> }
> RibVif* vif = vi->second;
> @@ -1559,6 +1583,23 @@
> }
>
> template <typename A>
> +string
> +RIB<A>::str()
> +{
> + string rv;
> + map<string, RibVif*>::iterator iter;
> +
> + for (iter = _vifs.begin(); iter != _vifs.end(); ++iter) {
> + rv += iter->first;
> + rv += ": ";
> + rv += iter->second->str();
> + rv += "\n";
> + }
> + return rv;
> +}
> +
> +
> +template <typename A>
> void
> RIB<A>::print_rib() const
> {
> Index: rib.hh
> ===================================================================
> RCS file: /cvs/xorp/rib/rib.hh,v
> retrieving revision 1.41
> diff -u -r1.41 rib.hh
> --- rib.hh 3 Oct 2007 00:05:48 -0000 1.41
> +++ rib.hh 26 Oct 2007 22:35:44 -0000
> @@ -486,6 +486,7 @@
> * Print the RIB structure for debugging
> */
> void print_rib() const;
> + string str();
>
> /**
> * Get RIB name.
> _______________________________________________
> Xorp-hackers mailing list
> Xorp-hackers at icir.org
> http://mailman.ICSI.Berkeley.EDU/mailman/listinfo/xorp-hackers
More information about the Xorp-hackers
mailing list