Answering myself. I kinda decided it is a bug. Everybody else doing V6 ospf seems to send metrics with Intra-Area prefix LSA, and everybody else seems to want to see them to give a cost to a link.
(everybody else == cisco and quagga :) Here is a patch a worked up that seems to let xorp "do the right thing". I left in the sending of /128 interface prefix along with the /64 network prefix becuase I have no "virtual links" nor experience with them. I kinda think that those /128's should be advertised ONLY on virtual links and certainly not on broadcast networks... But haven't worked that out yet. Patch is against a git pull on 4-29-2012 but applies clean to 1.8.5 also. C++ is not my native language, and I am not certain on some OSPF3 things still, so I would appreciate some feedback. Thoughts? Anyone out there acutally trying to use xorp ospf6 besides me? :) E [email protected] said: > I started playing vith ospf for v6 recently. I have noticed an > oddity. I am curious if I have something miss-configured or I have > found a bug. > OSPFv3 for ipv6 has a couple new link-state adv types. The one I am > running into interoperability issues with is the Intra-area prefix > type. > It appears that xorp is sending these out with a cost of zero. No > matter what the config file cost setting is. > This causes all the other ospf3 impelmentations it talks to (well, > ok, cisco IOS and quagga are the only ones I have tested) to count > the cost to that network as zero. > xorp sends the ole fashioned router lsa's with the appropriate > costs. But not the new fangled intra-area prefix costs. > xorp also seems to send a /128 IA prefix LSA with the address of > the interface also with metric of 0. This doesn't impact things as > much as the network prefixs being 0, but seems odd too. > I have verified with wireshark that it is sending the IA prefix > lsa's with cost 0. > Below are relavant snips of my configs. > Xorp showing this behavior is 1.8.5 and git pulled on 2012-04-19 > Running on centos 5.6 (RHEL 5). Linux test-router 2.6.18-164.6.1.el5 > #1 SMP Tue Nov 3 16:18:27 EST 2009 i686 i686 i386 GNU/Linux > Am I missing something? Or is this a bug? > E diff -r -U5 /opt/router/src/xorp.ct.20120429.orig/xorp/ospf/area_router.cc ./area_router.cc --- /opt/router/src/xorp.ct.20120429.orig/xorp/ospf/area_router.cc 2012-04-29 08:34:47.000000000 -0400 +++ ./area_router.cc 2012-04-29 09:01:10.000000000 -0400 @@ -3444,11 +3444,10 @@ if (prefix.get_nu_bit() /*|| prefix.get_la_bit()*/) continue; if (prefix.get_network().masked_addr(). is_linklocal_unicast()) continue; - prefix.set_metric(0); prefixes.push_back(prefix); } } } else if (configured_virtual_link()) { uint32_t interface_id = pm.get_interface_id(i->first); diff -r -U5 /opt/router/src/xorp.ct.20120429.orig/xorp/ospf/peer.cc ./peer.cc --- /opt/router/src/xorp.ct.20120429.orig/xorp/ospf/peer.cc 2012-04-29 08:34:47.000000000 -0400 +++ ./peer.cc 2012-04-29 08:50:33.000000000 -0400 @@ -706,18 +706,18 @@ return _areas[area]->get_attached_routers(routers); } template <typename A> bool -PeerOut<A>::add_advertise_net(OspfTypes::AreaID area, A addr, uint32_t prefix) +PeerOut<A>::add_advertise_net(OspfTypes::AreaID area, A addr, uint32_t prefix, uint16_t interface_cost) { if (0 == _areas.count(area)) { XLOG_ERROR("Unknown Area %s", pr_id(area).c_str()); return false; } - return _areas[area]->add_advertise_net(addr, prefix); + return _areas[area]->add_advertise_net(addr, prefix, interface_cost); } template <typename A> bool PeerOut<A>::remove_all_nets(OspfTypes::AreaID area) @@ -3220,37 +3220,39 @@ return _hello_packet.get_interface_id(); } template <> bool -Peer<IPv4>::add_advertise_net(IPv4 /*addr*/, uint32_t /*prefix_length*/) +Peer<IPv4>::add_advertise_net(IPv4 /*addr*/, uint32_t /*prefix_length*/, uint16_t /*cost*/ ) { XLOG_FATAL("Only IPv6 not IPv4"); return true; } template <> bool -Peer<IPv6>::add_advertise_net(IPv6 addr, uint32_t prefix_length) +Peer<IPv6>::add_advertise_net(IPv6 addr, uint32_t prefix_length, uint16_t interface_cost) { XLOG_ASSERT(OspfTypes::VirtualLink != get_linktype()); LinkLsa *llsa = dynamic_cast<LinkLsa *>(_link_lsa.get()); XLOG_ASSERT(llsa); if (addr.is_linklocal_unicast()) return false; - IPv6Prefix prefix(_ospf.get_version()); + IPv6Prefix prefix(_ospf.get_version(), true); prefix.set_network(IPNet<IPv6>(addr, prefix_length)); + prefix.set_metric(interface_cost); llsa->get_prefixes().push_back(prefix); // Add a host route that can be used if necessary to advertise a // virtual link endpoint. - IPv6Prefix host_prefix(_ospf.get_version()); + IPv6Prefix host_prefix(_ospf.get_version(), true); host_prefix.set_network(IPNet<IPv6>(addr, IPv6::ADDR_BITLEN)); + host_prefix.set_metric(interface_cost); host_prefix.set_la_bit(true); llsa->get_prefixes().push_back(host_prefix); return true; } diff -r -U5 /opt/router/src/xorp.ct.20120429.orig/xorp/ospf/peer.hh ./peer.hh --- /opt/router/src/xorp.ct.20120429.orig/xorp/ospf/peer.hh 2012-04-29 08:34:47.000000000 -0400 +++ ./peer.hh 2012-04-29 08:43:09.000000000 -0400 @@ -327,11 +327,11 @@ list<RouterInfo>& routes); /** * Set a network to advertise OSPFv3 only. */ - bool add_advertise_net(OspfTypes::AreaID area, A addr, uint32_t prefix); + bool add_advertise_net(OspfTypes::AreaID area, A addr, uint32_t prefix, uint16_t interface_cost); /** * Remove all the networks that are being advertised OSPFv3 only. */ bool remove_all_nets(OspfTypes::AreaID area); @@ -1110,11 +1110,11 @@ uint32_t get_interface_id() const; /** * Set a network to advertise OSPFv3 only. */ - bool add_advertise_net(A addr, uint32_t prefix); + bool add_advertise_net(A addr, uint32_t prefix, uint16_t interface_cost); /** * Remove all the networks that are being advertised OSPFv3 only. */ bool remove_all_nets(); diff -r -U5 /opt/router/src/xorp.ct.20120429.orig/xorp/ospf/peer_manager.cc ./peer_manager.cc --- /opt/router/src/xorp.ct.20120429.orig/xorp/ospf/peer_manager.cc 2012-04-29 08:34:47.000000000 -0400 +++ ./peer_manager.cc 2012-04-29 08:57:46.000000000 -0400 @@ -704,10 +704,11 @@ XLOG_ERROR("Unknown PeerID %u", peerid); return false; } set<AddressInfo<A> >& info = _peers[peerid]->get_address_info(area); + uint16_t interface_cost = _peers[peerid]->get_interface_cost() ; // Unconditionally remove all the global addresses that are being // advertised. _peers[peerid]->remove_all_nets(area); @@ -739,21 +740,21 @@ interface_prefix_length)) { XLOG_ERROR("Unable to get prefix length for %s", cstring(*i)); continue; } if (!_peers[peerid]->add_advertise_net(area, (*i), - interface_prefix_length)) { + interface_prefix_length,interface_cost)) { XLOG_WARNING("Unable to advertise %s in Link-LSA\n", cstring(*i)); } } } else { typename set<AddressInfo<A> >::iterator i; for (i = info.begin(); i != info.end(); i++) { if ((*i)._enabled) { if (!_peers[peerid]->add_advertise_net(area, (*i)._address, - (*i)._prefix)) { + (*i)._prefix,interface_cost)) { XLOG_WARNING("Unable to advertise %s in Link-LSA\n", cstring((*i)._address)); } } } _______________________________________________ Xorp-hackers mailing list [email protected] http://mailman.ICSI.Berkeley.EDU/mailman/listinfo/xorp-hackers
