--- ./Makefile 2011-04-02 13:13:57.000000000 +0000 +++ ./Makefile 2011-04-02 13:14:33.000000000 +0000 @@ -6,8 +6,8 @@ # PORTNAME= quagga -PORTVERSION= 0.99.17 -PORTREVISION= 5 +PORTVERSION= 0.99.18 +PORTREVISION= 1 CATEGORIES= net ipv6 MASTER_SITES= http://quagga.net/download/ \ http://www.ru.quagga.net/download/ \ --- ./distinfo 2011-04-02 13:13:57.000000000 +0000 +++ ./distinfo 2011-04-02 13:14:33.000000000 +0000 @@ -1,2 +1,2 @@ -SHA256 (quagga-0.99.17.tar.gz) = 1d77df121a334e9504b45e489ee7ce35bf478e27d33cd2793a23280b59d9efd4 -SIZE (quagga-0.99.17.tar.gz) = 2202151 +SHA256 (quagga-0.99.18.tar.gz) = 0cdbe4b90075f4997ca6ecc71ef683a07b4a8ca3c718080fe83f4bcadbcc4d93 +SIZE (quagga-0.99.18.tar.gz) = 2199014 --- ./files/patch-bgp_attr 1970-01-01 00:00:00.000000000 +0000 +++ ./files/patch-bgp_attr 2011-04-02 13:14:06.000000000 +0000 @@ -0,0 +1,13 @@ +--- ../quagga-0.99.18_org/bgpd/bgp_attr.c 2011-03-21 15:32:49.000000000 +0100 ++++ bgpd/bgp_attr.c 2011-03-31 19:19:41.000000000 +0200 +@@ -373,8 +373,8 @@ + + #ifdef HAVE_IPV6 + MIX(attr->extra->mp_nexthop_len); +- key = jhash2(attr->extra->mp_nexthop_global.s6_addr32, 4, key); +- key = jhash2(attr->extra->mp_nexthop_local.s6_addr32, 4, key); ++ key = jhash2(attr->extra->mp_nexthop_global.s6_addr, 16, key); ++ key = jhash2(attr->extra->mp_nexthop_global.s6_addr, 16, key); + #endif /* HAVE_IPV6 */ + } + --- ./files/patch-blackhole 1970-01-01 00:00:00.000000000 +0000 +++ ./files/patch-blackhole 2011-04-02 13:14:06.000000000 +0000 @@ -0,0 +1,16 @@ +diff -u -r ../quagga-0.99.18_org/zebra/zebra_vty.c ./zebra/zebra_vty.c +--- ../quagga-0.99.18_org/zebra/zebra_vty.c 2011-03-21 10:43:52.000000000 +0100 ++++ ./zebra/zebra_vty.c 2011-03-31 17:39:10.000000000 +0200 +@@ -1169,7 +1169,11 @@ + vty_out (vty, " %s", si->gate.ifname); + break; + case STATIC_IPV4_BLACKHOLE: +- vty_out (vty, " Null0"); ++ if (CHECK_FLAG(si->flags, ZEBRA_FLAG_REJECT)) { ++ vty_out (vty, " %s", "reject"); ++ } else { ++ vty_out (vty, " Null0"); ++ } + break; + } + --- ./files/patch-git-1 2011-04-02 13:13:57.000000000 +0000 +++ ./files/patch-git-1 2011-04-02 13:14:06.000000000 +0000 @@ -1,14 +1,99 @@ -diff --git bgpd/bgp_route.c bgpd/bgp_route.c -index 2391f74..1cfc451 100644 ---- bgpd/bgp_route.c -+++ bgpd/bgp_route.c -@@ -6145,7 +6145,8 @@ route_vty_out_detail (struct vty *vty, struct bgp *bgp, struct prefix *p, - bgp_damp_info_vty (vty, binfo); - - /* Line 7 display Uptime */ -- vty_out (vty, " Last update: %s", ctime (&binfo->uptime)); -+ time_t tbuf = time(NULL) - (bgp_clock() - binfo->uptime); -+ vty_out (vty, " Last update: %s", ctime(&tbuf)); +diff --git ospfd/ospf_lsa.h ospfd/ospf_lsa.h +index fee3470..72e2f8a 100644 +--- ospfd/ospf_lsa.h ++++ ospfd/ospf_lsa.h +@@ -114,6 +114,9 @@ struct ospf_lsa + + /* Refreshement List or Queue */ + int refresh_list; ++ ++ /* For Type-9 Opaque-LSAs */ ++ struct ospf_interface *oi; + }; + + /* OSPF LSA Link Type. */ +diff --git ospfd/ospf_nsm.c ospfd/ospf_nsm.c +index 279d2a0..cbc3171 100644 +--- ospfd/ospf_nsm.c ++++ ospfd/ospf_nsm.c +@@ -216,7 +216,7 @@ ospf_db_summary_add (struct ospf_neighbor *nbr, struct ospf_lsa *lsa) + { + case OSPF_OPAQUE_LINK_LSA: + /* Exclude type-9 LSAs that does not have the same "oi" with "nbr". */ +- if (lsa->oi != nbr->oi) ++ if (nbr->oi && ospf_if_exists (lsa->oi) != nbr->oi) + return 0; + break; + case OSPF_OPAQUE_AREA_LSA: +diff --git ospfd/ospf_opaque.c ospfd/ospf_opaque.c +index 6e90011..aa126e1 100644 +--- ospfd/ospf_opaque.c ++++ ospfd/ospf_opaque.c +@@ -251,7 +251,7 @@ struct ospf_opaque_functab + void (* config_write_debug )(struct vty *vty); + void (* show_opaque_info )(struct vty *vty, struct ospf_lsa *lsa); + int (* lsa_originator)(void *arg); +- void (* lsa_refresher )(struct ospf_lsa *lsa); ++ struct ospf_lsa *(* lsa_refresher )(struct ospf_lsa *lsa); + int (* new_lsa_hook)(struct ospf_lsa *lsa); + int (* del_lsa_hook)(struct ospf_lsa *lsa); + }; +@@ -354,7 +354,7 @@ ospf_register_opaque_functab ( + void (* config_write_debug )(struct vty *vty), + void (* show_opaque_info )(struct vty *vty, struct ospf_lsa *lsa), + int (* lsa_originator)(void *arg), +- void (* lsa_refresher )(struct ospf_lsa *lsa), ++ struct ospf_lsa *(* lsa_refresher )(struct ospf_lsa *lsa), + int (* new_lsa_hook)(struct ospf_lsa *lsa), + int (* del_lsa_hook)(struct ospf_lsa *lsa)) + { +@@ -1608,12 +1608,13 @@ out: + return new; + } + +-void ++struct ospf_lsa * + ospf_opaque_lsa_refresh (struct ospf_lsa *lsa) + { + struct ospf *ospf; + struct ospf_opaque_functab *functab; +- ++ struct ospf_lsa *new = NULL; ++ + ospf = ospf_lookup (); + + if ((functab = ospf_opaque_functab_lookup (lsa)) == NULL +@@ -1633,9 +1634,9 @@ ospf_opaque_lsa_refresh (struct ospf_lsa *lsa) + ospf_lsa_flush (ospf, lsa); } - vty_out (vty, "%s", VTY_NEWLINE); + else +- (* functab->lsa_refresher)(lsa); ++ new = (* functab->lsa_refresher)(lsa); + +- return; ++ return new; } + + /*------------------------------------------------------------------------* +diff --git ospfd/ospf_opaque.h ospfd/ospf_opaque.h +index f49fe46..2273064 100644 +--- ospfd/ospf_opaque.h ++++ ospfd/ospf_opaque.h +@@ -120,7 +120,7 @@ ospf_register_opaque_functab ( + void (* config_write_debug )(struct vty *vty), + void (* show_opaque_info )(struct vty *vty, struct ospf_lsa *lsa), + int (* lsa_originator)(void *arg), +- void (* lsa_refresher )(struct ospf_lsa *lsa), ++ struct ospf_lsa *(* lsa_refresher )(struct ospf_lsa *lsa), + int (* new_lsa_hook)(struct ospf_lsa *lsa), + int (* del_lsa_hook)(struct ospf_lsa *lsa) + ); +@@ -143,7 +143,7 @@ extern void ospf_opaque_lsa_originate_schedule (struct ospf_interface *oi, + int *init_delay); + extern struct ospf_lsa *ospf_opaque_lsa_install (struct ospf_lsa *, + int rt_recalc); +-extern void ospf_opaque_lsa_refresh (struct ospf_lsa *lsa); ++extern struct ospf_lsa *ospf_opaque_lsa_refresh (struct ospf_lsa *lsa); + + extern void ospf_opaque_lsa_reoriginate_schedule (void *lsa_type_dependent, + u_char lsa_type, --- ./files/patch-git-2 2011-04-02 13:13:57.000000000 +0000 +++ ./files/patch-git-2 2011-04-02 13:14:06.000000000 +0000 @@ -1,20 +1,33 @@ -diff --git a/lib/zclient.c b/lib/zclient.c -index d3d5322..52a3627 100644 ---- lib/zclient.c -+++ lib/zclient.c -@@ -339,12 +339,12 @@ zclient_start (struct zclient *zclient) - /* Create read thread. */ - zclient_event (ZCLIENT_READ, zclient); +diff --git bgpd/bgp_route.c bgpd/bgp_route.c +index 8c05ba6..5c516f0 100644 +--- bgpd/bgp_route.c ++++ bgpd/bgp_route.c +@@ -4327,6 +4327,7 @@ ALIAS_DEPRECATED (no_bgp_network_mask_natural, + "Specify a BGP backdoor route\n" + "AS-Path hopcount limit attribute\n" + "AS-Pathlimit TTL, in number of AS-Path hops\n") ++#ifdef HAVE_IPV6 + ALIAS_DEPRECATED (ipv6_bgp_network, + ipv6_bgp_network_ttl_cmd, + "network X:X::X:X/M pathlimit <0-255>", +@@ -4342,6 +4343,7 @@ ALIAS_DEPRECATED (no_ipv6_bgp_network, + "IPv6 prefix /\n" + "AS-Path hopcount limit attribute\n" + "AS-Pathlimit TTL, in number of AS-Path hops\n") ++#endif /* HAVE_IPV6 */ -- /* We need interface information. */ -- zebra_message_send (zclient, ZEBRA_INTERFACE_ADD); -- - /* We need router-id information. */ - zebra_message_send (zclient, ZEBRA_ROUTER_ID_ADD); + /* Aggreagete address: -+ /* We need interface information. */ -+ zebra_message_send (zclient, ZEBRA_INTERFACE_ADD); +@@ -12958,9 +12960,11 @@ bgp_route_init (void) + install_element (BGP_IPV4M_NODE, &no_bgp_network_backdoor_ttl_cmd); + install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_backdoor_ttl_cmd); + install_element (BGP_IPV4M_NODE, &no_bgp_network_mask_natural_backdoor_ttl_cmd); +- + - /* Flush all redistribute request. */ - for (i = 0; i < ZEBRA_ROUTE_MAX; i++) - if (i != zclient->redist_default && zclient->redist[i]) ++#ifdef HAVE_IPV6 + install_element (BGP_IPV6_NODE, &ipv6_bgp_network_ttl_cmd); + install_element (BGP_IPV6_NODE, &no_ipv6_bgp_network_ttl_cmd); ++#endif + } + + void --- ./files/patch-git-3 2011-04-02 13:13:57.000000000 +0000 +++ ./files/patch-git-3 2011-04-02 13:14:06.000000000 +0000 @@ -1,40 +1,26 @@ -diff --git a/ospf6d/ospf6_spf.c b/ospf6d/ospf6_spf.c -index bfb6df2..04367f0 100644 ---- ospf6d/ospf6_spf.c -+++ ospf6d/ospf6_spf.c -@@ -50,7 +50,9 @@ ospf6_vertex_cmp (void *a, void *b) - struct ospf6_vertex *vb = (struct ospf6_vertex *) b; +diff --git lib/command.c lib/command.c +index 5a13f39..264e0f7 100644 +--- lib/command.c ++++ lib/command.c +@@ -3056,7 +3056,7 @@ DEFUN (config_logmsg, + if ((level = level_match(argv[0])) == ZLOG_DISABLED) + return CMD_ERR_NO_MATCH; - /* ascending order */ -- return (va->cost - vb->cost); -+ if (va->cost != vb->cost) -+ return (va->cost - vb->cost); -+ return (va->hops - vb->hops); +- zlog(NULL, level, ((message = argv_concat(argv, argc, 1)) ? message : "")); ++ zlog(NULL, level, "%s", ((message = argv_concat(argv, argc, 1)) ? message : "")); + if (message) + XFREE(MTYPE_TMP, message); + return CMD_SUCCESS; +diff --git lib/if.c lib/if.c +index b61bdbf..86f754b 100644 +--- lib/if.c ++++ lib/if.c +@@ -664,7 +664,7 @@ connected_log (struct connected *connected, char *str) + strncat (logbuf, inet_ntop (p->family, &p->u.prefix, buf, BUFSIZ), + BUFSIZ - strlen(logbuf)); } - - static int -@@ -320,22 +322,8 @@ ospf6_spf_install (struct ospf6_vertex *v, +- zlog (NULL, LOG_INFO, logbuf); ++ zlog (NULL, LOG_INFO, "%s", logbuf); } - prev = (struct ospf6_vertex *) route->route_option; -- if (prev->hops > v->hops) -- { -- for (ALL_LIST_ELEMENTS (prev->child_list, node, nnode, w)) -- { -- assert (w->parent == prev); -- w->parent = v; -- listnode_add_sort (v->child_list, w); -- } -- listnode_delete (prev->parent->child_list, prev); -- listnode_add_sort (v->parent->child_list, v); -- -- ospf6_vertex_delete (prev); -- route->route_option = v; -- } -- else -- ospf6_vertex_delete (v); -+ assert (prev->hops <= v->hops); -+ ospf6_vertex_delete (v); - - return -1; - } + /* If two connected address has same prefix return 1. */ --- ./files/patch-git-4 2011-04-02 13:13:57.000000000 +0000 +++ ./files/patch-git-4 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -diff --git a/bgpd/bgp_packet.c b/bgpd/bgp_packet.c -index a5f9552..9102add 100644 ---- bgpd/bgp_packet.c -+++ bgpd/bgp_packet.c -@@ -1885,12 +1885,6 @@ bgp_notify_receive (struct peer *peer, bgp_size_t size) - bgp_notify.subcode == BGP_NOTIFY_OPEN_UNSUP_PARAM ) - UNSET_FLAG (peer->sflags, PEER_STATUS_CAPABILITY_OPEN); - -- /* Also apply to Unsupported Capability until remote router support -- capability. */ -- if (bgp_notify.code == BGP_NOTIFY_OPEN_ERR && -- bgp_notify.subcode == BGP_NOTIFY_OPEN_UNSUP_CAPBL) -- UNSET_FLAG (peer->sflags, PEER_STATUS_CAPABILITY_OPEN); -- - BGP_EVENT_ADD (peer, Receive_NOTIFICATION_message); - } - --- ./files/patch-ospf6d 1970-01-01 00:00:00.000000000 +0000 +++ ./files/patch-ospf6d 2011-04-02 13:14:06.000000000 +0000 @@ -0,0 +1,45 @@ +diff -u -r ../quagga-0.99.18_org/ospf6d/ospf6_message.c ./ospf6d/ospf6_message.c +--- ../quagga-0.99.18_org/ospf6d/ospf6_message.c 2011-03-21 14:43:34.000000000 +0100 ++++ ./ospf6d/ospf6_message.c 2011-03-31 17:12:04.000000000 +0200 +@@ -1396,6 +1396,13 @@ + return 0; + } + ++ if (iobuflen == 0) ++ { ++ zlog_debug ("Unable to send Hello on interface %s iobuflen is 0", ++ oi->interface->name); ++ return 0; ++ } ++ + /* set next thread */ + oi->thread_send_hello = thread_add_timer (master, ospf6_hello_send, + oi, oi->hello_interval); +diff -u -r ../quagga-0.99.18_org/zebra/kernel_socket.c ./zebra/kernel_socket.c +--- ../quagga-0.99.18_org/zebra/kernel_socket.c 2011-03-21 10:43:52.000000000 +0100 ++++ ./zebra/kernel_socket.c 2011-03-31 17:38:05.000000000 +0200 +@@ -280,14 +280,19 @@ + sizeof(ifan->ifan_name))); + ifp->ifindex = ifan->ifan_index; + ++ if_get_flags (ifp); ++ if_get_mtu (ifp); ++ if_get_metric (ifp); ++ + if_add_update (ifp); + } + else if (ifp != NULL && ifan->ifan_what == IFAN_DEPARTURE) +- if_delete_update (ifp); +- +- if_get_flags (ifp); +- if_get_mtu (ifp); +- if_get_metric (ifp); ++ { ++ if_get_flags (ifp); ++ if_get_mtu (ifp); ++ if_get_metric (ifp); ++ if_delete_update (ifp); ++ } + + if (IS_ZEBRA_DEBUG_KERNEL) + zlog_debug ("%s: interface %s index %d", --- ./files/patch-ospf6d-log 1970-01-01 00:00:00.000000000 +0000 +++ ./files/patch-ospf6d-log 2011-04-02 13:14:06.000000000 +0000 @@ -0,0 +1,302 @@ +diff -u -r ../quagga-0.99.18_org/ospf6d/ospf6_neighbor.c ./ospf6d/ospf6_neighbor.c +--- ../quagga-0.99.18_org/ospf6d/ospf6_neighbor.c 2011-03-21 10:43:52.000000000 +0100 ++++ ./ospf6d/ospf6_neighbor.c 2011-03-31 17:19:30.000000000 +0200 +@@ -141,12 +141,29 @@ + THREAD_OFF (on->thread_send_lsack); + + XFREE (MTYPE_OSPF6_NEIGHBOR, on); ++ + } ++ ++const char *ospf6_nsm_event_str[] = ++{ ++ "NoEvent", ++ "HelloReceived", ++ "2-WayReceived", ++ "NegotiationDone", ++ "ExchangeDone", ++ "LoadingDone", ++ "AdjOK?", ++ "SeqNumberMismatch", ++ "BadLSReq", ++ "1-WayReceived", ++ "InactivityTimer" ++}; + + static void +-ospf6_neighbor_state_change (u_char next_state, struct ospf6_neighbor *on) ++ospf6_neighbor_state_change (u_char next_state, struct ospf6_neighbor *on, int event) + { + u_char prev_state; ++ char router_id[16]; + + prev_state = on->state; + on->state = next_state; +@@ -159,9 +176,25 @@ + /* log */ + if (IS_OSPF6_DEBUG_NEIGHBOR (STATE)) + { +- zlog_debug ("Neighbor state change %s: [%s]->[%s]", on->name, +- ospf6_neighbor_state_str[prev_state], +- ospf6_neighbor_state_str[next_state]); ++ inet_ntop (AF_INET, &on->router_id, router_id, sizeof (router_id)); ++ zlog_debug ("Neighbor state change %s: [%s]->[%s] (%s)", router_id, ++ ospf6_neighbor_state_str[prev_state], ++ ospf6_neighbor_state_str[next_state], ++ ospf6_nsm_event_str [event]); ++ } ++ ++ /* Optionally notify about adjacency changes */ ++ if (CHECK_FLAG(on->ospf6_if->area->ospf6->flag, OSPF6_LOG_ADJACENCY_CHANGES) && ++ (CHECK_FLAG(on->ospf6_if->area->ospf6->flag, OSPF6_LOG_ADJACENCY_DETAIL) || ++ (next_state == OSPF6_NEIGHBOR_FULL) || (next_state < on->state))) ++ { ++ inet_ntop (AF_INET, &on->router_id, router_id, sizeof (router_id)); ++ zlog_notice("AdjChg: Nbr %s on %s: %s -> %s (%s)", ++ router_id, on->ospf6_if->interface->name, ++ ospf6_neighbor_state_str[prev_state], ++ ospf6_neighbor_state_str[next_state], ++ ospf6_nsm_event_str [event]); ++ + } + + if (prev_state == OSPF6_NEIGHBOR_FULL || next_state == OSPF6_NEIGHBOR_FULL) +@@ -215,7 +248,7 @@ + on->ospf6_if->dead_interval); + + if (on->state <= OSPF6_NEIGHBOR_DOWN) +- ospf6_neighbor_state_change (OSPF6_NEIGHBOR_INIT, on); ++ ospf6_neighbor_state_change (OSPF6_NEIGHBOR_INIT, on, OSPF6_EVENT_HELLO_RECV); + + return 0; + } +@@ -238,11 +271,11 @@ + + if (! need_adjacency (on)) + { +- ospf6_neighbor_state_change (OSPF6_NEIGHBOR_TWOWAY, on); ++ ospf6_neighbor_state_change (OSPF6_NEIGHBOR_TWOWAY, on, OSPF6_EVENT_2WAY); + return 0; + } + +- ospf6_neighbor_state_change (OSPF6_NEIGHBOR_EXSTART, on); ++ ospf6_neighbor_state_change (OSPF6_NEIGHBOR_EXSTART, on, OSPF6_EVENT_2WAY); + SET_FLAG (on->dbdesc_bits, OSPF6_DBDESC_MSBIT); + SET_FLAG (on->dbdesc_bits, OSPF6_DBDESC_MBIT); + SET_FLAG (on->dbdesc_bits, OSPF6_DBDESC_IBIT); +@@ -319,7 +352,7 @@ + } + + UNSET_FLAG (on->dbdesc_bits, OSPF6_DBDESC_IBIT); +- ospf6_neighbor_state_change (OSPF6_NEIGHBOR_EXCHANGE, on); ++ ospf6_neighbor_state_change (OSPF6_NEIGHBOR_EXCHANGE, on, OSPF6_EVENT_NEG_DONE); + + return 0; + } +@@ -347,9 +380,9 @@ + */ + + if (on->request_list->count == 0) +- ospf6_neighbor_state_change (OSPF6_NEIGHBOR_FULL, on); ++ ospf6_neighbor_state_change (OSPF6_NEIGHBOR_FULL, on, OSPF6_EVENT_EXCH_DONE); + else +- ospf6_neighbor_state_change (OSPF6_NEIGHBOR_LOADING, on); ++ ospf6_neighbor_state_change (OSPF6_NEIGHBOR_LOADING, on, OSPF6_EVENT_EXCH_DONE); + + return 0; + } +@@ -370,7 +403,7 @@ + + assert (on->request_list->count == 0); + +- ospf6_neighbor_state_change (OSPF6_NEIGHBOR_FULL, on); ++ ospf6_neighbor_state_change (OSPF6_NEIGHBOR_FULL, on, OSPF6_EVENT_LOAD_DONE); + + return 0; + } +@@ -389,7 +422,7 @@ + + if (on->state == OSPF6_NEIGHBOR_TWOWAY && need_adjacency (on)) + { +- ospf6_neighbor_state_change (OSPF6_NEIGHBOR_EXSTART, on); ++ ospf6_neighbor_state_change (OSPF6_NEIGHBOR_EXSTART, on, OSPF6_EVENT_ADJ_OK); + SET_FLAG (on->dbdesc_bits, OSPF6_DBDESC_MSBIT); + SET_FLAG (on->dbdesc_bits, OSPF6_DBDESC_MBIT); + SET_FLAG (on->dbdesc_bits, OSPF6_DBDESC_IBIT); +@@ -402,7 +435,7 @@ + else if (on->state >= OSPF6_NEIGHBOR_EXSTART && + ! need_adjacency (on)) + { +- ospf6_neighbor_state_change (OSPF6_NEIGHBOR_TWOWAY, on); ++ ospf6_neighbor_state_change (OSPF6_NEIGHBOR_TWOWAY, on, OSPF6_EVENT_ADJ_OK); + ospf6_lsdb_remove_all (on->summary_list); + ospf6_lsdb_remove_all (on->request_list); + for (lsa = ospf6_lsdb_head (on->retrans_list); lsa; +@@ -431,7 +464,7 @@ + if (IS_OSPF6_DEBUG_NEIGHBOR (EVENT)) + zlog_debug ("Neighbor Event %s: *SeqNumberMismatch*", on->name); + +- ospf6_neighbor_state_change (OSPF6_NEIGHBOR_EXSTART, on); ++ ospf6_neighbor_state_change (OSPF6_NEIGHBOR_EXSTART, on, OSPF6_EVENT_SEQ_MISS); + SET_FLAG (on->dbdesc_bits, OSPF6_DBDESC_MSBIT); + SET_FLAG (on->dbdesc_bits, OSPF6_DBDESC_MBIT); + SET_FLAG (on->dbdesc_bits, OSPF6_DBDESC_IBIT); +@@ -467,7 +500,7 @@ + if (IS_OSPF6_DEBUG_NEIGHBOR (EVENT)) + zlog_debug ("Neighbor Event %s: *BadLSReq*", on->name); + +- ospf6_neighbor_state_change (OSPF6_NEIGHBOR_EXSTART, on); ++ ospf6_neighbor_state_change (OSPF6_NEIGHBOR_EXSTART, on, OSPF6_EVENT_BAD_LSREQ); + SET_FLAG (on->dbdesc_bits, OSPF6_DBDESC_MSBIT); + SET_FLAG (on->dbdesc_bits, OSPF6_DBDESC_MBIT); + SET_FLAG (on->dbdesc_bits, OSPF6_DBDESC_IBIT); +@@ -503,7 +536,7 @@ + if (IS_OSPF6_DEBUG_NEIGHBOR (EVENT)) + zlog_debug ("Neighbor Event %s: *1Way-Received*", on->name); + +- ospf6_neighbor_state_change (OSPF6_NEIGHBOR_INIT, on); ++ ospf6_neighbor_state_change (OSPF6_NEIGHBOR_INIT, on, OSPF6_EVENT_1WAY_RECV); + thread_add_event (master, neighbor_change, on->ospf6_if, 0); + + ospf6_lsdb_remove_all (on->summary_list); +@@ -538,7 +571,7 @@ + on->drouter = on->prev_drouter = 0; + on->bdrouter = on->prev_bdrouter = 0; + +- ospf6_neighbor_state_change (OSPF6_NEIGHBOR_DOWN, on); ++ ospf6_neighbor_state_change (OSPF6_NEIGHBOR_DOWN, on, OSPF6_EVENT_INACT_T); + thread_add_event (master, neighbor_change, on->ospf6_if, 0); + + listnode_delete (on->ospf6_if->neighbor_list, on); +diff -u -r ../quagga-0.99.18_org/ospf6d/ospf6_neighbor.h ./ospf6d/ospf6_neighbor.h +--- ../quagga-0.99.18_org/ospf6d/ospf6_neighbor.h 2011-03-21 10:43:52.000000000 +0100 ++++ ./ospf6d/ospf6_neighbor.h 2011-03-31 17:20:15.000000000 +0200 +@@ -107,6 +107,20 @@ + + extern const char *ospf6_neighbor_state_str[]; + ++/* Neighbor event state */ ++#define OSPF6_EVENT_HELLO_RECV 1 ++#define OSPF6_EVENT_2WAY 2 ++#define OSPF6_EVENT_NEG_DONE 3 ++#define OSPF6_EVENT_EXCH_DONE 4 ++#define OSPF6_EVENT_LOAD_DONE 5 ++#define OSPF6_EVENT_ADJ_OK 6 ++#define OSPF6_EVENT_SEQ_MISS 7 ++#define OSPF6_EVENT_BAD_LSREQ 8 ++#define OSPF6_EVENT_1WAY_RECV 9 ++#define OSPF6_EVENT_INACT_T 10 ++ ++extern const char *ospf6_nsm_event_str[]; ++ + + /* Function Prototypes */ + int ospf6_neighbor_cmp (void *va, void *vb); +diff -u -r ../quagga-0.99.18_org/ospf6d/ospf6_top.c ./ospf6d/ospf6_top.c +--- ../quagga-0.99.18_org/ospf6d/ospf6_top.c 2011-03-21 14:43:34.000000000 +0100 ++++ ./ospf6d/ospf6_top.c 2011-03-31 17:23:51.000000000 +0200 +@@ -312,6 +312,60 @@ + return CMD_SUCCESS; + } + ++DEFUN (ospf6_log_adjacency_changes, ++ ospf6_log_adjacency_changes_cmd, ++ "log-adjacency-changes", ++ "Log changes in adjacency state\n") ++{ ++ struct ospf6 *o; ++ o = (struct ospf6 *) vty->index; ++ ++ SET_FLAG(o->flag, OSPF6_LOG_ADJACENCY_CHANGES); ++ return CMD_SUCCESS; ++} ++ ++DEFUN (ospf6_log_adjacency_changes_detail, ++ ospf6_log_adjacency_changes_detail_cmd, ++ "log-adjacency-changes detail", ++ "Log changes in adjacency state\n" ++ "Log all state changes\n") ++{ ++ struct ospf6 *o; ++ o = (struct ospf6 *) vty->index; ++ ++ SET_FLAG(o->flag, OSPF6_LOG_ADJACENCY_CHANGES); ++ SET_FLAG(o->flag, OSPF6_LOG_ADJACENCY_DETAIL); ++ return CMD_SUCCESS; ++} ++ ++DEFUN (no_ospf6_log_adjacency_changes, ++ no_ospf6_log_adjacency_changes_cmd, ++ "no log-adjacency-changes", ++ NO_STR ++ "Log changes in adjacency state\n") ++{ ++ struct ospf6 *o; ++ o = (struct ospf6 *) vty->index; ++ ++ UNSET_FLAG(o->flag, OSPF6_LOG_ADJACENCY_DETAIL); ++ UNSET_FLAG(o->flag, OSPF6_LOG_ADJACENCY_CHANGES); ++ return CMD_SUCCESS; ++} ++ ++DEFUN (no_ospf6_log_adjacency_changes_detail, ++ no_ospf6_log_adjacency_changes_detail_cmd, ++ "no log-adjacency-changes detail", ++ NO_STR ++ "Log changes in adjacency state\n" ++ "Log all state changes\n") ++{ ++ struct ospf6 *o; ++ o = (struct ospf6 *) vty->index; ++ ++ UNSET_FLAG(o->flag, OSPF6_LOG_ADJACENCY_DETAIL); ++ return CMD_SUCCESS; ++} ++ + DEFUN (ospf6_interface_area, + ospf6_interface_area_cmd, + "interface IFNAME area A.B.C.D", +@@ -648,6 +702,15 @@ + if (ospf6->router_id_static != 0) + vty_out (vty, " router-id %s%s", router_id, VNL); + ++ /* log-adjacency-changes flag print. */ ++ if (CHECK_FLAG(ospf6->flag, OSPF6_LOG_ADJACENCY_CHANGES)) ++ { ++ vty_out(vty, " log-adjacency-changes"); ++ if (CHECK_FLAG(ospf6->flag, OSPF6_LOG_ADJACENCY_DETAIL)) ++ vty_out(vty, " detail"); ++ vty_out(vty, "%s", VTY_NEWLINE); ++ } ++ + ospf6_redistribute_config_write (vty); + ospf6_area_config_write (vty); + +@@ -700,6 +763,13 @@ + + install_default (OSPF6_NODE); + install_element (OSPF6_NODE, &ospf6_router_id_cmd); ++ ++ /* "ospf log-adjacency-changes" commands. */ ++ install_element (OSPF6_NODE, &ospf6_log_adjacency_changes_cmd); ++ install_element (OSPF6_NODE, &ospf6_log_adjacency_changes_detail_cmd); ++ install_element (OSPF6_NODE, &no_ospf6_log_adjacency_changes_cmd); ++ install_element (OSPF6_NODE, &no_ospf6_log_adjacency_changes_detail_cmd); ++ + install_element (OSPF6_NODE, &ospf6_interface_area_cmd); + install_element (OSPF6_NODE, &no_ospf6_interface_area_cmd); + } +diff -u -r ../quagga-0.99.18_org/ospf6d/ospf6_top.h ./ospf6d/ospf6_top.h +--- ../quagga-0.99.18_org/ospf6d/ospf6_top.h 2011-03-21 14:43:34.000000000 +0100 ++++ ./ospf6d/ospf6_top.h 2011-03-31 17:24:33.000000000 +0200 +@@ -62,7 +62,9 @@ + struct thread *maxage_remover; + }; + +-#define OSPF6_DISABLED 0x01 ++#define OSPF6_DISABLED 0x01 ++#define OSPF6_LOG_ADJACENCY_CHANGES 0x02 ++#define OSPF6_LOG_ADJACENCY_DETAIL 0x04 + + /* global pointer for OSPF top data structure */ + extern struct ospf6 *ospf6; --- ./files/patch-ospf6d-segfault 1970-01-01 00:00:00.000000000 +0000 +++ ./files/patch-ospf6d-segfault 2011-04-02 13:14:06.000000000 +0000 @@ -0,0 +1,12 @@ +--- ../quagga-0.99.18_org/ospf6d/ospf6_zebra.c 2011-03-21 10:43:52.000000000 +0100 ++++ ospf6d/ospf6_zebra.c 2011-04-02 00:24:49.000000000 +0200 +@@ -132,6 +132,9 @@ + struct interface *ifp; + + ifp = zebra_interface_state_read (zclient->ibuf); ++ if (ifp == NULL) ++ return 0; ++ + if (IS_OSPF6_DEBUG_ZEBRA (RECV)) + zlog_debug ("Zebra Interface state change: " + "%s index %d flags %llx metric %d mtu %d", --- ./files/patch-rtadv 1970-01-01 00:00:00.000000000 +0000 +++ ./files/patch-rtadv 2011-04-11 11:02:18.000000000 +0000 @@ -0,0 +1,13 @@ +--- ../quagga-0.99.18_org/zebra/rtadv.c 2011-04-02 13:22:09.000000000 +0000 ++++ zebra/rtadv.c 2011-04-11 11:01:34.000000000 +0000 +@@ -1388,8 +1388,8 @@ + "Neighbor discovery\n" + "Default router preference\n" + "High default router preference\n" +- "Low default router preference\n" +- "Medium default router preference (default)\n") ++ "Medium default router preference (default)\n" ++ "Low default router preference\n") + { + struct interface *ifp; + struct zebra_if *zif;