{"push_id":719314445,"size":29,"distinct_size":29,"ref":"refs/heads/euro_ix_b","head":"c6f2671a9f2630de726272ddb2311066a6d13499","before":"a90337394008d52a04098e5ec70e69f78b455983","commits":[{"sha":"99063f82608280d0d690b7fd07646067b3084c34","author":{"email":"421a349e05f484e2e703ac57592d01a840ca648c@highwayman.com","name":"Chris Hall"},"message":"Retire \"workqueue\" from bgpd.\n\nThis is a first step in a journey to improve the scheduling of work and\nthe tracking of where time is spent.\n\nThe existing lib/workqueue.c/.h is used in bgpd only for the scheduling\nof the bgp_process() work -- which rescans all the candidate routes for\na given bgp-node and decides whether a change of selection is required.\n\nThis change replaces that by a single queue of bgp-node's waiting to be\nprocessed, which simplifies (inter alia) the queuing of same.\n\nTo support the handling of \"back-ground\" work, this change introduces\nlib/qt_itimer, which provides POSIX interval timers.  This allows a\ntimer to be started when back-ground work starts, and a simple flag\ntest can be used to see when the back-ground time-slot ends.\n\nThe qt_itimer requires the use of \"real-time signals\", so the\nlib/sigevent stuff is also updated by this change.  In passing, when\ncreating a new pthread, sets the parent pthread to mask everything\n(except the hard-cases and the impossible to mask) before creating the\nnew thread, so that it inherits that !  The handling of the various\nclasses of signal has been reviewed and revised.\n\nThe General Scan and the Import Scan no longer use the (legacy) thread\nmechanism, but are handled by the Routeing-Engine background task.  The\ntiming of these operations is now done using POSIX cpu-time clocks.  In\npassing, the intervals for these are now stored in the bgp_master.  The\ntimers used to schedule these are now subject to a little jitter.\n\nThe bgp_table_stats() scan and the bgp_peer_counts() operations also no\nlonger use the (legacy) thread stuff, but time themselves.\n\nThe bgp_table and bgp_node handling has been tweaked to reduce the amount\nof locking and unlocking required, particularly related to the bgp_process()\nstuff... in coming changes it is expected that bgp_nodes etc. will not be\ndestroyed as soon as their use-count falls to zero, but will be garbage\ncollected.\n\nSome tightening of memory management means that less is left hanging\naround on exit.  And counts of bgp_node, adj_in, adj_out and adv objects\nhave been added, so that they can be counted in and counted out.\n\nChanged the qpnexus \"hook\" functions to all take a qpnexus parameter, and\nto all return an int -- so all hook functions now have the same type.\n\nEach qpnexus can now have an interval timer.  Each also now has a\ncurrent signal mask associated with it.  There is a new mechanism to\nchange the signal mask for a qpnexus, which changes either the general\nmask or the pselect mask or both, as required.\n\nThe bgp_table stuff has been tweaked in the hope of speeding it up (a\nlittle).\n\nSome ring (circular list) functions have been added.","distinct":true,"url":"https://api.github.com/repos/GMCH/quagga.euro-ix/commits/99063f82608280d0d690b7fd07646067b3084c34"},{"sha":"f5fafc8672435a8dd1259edd7cfe4f285306f544","author":{"email":"421a349e05f484e2e703ac57592d01a840ca648c@highwayman.com","name":"Chris Hall"},"message":"Add test for qfs_time_secs()","distinct":true,"url":"https://api.github.com/repos/GMCH/quagga.euro-ix/commits/f5fafc8672435a8dd1259edd7cfe4f285306f544"},{"sha":"1229747a8cf2e572b2bd649313bbba0ce8613072","author":{"email":"421a349e05f484e2e703ac57592d01a840ca648c@highwayman.com","name":"Chris Hall"},"message":"Fix counts etc for \"bgp show memory\" command\n\nThe statistics shown by this command had been seriously degraded by the\n(now general) handling of pools of objects.\n\nThis change restores these statistics to a state closer to reality.","distinct":true,"url":"https://api.github.com/repos/GMCH/quagga.euro-ix/commits/1229747a8cf2e572b2bd649313bbba0ce8613072"},{"sha":"c4cd0748915d113c696293a13cb5b284393240d2","author":{"email":"421a349e05f484e2e703ac57592d01a840ca648c@highwayman.com","name":"Chris Hall"},"message":"Change interface for bgpd route-map stuff.\n\nPreviously, passed a bgp-info as the optional extra parameter down into\nthe bgp_routemap.c functions.\n\nWith a coming change to the bgp-info, this no longer works very well, so\nthis change introduces a custome extra parameter to replace the bgp-info\nfor this purpose.\n\nAlso a couple of trivial changes to calm down Eclipse.","distinct":true,"url":"https://api.github.com/repos/GMCH/quagga.euro-ix/commits/c4cd0748915d113c696293a13cb5b284393240d2"},{"sha":"5601e1e21603a59056d590c043b44abc57e0cedf","author":{"email":"421a349e05f484e2e703ac57592d01a840ca648c@highwayman.com","name":"Chris Hall"},"message":"Add the new lib/prfx modules -- unused.","distinct":true,"url":"https://api.github.com/repos/GMCH/quagga.euro-ix/commits/5601e1e21603a59056d590c043b44abc57e0cedf"},{"sha":"e9cd0351de442b03721a6bb7f614cd6eecac4ccb","author":{"email":"421a349e05f484e2e703ac57592d01a840ca648c@highwayman.com","name":"Chris Hall"},"message":"Replace all [AFI][SAFI] arrays by [qafx] ones in bgpd.\n\nThis is a purely mechanical change, replacing all references to the\narrays by macros which convert the AFI/SAFI indexes to a single\nqafx index.\n\nThis is in preparation for incremental replacement of pairs of afi/safi\nparameters by a single qafx_t parameter.\n\nThe objective is to reduce clutter and simplify.","distinct":true,"url":"https://api.github.com/repos/GMCH/quagga.euro-ix/commits/e9cd0351de442b03721a6bb7f614cd6eecac4ccb"},{"sha":"d112fb9f99b9617f17d26191a0260ed2b7de0b69","author":{"email":"421a349e05f484e2e703ac57592d01a840ca648c@highwayman.com","name":"Chris Hall"},"message":"Sweep away afi/safi for bgp/peer level operations.\n\nA step along the journey to replace afi/safi argument pairs by single\n'qafx' argument.\n\nThis is largely mechanical.","distinct":true,"url":"https://api.github.com/repos/GMCH/quagga.euro-ix/commits/d112fb9f99b9617f17d26191a0260ed2b7de0b69"},{"sha":"3c6574f37068d399a7d879f99c1b2b3b07b1daaa","author":{"email":"421a349e05f484e2e703ac57592d01a840ca648c@highwayman.com","name":"Chris Hall"},"message":"More afi/safi bites the dust.\n\nIn particular, eliminate: bgp_node_afi() and bgp_node_safi().","distinct":true,"url":"https://api.github.com/repos/GMCH/quagga.euro-ix/commits/3c6574f37068d399a7d879f99c1b2b3b07b1daaa"},{"sha":"10025abfa5a18deeefb639d5389d47b73b553704","author":{"email":"421a349e05f484e2e703ac57592d01a840ca648c@highwayman.com","name":"Chris Hall"},"message":"Further flushing of afi/safi arguments etc.\n\nIn particular, sweep through OPEN message and Capability handling.\n\nAt the same time, tighten the distinction between the Quagga internal\nafi/safi values and the (real) Internet ones.","distinct":true,"url":"https://api.github.com/repos/GMCH/quagga.euro-ix/commits/10025abfa5a18deeefb639d5389d47b73b553704"},{"sha":"a3eb093a6e9c4f431866fa5e2e89cc8b43ce0409","author":{"email":"421a349e05f484e2e703ac57592d01a840ca648c@highwayman.com","name":"Chris Hall"},"message":"Further replacement of afi/safi by qafx.","distinct":true,"url":"https://api.github.com/repos/GMCH/quagga.euro-ix/commits/a3eb093a6e9c4f431866fa5e2e89cc8b43ce0409"},{"sha":"748d9b495e4d8189dc6f0990ac443123e334d8b5","author":{"email":"421a349e05f484e2e703ac57592d01a840ca648c@highwayman.com","name":"Chris Hall"},"message":"Further replacement of afi/safi by qafx.\n\nIn particular the processing of incoming routes, static and redistributed\nroutes.","distinct":true,"url":"https://api.github.com/repos/GMCH/quagga.euro-ix/commits/748d9b495e4d8189dc6f0990ac443123e334d8b5"},{"sha":"c0e627679c29686eae47de074e9a8410394c2e0a","author":{"email":"421a349e05f484e2e703ac57592d01a840ca648c@highwayman.com","name":"Chris Hall"},"message":"Yet further replacement of afi/safi by qafx.\n\nRemoved the, pro tem, xxx_pq() and xxx_bq() macros... all refrences to\nthe qafx_t arrays in the 'struct peer' and 'struct bgp' now use a\nqafx index directly.\n\nSome further replacement of the odd remaining afi/safi by (the more\nexplicit) qAFI_t/qSAFI_t.","distinct":true,"url":"https://api.github.com/repos/GMCH/quagga.euro-ix/commits/c0e627679c29686eae47de074e9a8410394c2e0a"},{"sha":"b8aef4ce566da1d2bc3344ec6cfe5efef13a1bc6","author":{"email":"421a349e05f484e2e703ac57592d01a840ca648c@highwayman.com","name":"Chris Hall"},"message":"Finally... eliminate afi_t/safi_t from bgpd !","distinct":true,"url":"https://api.github.com/repos/GMCH/quagga.euro-ix/commits/b8aef4ce566da1d2bc3344ec6cfe5efef13a1bc6"},{"sha":"4c1b70f18f0a1f9630246d7ad54201a5f12ac7e5","author":{"email":"421a349e05f484e2e703ac57592d01a840ca648c@highwayman.com","name":"Chris Hall"},"message":"Replace 'struct prefix' by 'prfx_t' in bgpd.\n\nThis change:\n\n  * pushes the difference between MPLS and not MPLS down a level into\n    bgp_table.c.\n\n    Except where routes with different Route Distinguishers must be\n    treated diffenently (mostly for \"show\" operations), the RD is now\n    part of the prfx -- not a separate item.\n\n    This \"declutters\" main-line paths, which no longer need to treat\n    MPLS prefixes as a special case, and no longer need to carry\n    around the separate RD.\n\n  * reduces the size of the bgp_node structure, because it now holds\n    a pointer to a shared prfx_item_t... which helps for Route-Server,\n    where every client has a bgp_node structure for every prefix.\n\n  * moves the MPLS tag/label into the 'struct attr'.\n\n    The tag/label is (effectively) an extension of the Next Hop,\n    which also lives in the 'struct attr'.\n\n    At the same time, carries the label value in the 'struct attr', not\n    the encoding thereof.\n\n    This also \"declutters\" main-line paths, which no longer need to\n    worry about the tag/label and no longer need to carry those\n    around, either.\n\n    The bgp_adj-in and bgp_info structures no longer carry the tag.\n\nSo:\n\n  * most use of 'struct prefix' has been replaced by 'prfx_t'.\n\n    This generates quite a few changes, but mostly essentially\n    mechanical.  Where prefixes are required for filters and\n    route-maps and such, the 'prfx_t' is cast to a 'struct prefix',\n    knowing that the 'struct prefix' will not, in fact, be changed.\n\n  * the handling of NLRI in incoming UPDATE messages has been\n    generalised, so that the (smallish) differences between simple\n    and MPLS prefix/tag are less intrusive.\n\n    bgp_mplsvpn.c now only contains a few \"show\" commands.\n\n  * bgp_table.c has been worked over again, so that the handling of\n    RD is explicit at this level.\n\n    For an MPLS (not \"simple\") table there are two levels, the top\n    level being an AVL tree by RD *value*.\n\n    Many operations carry the RD selection in the prf->rdi field, so\n    that the MPLS-ness is opaque to the higher levels.  A few\n    functions are restructed to the one RD, so operate in the RD\n    \"sub-tree\".  A few operations allow the caller to process prefixes\n    in all RDs or just one.\n\n    To support this and to simplify some tree-walking, each node\n    carries its relationship to its parent, and the root of a tree or\n    a sub-tree is so marked, and points at the parent tree or RD.\n    (So node->parent == NULL no longer signals \"root\" !)\n\n  * lib/prfx.c has been extended, in particular to handle the\n    conversion to/from string forms and to support decoding/encoding\n    of \"raw\" form.\n\n    The conversion to string, in particular, sweeps away all older\n    inet_ntop() and inet_ntoa() use.\n\n  * lib/stream.c now has a few prfx functions.\n\n  * NLRI are checked as early as possible for valid \"framing\", and\n    framing errors are fatal, session-wise.","distinct":true,"url":"https://api.github.com/repos/GMCH/quagga.euro-ix/commits/4c1b70f18f0a1f9630246d7ad54201a5f12ac7e5"},{"sha":"2722fdf19e715eef4b0c2c64153b1e44bd2bac04","author":{"email":"421a349e05f484e2e703ac57592d01a840ca648c@highwayman.com","name":"Chris Hall"},"message":"Replace peer_sort() by peer->sort in bgpd.\n\nThe 'sort' of a peer is used frequently during the processing of routes.\nThis property depends on a number of configuration settings, but is\nunchanging while a session is up -- since a change of 'sort triggers a\nrestart !  So it makes no sense to calculate the 'sort' each time it is\nneeded.\n\nIn the process, some configuration handling has been cleaned up, and the\n'sort' dependent configuration made a little more explicit.","distinct":true,"url":"https://api.github.com/repos/GMCH/quagga.euro-ix/commits/2722fdf19e715eef4b0c2c64153b1e44bd2bac04"},{"sha":"49b5a3ff5887a29338ac0fd743fddab67370a7c8","author":{"email":"421a349e05f484e2e703ac57592d01a840ca648c@highwayman.com","name":"Chris Hall"},"message":"Introduce 'peer_item_t' in bgpd for lists of peers.\n\nFirst step: replace bgp->peer list by bgp->all_peers.\n\nThis step does not make any material change... the implementation of\nthe list of all peers is changed, not what it does or how it is used.\n\nPart of a number of steps to more finely divide work.","distinct":true,"url":"https://api.github.com/repos/GMCH/quagga.euro-ix/commits/49b5a3ff5887a29338ac0fd743fddab67370a7c8"},{"sha":"a29d46b97520f437d738ef21233c7c773bddcd02","author":{"email":"421a349e05f484e2e703ac57592d01a840ca648c@highwayman.com","name":"Chris Hall"},"message":"Replace the bgpd 'group' members list handling.\n\nThis step removes one 'struct listnode' list from bgpd.\n\nAlso, more clearly distinguish 'peer' from 'group-member' when handling\nsame.\n\nThis is largely a mechanical change.","distinct":true,"url":"https://api.github.com/repos/GMCH/quagga.euro-ix/commits/a29d46b97520f437d738ef21233c7c773bddcd02"},{"sha":"c51ba8002d1cd1dcaab5183f48cdaff3a09e627b","author":{"email":"421a349e05f484e2e703ac57592d01a840ca648c@highwayman.com","name":"Chris Hall"},"message":"Retire the 'struct peer_group' and replace by a simpler object.\n\nThe bgpd 'struct peer_group' was a small structure to which the actual\ngroup-configuration was attached, and which had the base of the\nlist of group-members.  The lifetime of this object and the lifetime\nof the group-configuration were a little out of step.\n\nSimplest solution was to do away with the 'struct peer_group', so that\nthe group is represented just by the group-configuration.  However,\nit is handy to be able to clearly distinguish when the \"group-ness\"\nis an issue -- so there is now a pseudo 'struct peer_group'.\n\nSmall further simplification here... the peer->group pointer is now\nset *only* for real peers, and signals that the peer is a group-member\nin at least one afi/safi.","distinct":true,"url":"https://api.github.com/repos/GMCH/quagga.euro-ix/commits/c51ba8002d1cd1dcaab5183f48cdaff3a09e627b"},{"sha":"8abc314da11054e7b1de5f2ff4782fc7cc025bb0","author":{"email":"421a349e05f484e2e703ac57592d01a840ca648c@highwayman.com","name":"Chris Hall"},"message":"Rename the peer->host to peer->name in bgpd 'struct peer'\n\nThis more accurately describes what this field is !","distinct":true,"url":"https://api.github.com/repos/GMCH/quagga.euro-ix/commits/8abc314da11054e7b1de5f2ff4782fc7cc025bb0"},{"sha":"b00be42f55f1f9138a0622a98ab55914f6f229ab","author":{"email":"421a349e05f484e2e703ac57592d01a840ca648c@highwayman.com","name":"Chris Hall"},"message":"Refactor bgp Peer and Group State\n\nThe main objective here is to simplify route procesing:\n\n  * provide each RIB with a list of all the peers to which updates\n    should be sent.\n\n    This is the table->peers_out vector (kept in peer name order, for\n    future reference).  When a peer is Active and not SHUTDOWN in a given\n    afi/safi, it will appear in this vector.\n\n    This means that:\n\n       * for Main RIB, do not have to skip past RS-Clients when looking for\n         peers to update.\n\n       * for RS-Clients this simplifies the handling of Real RS-Clients and\n         RS-Client Groups -- in both cases, the peers to receive routes are\n         on the peers_out list.\n\n       * in all cases, do not need to step past peers in some other afi/safi,\n         or peers which are SHUTDOWN.\n\n  * provide qafx_set for peers which are \"up\", and peers which are ready to\n    be sent updates -- the peer->af_up and peer->af_out.\n\n    These allow for a single test in various places, where previously had to\n    test for pEstablished and then other state.\n\n  * improve the handling of new RS-Client RIBs, so do not first populate and\n    later announce -- but by delaying populating the RS-Client RIB to the\n    last moment, the populate step automatically does the initial announce.\n\n  * simplify the creation/destruction of RS-Client RIBs... all the detail is\n    now in bgp_peer_rib_check() and bgp_announce().\n\nAlso:\n\n  * implement sets of afi/safi as qafx_set_t (bit-maps) instead of arrays\n    of bool !\n\n    In a number of places this eliminates walking arrays of bool looking for\n    existence of one or more members of a set.\n\n    The OPEN message handling and the rest of the state handling are now\n    better aligned !\n\n  * cleaned up the handling of PEER_FLAG_DONT_CAPABILITY, the run-time\n    suppression of capabilities and the overriding of capabilities, so that it\n    is clearer what these imply in terms of advertised/received capabilities.\n    (Not that any of these happen much in practice !)\n\n  * debounces creation of peer->sync and bgp->rib structures, until there\n    is a need for same -- so not create one for every possible afi/safi, at\n    all times.\n\n  * similarly the bgp->route and bgp->aggregate ribs.\n\n  * killed off Dynamic Capabilities -- which (probably) did not work, and\n    (certainly) were some way behind the last (but now several years expired)\n    draft !\n\n  * killed off the turning of of Soft Inbound Reconfiguration.\n\n  * in various places seek to clarify when is dealing with a Peer, a Group or\n    both.\n\n  * cleaned up the handling of peer->filter stuff -- to eliminate a lot of\n    repeated fragments of code to set/clear/etc. this state.\n\n==bgpd/bgp_advertise.c\n==bgpd/bgp_advertise.h\n\n  * discard bgp_sync_init() and bgp_sync_start()\n\n  * expose bgp_sync_reset() for \"just in time\" creation\n\n==bgpd/bgp_aspath.c\n\n  * stream_free() now returns NULL !\n\n==bgpd/bgp_attr.c\n\n  * bgp_packet_attribute() did not need a 'bgp' argument, and certainly had\n    no business trying to use the 'bgp_default()' !!\n\n==bgpd/bgp_common.h\n\n  * add qafx_sin(), qafx_sset() and qafx_sunset() for qafx sets\n\n==bgpd/bgp_dump.c\n\n  * change bgp_dump_routes_index_table() to count the number of entries it\n    creates in the index -- rather than use the (now non-existent)\n    bgp->all_peers_count.\n\n==bgpd/bgp_mplsvpn.c\n==bgpd/bgp_nexthop.c\n==bgpd/bgp_open.c\n\n  * small changes caused by changes to qafx sets in the peer structure.\n\n==bgpd/bgp_open_state.c\n\n  * the open-state stuff was using qafx sets, and now has a cleaner join with\n    the peer state, which also now uses qafx sets.\n\n  * clear up what it means to PEER_FLAG_DONT_CAPABILITY and to suppress\n    capabilities if the neighbor refuses same.\n\n  * ignore PEER_FLAG_DYNAMIC_CAPABILITY\n\n==bgpd/bgp_packet.c\n==bgpd/bgp_packet.h\n\n  * discard Dynamic Capability broken code\n\n  * cope with absent peer->sync[] entries\n\n==bgpd/bgp_peer.c\n==bgpd/bgp_peer.h\n\n  * added RMAP_UN_SUP and RMAP_DEFAULT, and replaced peer->filter->usmap and\n    peer->default_rmap by entries in the more general peer->filter->map.\n\n  * added:  peer_cap_t      -- for peer->cap\n            peer_af_cap_t   -- for peer->af_cap[]\n            peer_flag_t     -- for peer->flags\n            peer_af_flag_t  -- for peer->af_flags[]\n            peer_sflag_t    -- for peer->sflags\n            peer_af_sflag_t -- for peer->af_sflags[]\n            peer_config_t   -- for peer->configs\n\n  * replaced arrays of 'bool' by 'qafx_set_t':\n\n      af_group[]        -> af_group\n      afc[]             -> af_act\n      afc_nego[]        -> af_neg\n      afc_adv[]         -> af_adv\n      afc_rcv[]         -> af_rcv\n      nsf[]             -> af_nsf\n\n  * added the qafx sets:\n\n      af_ribbed         -- peer present in the relevant RIB's peer_out list\n      af_up             -- peer af_act, not SHUTDOWN and pEstablished\n      af_out            -- af_up and ready to send updates to\n      af_rs_owner       -- is owner of peer->rib RS-Client RIB\n\n  * added functions:\n\n     - bgp_peer_refresh_in()    -- do Route Refresh if can, otherwise restart\n\n     - bgp_peer_new_real()      -- replaces bgp_peer_create()\n\n     - bgp_peer_activate()      -- was peer_activate in bgpd.c/.h\n     - bgp_peer_deactivate()    -- was peer_deactivate in bgpd.c/.h\n\n     - bgp_peer_no_members()    -- check for no members of group in afi/safi\n\n     - bgp_peer_make_active()   -- activate, enable or restart\n     - bgp_peer_clear_active()  -- de-activate, restart or down\n\n     - bgp_peer_rib_check()     -- sort out state of peer->rib[] etc.\n\n     - bgp_peer_is_group()      -- was peer_is_group() in bgpd.c\n\n     - bgp_peer_flag_modify()   -- replaces peer_flag_set() and\n                                            peer_flag_unset() late of bgpd.c\n     - bgp_peer_af_flag_modify()   replaces peer_af_flag_set() and\n                                            peer_af_flag_unset()\n                                            peer_af_flag_modify() late of bgpd.c\n\n     - peer_global_config_reset()  -- from bgpd.c\n     - peer_af_config_reset()   -- replaces peer_af_flag_reset() late of bgpd.c\n\n     - bgp_peer_vec_add()       -- add peer/group to vector of same\n     - bgp_peer_vec_remove()    -- remove peer/group from vector of same\n\n                                   used for the bgp_table->peers_out list.\n\n     - peer_filter_dlist_set()  -- set/clear peer->filter[].dlist\n     - peer_filter_plist_set()  -- set/clear peer->filter[].plist\n     - peer_filter_aslist_set() -- set/clear peer->filter[].aslist\n     - peer_filter_rmap_set()   -- set/clear peer->filter[].map\n\n     - peer_filter_orf_plist_unset()    -- clear peer->orf_plist[]\n\n     - peer_filter_free()       -- clear all peer->filter[] and ->orf_plist[]\n\n  * bgp_session_has_established() changed to use the qafx sets, etc.\n\n  * removed bgp_peer_shutdown() -- deletion of peer explicitly sets SHUTDOWN.\n\n  * bgp_peer_new() and bgp_peer_new_real() more clearly distinguish the\n    initialisation for Real Peer.\n\n  * bgp_peer_delete() also a little clearer about Real Peer.  Early on, sets\n    SHUTDOWN, and for Real Peer ensures the peer is \"down\".  The clean-up of\n    RS-Client RIB, the detaching from any Group and the clearing away of\n    filters etc. are now dealt with by the general peer_af_config_reset().\n\n  * bgp_peer_group_join() is moved here from bgpd.c\n\n    This looks after any change to the 'sort' of the group being joined to.\n\n  * bgp_peer_group_leave() is moved here from bgpd.c\n\n    Also looks after any change to the 'sort' of the group being left.\n\n  * peer_af_config_reset() looks after:\n\n      - clearing af_act for the afi/safi\n\n      - unbinding from group in the afi/safi (if any), if unbinds from group\n        entirely does peer_global_config_reset().\n\n      - the peer->rib[]\n\n  * bgp_peer_can_start() and bgp_peer_can_enable() encapsulate the combination\n    of states which allow these actions.\n\n  * bgp_peer_change_status() clears af_up and af_out on the way out of\n    pEstablished.\n\n==bgpd/bgp_route.c\n==bgpd/bgp_route.h\n\n  * replace bgp_announce_route() and bgp_announce_route_all() by bgp_announce()\n\n    For Real RS-Clients with their own RIB, this is where the RS-RIB is created\n    and populated when required -- which does the announce-all-known-routes at\n    the same time.\n\n  * add bgp_create_rsclient_rib(), which creates an empty RIB, sets the 'owner'\n    and adds the owner to the bgp->rs_clients list.\n\n  * bgp_announce_check() can now assume that the destination peer is a (real)\n    not-RS-Client peer, and that DISABLE_BGP_ANNOUNCE has been dealt with.\n\n  * bgp_announce_check_rsclient() can assume that the destination is a (real)\n    RS-Client, and that DISABLE_BGP_ANNOUNCE has been dealt with.\n\n  * bgp_process_announce_selected(), bgp_process_main() and\n    bgp_process_rsclient() are all replaced by bgp_process_route().\n\n    This is largely because the RIB carries the list of peers to be updated,\n    no matter what sort of RIB it is... also the decision to update the Kernel\n    now requires only the 'fib' flag, also in the RIB.\n\n    Further, the 'af_up' qafx set combines \"negotiated\" and \"Established\".\n\n  * bgp_process_now() no longer needs to choose between _main() and _rsclient().\n\n  * bgp_update() now processes the afi/safi specific list of RS-Clients.\n\n  * bgp_withdraw() ditto.\n\n  * bgp->route and bgp->aggregate tables are created only when they are\n    required.\n\n  * bgp_announce_route() is renamed bgp_announce()\n\n    This sets the 'af_out' for the qafx, which will enable further updates\n    for the peer.\n\n    For RS-Client, if a new RS-RIB is required, it is created and populated\n    here... which will implicitly announce everything which is added to the\n    table.\n\n    Otherwise, will walk the RIB and announce all routes to the peer.\n\n    bgp_announce_route_all() has been removed -- when peer goes pEstablished,\n    it will bgp_announce() for all 'af_up' afi/safi.\n\n  * added bgp_create_rsclient_rib() to create RS-RIB, set the owner and add the\n    RIB to the bgp->rs_clients list.\n\n  * bgp_static_update() now processes the afi/safi specific list of RS-Clients.\n\n==bgpd/bgp_routemap.c\n\n  * added bgp_route_map_update_conf() to do the work of updating a given peer\n    of group-conf.\n\n    reduced clutter because the Unsuppress and Default route-maps are now\n    handled as RMAP_UN_SUP and RMAP_DEFAULT -- same like the other route-maps.\n\n    Then bgp_route_map_update() now has simple loops for peers and groups, and\n    then (as before) loops for \"network\" and \"redistribute\" maps.\n\n==bgpd/bgp_session.c\n\n  * bgp_session_enable() fixed so that PEER_FLAG_OVERRIDE_CAPABILITY and\n                                       PEER_FLAG_STRICT_CAP_MATCH are now\n                                                          actually implemented !\n\n==bgpd/bgp_table.c\n==bgpd/bgp_table.h\n\n  * added the 'peers_out' vector to the 'struct bgp_table'\n\n    This records, in name order, all the (real) peers which are Active and not\n    SHUTDOWN in the afi/safi, and for whom wish to send updates from the\n    table in question.\n\n    This is used so that the update processing need not worry about irrelevant\n    peers !\n\n  * added the 'fib' flag to the 'struct bgp_table', so that the decision to\n    send routes to the Kernel is much simplified.\n\n  * added functions:\n\n      bgp_table_option_no_fib() -- to update 'fib' flag on change of the\n                                   global BGP_OPT_NO_FIB flag.\n\n      bgp_table_peer_add()      -- for the table's 'peers_out' list.\n      bgp_table_peer_remove()\n      bgp_table_peer_sweep()\n\n  * changed functions to treat NULL table as an empty table...\n\n    ...this helps where tables are not created until they are required, and so\n       a missing table is and empty one !\n\n==bgpd/bgp_vty.c\n\n  * replace many int returns by cmd_ret_t for clarity\n\n  * make peer_address_self_check() return a bool !\n\n  * make it clear that bgp_vty_return() maps BGP_SUCCESS -> CMD_SUCCESS.\n\n  * BGP_ERR_PEER_GROUP_MEMBER_EXISTS -- applies to more than just \"activate\",\n    so modified the error message.\n\n  * improved error reporting in \"router bgp <asn> view <view>\"\n\n  * replace: bgp_flag_set() by bgp_vty_flag_set()\n             bgp_flag_unset() by bgp_vty_flag_unset()\n\n    throughout\n\n  * update peer_flag_modify_vty() to take peer_flag_t and bool parameters,\n    and to use bgp_peer_flag_modify() instead of _set() and _unset().\n\n  * simplify: peer_rsclient_set_vty() and peer_rsclient_unset_vty()\n\n    The heavy lifting is now done in bgp_peer_af_flag_modify().  The special\n    restriction -- that a Group may not be set RS-Client if it has one or\n    more members -- is still dealt with here.\n\n  * change 'direct' to 'rmt' in peer_route_map_set_vty() and _unset_vty().\n\n  * change peer_unsuppress_map_set_vty() and peer_unsuppress_map_unset_vty()\n    to use peer_route_map_set() and _unset() for RMAP_UN_SUP.\n\n  * bgp_show_summary() uses the new bgp_count_of_peers() and _groups() to count\n    things relevant to the afi/safi in question.\n\n    It is hoped that the result is more \"accurate\".\n\n  * bgp_show_peer() reports \"PEER_FLAG_DONT_CAPABILITY\" and (separately) the\n    suppression of capabilities if the far end rejected same (!).\n\n    Uses the various qafx_set_t in place of the arrays of bool.\n\n  * bgp_show_rsclient_summary() can now walk the list of RS-Clients for the\n    relevant afi/safi.\n\n==bgpd/bgpd.c\n==bgpd/bgpd.h\n\n  * removed bgp_master->bgp_count -- easier to get count when need it...\n\n    ... so added bgp_count().\n\n  * removed the bgp->main_peers list -- the Main RIB now contains a list of\n    all peers to announce routes to.\n\n  * removed all_peers_count and groups_count -- see bgp_count_of_peers()\n                                                and bgp_count_of_groups()\n\n    the counts are not used very often, and keeping same up to date is a pain.\n\n  * dropped Dynamic Capability stuff -- #undef BGP_MSG_CAPABILITY\n\n  * created bgp_err_t typedef and turned BGP_ERR_xxx into an enum\n\n  * replaced:\n\n      - bgp_flag_set()   by  bgp_vty_flag_set()\n      - bgp_flag_unset() by  bgp_vty_flag_unset()\n\n    which simplifies their use in comnand functions.\n\n  * clean up returns for many functions:  int -> bgp_err_t\n                                          int -> bool\n\n    for clarity.\n\n  * some functions moved to bgp_peer.c/.h\n\n     - peer_activate()          -> bgp_peer_activate()\n     - peer_deactivate()        -> bgp_peer_deactivate()\n     - peer_flag_set()          -> bgp_peer_flag_modify()\n     - peer_flag_unset()        -> ditto\n     - peer_af_flag_set()       -> bgp_peer_af_flag_modify()\n     - peer_af_flag_unset()     -> ditto\n     - peer_af_flag_modify()    -> ditto\n     - peer_is_group()          -> bgp_peer_is_group()\n\n     - peer_global_config_reset()\n     - peer_af_flag_reset()\n\n  * functions removed:\n\n      - peer_rsclient_active()  -- no longer relevant\n      - peer_rsclient_unset()   -- replaced by bgp_peer_rib_check()\n\n      - peer_unsuppress_map_set()       ) now treated as another RMAP_xxx\n      - peer_unsuppress_map_unset()     )\n\n  * supports the 'fib' flag in the bgp_table.\n\n    all the reasons to, and not to, update the Kernel FIB are now carried by\n    the 'fib' flag in every bgp_table...  which simplifies update handling,\n    but has to be wired up to all places which affect the state !\n\n  * many functions updated to return explict bgp_err_t and BGP_SUCCESS.\n\n  * removed peer_group_active() -- replaced by direct test of af_group set\n       also peer_active()       -- af_act set\n        and peer_active_nego()  -- af_neg set\n\n  * removed peer_cmp() -- no longer required -- see bgp_peer_item stuff.\n\n  * replace manual setting/clearing/copying filter settings, by calls to the\n    new peer_filter_xxx_set() functions... which cuts out a lot of clutter.\n\n  * fiddling about with peer->rib[] for RS-Clients is now handled by the\n    bgp_peer_rib_check() -- so binding and unbinding groups is simplified.\n\n  * the bgp->rib[], bgp->route[] and bgp_aggregate[] tables are created\n    when they are required -- so not created at bgp_create() time.\n\n  * reworked -- for clarity (one hopes):\n\n      - bgp_lookup(), bgp_lookup_by_name() and bgp_get()\n\n      - peer_default_originate_set() and peer_default_originate_unset()\n\n      - peer_do_allowas_in_set() and peer_do_allowas_in_unset()\n\n   * simplify:  peer_distribute_set(), peer_distribute_unset()\n                                                    and peer_distribute_update()\n\n      - use new peer_filter_dlist_set() function to change state\n\n      - break out peer_distribute_update_conf() to handle updating a peer or\n        group-conf...  so peer_distribute_update() has two simple loops.\n\n   * similarly: peer_prefix_list_set(), peer_prefix_list_unset\n\n   * similarly: peer_aslist_set(), peer_aslist_unset() and peer_aslist_update()\n\n   * similarly: peer_aslist_set(), peer_aslist_unset() and peer_aslist_update()\n\n   * similarly: peer_route_map_set() and peer_route_map_unset()\n\n     Also, these are extended to cope with RMAP_UN_SUP as well\n     (but not RMAP_DEFAULT).\n\n   * remove: peer_unsuppress_map_set() and peer_unsuppress_map_unset()\n\n     These are now handled as RMAP_UN_SUP.\n\n==lib/misc.h\n\n  * changed BIT() to return a ullong\n\n==lib/plist.c\n\n  * added comment\n\n==lib/routemap.c\n\n  * route_map_lookup_by_name() now accepts NULL name and return NULL\n\n==lib/stream.c\n==lib/stream.h\n\n  * stream_free() now returns NULL -- for convenience\n\n  * stream_fifo_free() now accepts and returns NULL -- for convenience\n\n==lib/vector.h\n\n  * added missing 'extern's\n\n==tests/bgp_capability_test.c\n\n  * skipped out Dynamic Capability tests\n\n  * updated to use peer->af_act, peer->af_neg, and bgp->all_peers list.\n\n==tests/bgp_mp_attr_test.c\n\n  * updated to use peer->af_act, peer->af_neg, and bgp->all_peers list.","distinct":true,"url":"https://api.github.com/repos/GMCH/quagga.euro-ix/commits/b00be42f55f1f9138a0622a98ab55914f6f229ab"}]}