| Age | Commit message (Collapse) | Author | 
|---|
|  | BGP was ignoring nexthop info for static and other redistributed
routes for IPv6.  Build extra attribute info to store the nexthop.
See also:
  https://bugzilla.vyatta.com/show_bug.cgi?id=6073 | 
|  | this fixes commit b881c7074bb698aeb1b099175b325734fc6e44d2 | 
|  | bgp_bind_address is replaced with sockunion_bind. | 
|  | if update-source was given as interface name, bgpd was unconditionally
trying to bind to an IPv4 address from that interface.
change function to find the best-matching (number of address bits)
same-family address on the interface. | 
|  |  | 
|  | To set the TOS bits on TCP connections, platforms that restrict
capabilities need the priv level to be raised before the sockopt
is set, and this requires the ZCAP_NET_ADMIN priv.
* bgp_main.c: update _caps_p to include ZCAP_NET_ADMIN
* bgp_network.c
  * bgp_connect(): request ZPRIVS_RAISE/ZPRIVS_LOWER
  * bgp_listener(): request ZPRIVS_RAISE earlier | 
|  |  | 
|  | * bgp_attr.c (bgp_attr_originator_id, bgp_attr_cluster_list): provide
  required arguments to bgp_attr_malformed() | 
|  | * bgp_attr.c
  * bgp_attr_aggregator(): check Optional/Transitive flag bits | 
|  | Commit 05a4936b713b9882171d0f7fb20b8439df23939e fixed some of the
attributes involved, but not all. This commit should do it.
* bgp_attr.c
  * bgp_attr_originator_id()
  * bgp_attr_cluster_list()
  * bgp_mp_reach_parse()
  * bgp_mp_unreach_parse() | 
|  | Some of the recent attribute flags/length checks copied from QRE use
bgp_notify_send_with_data() directly, but master branch assumes
using bgp_attr_malformed().
* bgp_attr.c
  * bgp_attr_med()
  * bgp_attr_local_pref()
  * bgp_attr_atomic()
  * bgp_attr_originator_id()
  * bgp_attr_cluster_list()
  * bgp_mp_reach_parse()
  * bgp_mp_unreach_parse() | 
|  | * bgp_attr.[ch]
  * bgp_mp_reach_parse(): add extra arguments and a uniform flag
    check block
  * bgp_mp_unreach_parse(): idem
  * bgp_attr_parse(): provide extra arguments
* bgp_mp_attr_test.c
  * parse_test(): justify respective calls | 
|  |  | 
|  | * bgp_attr.c
  * bgp_attr_cluster_list(): accept extra argument, add checks for
    "optional", "transitive" and "partial" bits, log each error
    condition independently
  * bgp_attr_parse(): provide extra arguments | 
|  | * bgp_attr.c
  * bgp_attr_originator_id(): accept extra argument, add checks for
    "optional", "transitive" and "partial" bits, log each error
    condition independently
  * bgp_attr_parse(): provide extra arguments | 
|  | IPv6 supports the same concept of differentiated service for routing
protocols as IPv4, but like too many things, the standards committee
decided that having two names for the same thing wasn't good enough and
introduced a third more generic term transport class.
The socket option to set transport class works the same as IPv4, but the
arguments are different.
* lib/sockopt.[ch]
  * setsockopt_ipv6_tclass(): new function
* bgpd/bgp_network.c
  * bgp_connect(): set socket option
  * bgp_listener(): set socket option
* ospf6d/ospf6_network.c
  * ospf6_set_transport_class(): new function
  * ospf6_serv_sock(): set socket option
* ripngd/ripngd.c
  * ripng_make_socket(): set socket option | 
|  | Commit 2febf323411c1aed9d7694898f852ce2ef36a7e5 assumed every flag
bit except optional/transitive/partial unset, which at times could
not be true for "extended length" bit.
* bgp_attr.c
  * bgp_attr_origin(): exclude BGP_ATTR_FLAG_EXTLEN from comparison
  * bgp_attr_nexthop(): idem
  * bgp_attr_med(): idem
  * bgp_attr_local_pref(): idem
  * bgp_attr_atomic(): idem | 
|  | "While setting up a testbed, I ran across a little problem in the
parsing of the "graceful restart" BGP capability that resulted in
Quagga not actually activating it for the peer in question - when
the peer sent a single AFI/SAFI block."
* bgp_open.c
  * bgp_capability_restart(): actually process the last AFI/SAFI block | 
|  | * bgp_attr.c
  * bgp_attr_parse(): provide extra argument to bgp_attr_aggregator()
  * bgp_attr_local_pref(): use bgp_notify_send_with_data()
  * bgp_attr_atomic(): idem
  * bgp_attr_aggregator(): idem
Conflicts:
	bgpd/bgp_attr.c | 
|  | Do not check each of the Optional/Transitive/Partial attribute
flag bits, when their only valid combination is known in advance,
but still perform bit-deep error message logging. This change
assumes unused (low-order) 4 bits of the flag octet cleared.
* bgp_attr.c
  * bgp_attr_origin(): rewrite check
  * bgp_attr_nexthop(): idem
  * bgp_attr_med(): idem
  * bgp_attr_local_pref(): idem
  * bgp_attr_atomic(): idem
Conflicts:
	bgpd/bgp_attr.c | 
|  |  | 
|  | ORIGIN handling function used to have "partial" bit check and recent
commits added it for NEXT_HOP, MULTI_EXIT_DISC and ATOMIC_AGGREGATE
cases. This commit adds "partial" check for AS_PATH and LOCAL_PREF
cases, which should leave attributes 1 through 6 inclusive completely
covered with attribute flags checks.
* bgp_attr.c
  * bgp_attr_origin(): use bit-by-bit checks for better diagnostics
  * bgp_attr_aspath(): add flag check
  * bgp_attr_local_pref(): idem
Conflicts:
	bgpd/bgp_attr.c | 
|  | * lib/prefix.h
  * IPV4_CLASS_DE(): new helper macro
* bgp_attr.c
  * bgp_attr_nexthop(): add check for "partial" bit, refresh flag error
    reporting, explain meaning of RFC4271 section 6.3 and implement it
Conflicts:
	bgpd/bgp_attr.c | 
|  | - SAFI value 3 is reserved.  It was assigned by RFC 2858 for a use
  that was never fully implemented, so it is deprecated by this
  document.
* zebra.h: rename macro
* bgp_fsm.c: (bgp_graceful_restart_timer_expire,
  bgp_graceful_stale_timer_expire, bgp_stop, bgp_establish): update
* bgpd.c: (peer_nsf_stop): update
* bgp_open.c: (bgp_capability_vty_out): SAFI 3 isn't a recognized case
  any more | 
|  | (with resolved conflict in bgpd/bgp_packet.c)
Two macros resolving to the same integer constant broke a case block and
a more thorough merge of BGP_SAFI_VPNV4 and BGP_SAFI_VPNV6 was
performed.
* bgpd.h: MPLS-labeled VPN SAFI is AFI-independent, switch to single
* macro
* bgp_capability_test.c: update test data
* bgp_mp_attr_test.c: idem
* bgp_route.c: (bgp_maximum_prefix_overflow, bgp_table_stats_vty) update
  macro and check conditions (where appropriate)
* bgp_packet.c: (bgp_route_refresh_send, bgp_capability_send,
  bgp_update_receive, bgp_route_refresh_receive): idem
* bgp_open.c: (bgp_capability_vty_out, bgp_afi_safi_valid_indices,
  bgp_open_capability_orf, bgp_open_capability): idem
* bgp_attr.c: (bgp_mp_reach_parse, bgp_packet_attribute,
  bgp_packet_withdraw): idem | 
|  | * bgpd.h: change value of BGP_SAFI_VPNV6 to 128 (RFC4659, BZ#659)
* bgp_route.c: (bgp_table_stats_vty) fix length argument to strncmp() | 
|  | * bgp_debug.c (bgp_notify_open_msg, bgp_notify_update_msg,
  bgp_notify_cease_msg, bgp_notify_capability_msg): add messages for
  "unspecific" subcode. | 
|  |  | 
|  |  | 
|  | * bgp_attr.c
  * bgp_attr_atomic(): accept extra argument, add checks for
    "optional", "transitive" and "partial" bits, log each error
    condition independently
  * bgp_attr_parse(): provide extra argument | 
|  | * bgp_attr.c
  * bgp_attr_med(): add checks for "optional", "transitive" and
    "partial" bits, log each error condition independently | 
|  | * bgp_attr.c
  * bgp_attr_local_pref(): accept extra argument, add checks for
    "optional" and "transitive" bits, log each error condition
    independently
  * bgp_attr_parse(): provide extra argument | 
|  | * bgp_packet.c
  * bgp_notify_send_with_data(): add calls to zlog_info() | 
|  |  | 
|  | This vulnerability (CERT-FI #513254) was reported by CROSS project.
They have also suggested a fix to the problem, which was found
acceptable.
The problem occurs when bgpd receives an UPDATE message containing
255 unknown AS_PATH attributes in Path Attribute Extended Communities.
This causes a buffer overlow in bgpd.
* bgp_ecommunity.c
  * ecommunity_ecom2str(): perform size check earlier | 
|  | Contains BGP fixes:
- set extcommunity crash: tihs patch tries to make the refcounting more robust
  but does not fully solve the problem, sadly.
- BGP attribute error handling: Little testing. | 
|  | * bgp_aspath.c: (assegments_parse) just bail early if length doesn't match
  and fix the formatting.
* bgp_network.c: add include needed for set_nonblocking
* bgp_packet.c: formatting | 
|  | * bgp_routemap.c: (route_set_community_delete) When deleting a
  community in a route-map the old community was being orphaned.  Like
  the description of the same code in route_set_community, this is a
  hack, not a true fix. | 
|  | This reverts commit 2c9fd7e07283b8904ef20030c9dadb032e999b12. | 
|  | * bgp_attr.c: (attrhash_key_make) 98e30f should have changed jhash2 to jhash.
  These kinds of merge errors would be reduced and life would be easier if
  people would submit fully-formed fixes that could be chucked directly into
  git-am. | 
|  | * bgpd.h: Add error code for setting GTSM on iBGP
* bgpd.c: (peer_ttl_security_hops_set) use previous error code and signal
  incompatibility of GTSM+iBGP to vty.
  Consider the session state when setting GTSM, and reset Open/Active peers
  to let them pick up new TTL from start. | 
|  | * bgp_vty.c: (peer_ebgp_multihop_{un,}set_vty) tail-call cleanup.
  ({no_,}neighbor_ttl_security) ditto.
* bgpd.c: (peer_ttl_security_hops_set) Peer group checks and TTL set only
  need to be done on transition.
* sockunion.c: (sockopt_minttl) remove always-on debug and improve readability. | 
|  | * bgpd: Add support for RFC 5082 GTSM, which allows the TTL field to be used
  to verify that incoming packets have been sent from neighbours no more
  than X IP hops away. In other words, this allows packets that were sent from
  further away (i.e. not by the neighbour with known distance, and so possibly
  a miscreant) to be filtered out.
* lib/sockunion.{c,h}: (sockopt_minttl) new function, to set a minimum TTL
  using the IP_MINTTL socket opt.
* bgpd.h: (BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK) define for command
  error for minttl.
  (struct peer) add a config variable, to store the configured minttl.
  (peer_ttl_security_hops_{set,unset}) configuration handlers
* bgpd.c: (peer_group_get) init gtsm_hops
  (peer_ebgp_multihop_{un,}set) check for conflicts with GTSM. Multihop and
  GTSM can't both be active for a peer at the same time.
  (peer_ttl_security_hops_set) set minttl, taking care to avoid conflicts with
  ebgp_multihop.
  (bgp_config_write_peer) write out minttl as "neighbor .. ttl-security hops X".
* bgp_vty.c: (bgp_vty_return) message for
  BGP_ERR_NO_EBGP_MULTIHOP_WITH_TTLHACK
  (peer_ebgp_multihop_{un,}set_vty)
* bgp_network.c: (bgp_accept) set minttl on accepted sockets if appropriate.
  (bgp_connect) ditto for outbound. | 
|  | * bgp_route.c: ({no_,}ipv6_bgp_network_ttl_cmd) depends on ipv6_bgp_network
  which is HAVE_IPV6, so these should be too.
  (bgp_route_init) and the installs should be similarly ifdefed | 
|  | * bgp_attr.c; (attrhash_key_make) s6_addr is only member of in6_addr
  guaranteed to be available - s6_addr32 isn't. Fix to be more portable, and
  thus allow compilation on BSD again. | 
|  | * bgp_packet.c: (bgp_write) On BGP write, use TCP_CORK to provide hints to
  kernel about TCP buffering.  This will cause BGP packets to occur in
  bigger chunks (full size MTU), improving performance and getting rid of
  one of the problems reported in the UNH BGP conformance test. | 
|  | * bgpd: Rather than toggling socket in/out of non-block mode, just leave it
  in nonblocking mode.
  One exception is in bgp_notify which only happens just before close. | 
|  | * bgp_community.[ch]: (community_lookup) New helper function to look
  up a community list in the hash table.
* bgp_routemap.c: A new community structure was being allocated for
  every BGP update which matched a route map which set a community.
  This behavior led to rapid growth in the memory consumed by bgpd.
  Adding the communities to the hash table addresses the memory
  growth, but may introduce a problem in modifying or deleting the
  'set community' statement in the route map. | 
|  | Many show commands do not have support for multiple views and do not
treat different address families uniformly.  The following changes add
a number of commands with support for views and rationalized treatment
of IPv4 v IPv6 and unicast v multicast (such as in JUNOS, IOS XR and
more recent versions of IOS).
* bgp_route.c: (bgp_show_community) Inserted a new second argument (the
  name of the view) and the code to look up that name in the BGP structure.
  The NULL argument in the call to bgp_show (indicating the default view)
  was replaced by the specified view.  The existing calls to
  bgp_show_community had a NULL second argument inserted to make clear
  that they refer to the default view.
  (top level) Added new functions via the DEFUN and/or ALIAS macros (and
  the associated command table entries) to add the commands
    show bgp ipv4 (unicast|multicast)
    show bgp ipv4 (unicast|multicast) A.B.C.D
    show bgp ipv4 (unicast|multicast) A.B.C.D/M
    show bgp ipv6 (unicast|multicast)
    show bgp ipv6 (unicast|multicast) X:X::X:X
    show bgp ipv6 (unicast|multicast) X:X::X:X/M
      These show either the full BGP table or the specified route or
      prefix for the given address family.
    show bgp view WORD (ipv4|ipv6) (unicast|multicast) community
    show bgp view WORD (ipv4|ipv6) (unicast|multicast) community \
            (AA:NN|local-AS|no-advertise|no-export){1,4}
      For the specified view and address family, these show entries
      matching any community or the specified communit(y)(ies).
    show bgp view WORD (ipv4|ipv6) (unicast|multicast) neighbors \
            (A.B.C.D|X:X::X:X) (advertised-routes|received-routes)
      For the specified view and address family, show the routes
      advertised to or received from the given BGP neighbor.
    show bgp [view WORD] ipv4 (unicast|multicast) \
            rsclient (A.B.C.D|X:X::X:X)
    show bgp [view WORD] ipv4 (unicast|multicast) \
            rsclient (A.B.C.D|X:X::X:X) A.B.C.D
    show bgp [view WORD] ipv4 (unicast|multicast) \
            rsclient (A.B.C.D|X:X::X:X) A.B.C.D/M
    show bgp [view WORD] ipv6 (unicast|multicast) \
            rsclient (A.B.C.D|X:X::X:X)
    show bgp [view WORD] ipv6 (unicast|multicast) \
            rsclient (A.B.C.D|X:X::X:X) X:X::X:X
    show bgp [view WORD] ipv6 (unicast|multicast) \
            rsclient (A.B.C.D|X:X::X:X) X:X::X:X/M
      For the specifed (optional) view and address family, show either
      the full BGP table or the specified route or prefix for the given
      route server client peer.
* bgp_vty.c: (top level) Added new functions via the DEFUN and/or ALIAS
  macros (and the associated command table entries) to add the commands
    show bgp [view WORD] (ipv4|ipv6) (unicast|multicast) summary
    show bgp [view WORD] (ipv4|ipv6) (unicast|multicast) rsclient summary
      For the specified (optional) view and address family, display
      either the normal summary table for BGP peers, or the route server
      client table showing the import and export policies. | 
|  | * BGP error handling generally boils down to "reset session". This was fine
  when all BGP speakers pretty much understood all BGP messages. However
  the increasing deployment of new attribute types has shown this approach
  to cause problems, in particular where a new attribute type is "tunneled"
  over some speakers which do not understand it, and then arrives at a speaker
  which does but considers it malformed (e.g. corruption along the way, or
  because of early implementation bugs/interop issues).
  To mitigate this drafts before the IDR (likely to be adopted) propose to
  treat errors in partial (i.e.  not understood by neighbour), optional
  transitive attributes, when received from eBGP peers, as withdrawing only
  the NLRIs in the affected UPDATE, rather than causing the entire session
  to be reset.  See:
   http://tools.ietf.org/html/draft-scudder-idr-optional-transitive
* bgp_aspath.c: (assegments_parse) Replace the "NULL means valid, 0-length
  OR an error" return value with an error code - instead taking
  pointer to result structure as arg.
  (aspath_parse) adjust to suit previous change, but here NULL really
  does mean error in the external interface.
* bgp_attr.h (bgp_attr_parse) use an explictly typed and enumerated
  value to indicate return result.
  (bgp_attr_unintern_sub) cleans up just the members of an attr, but not the
  attr itself, for benefit of those who use a stack-local attr.
* bgp_attr.c: (bgp_attr_unintern_sub) split out from bgp_attr_unintern
  (bgp_attr_unintern) as previous.
  (bgp_attr_malformed) helper function to centralise decisions on how to
  handle errors in attributes.
  (bgp_attr_{aspathlimit,origin,etc..}) Use bgp_attr_malformed.
  (bgp_attr_aspathlimit) Subcode for error specifc to this attr should be
  BGP_NOTIFY_UPDATE_OPT_ATTR_ERR.
  (bgp_attr_as4_path) be more rigorous about checks, ala bgp_attr_as_path.
  (bgp_attr_parse) Adjust to deal with the additional error level that
  bgp_attr_ parsers can raise, and also similarly return appropriate
  error back up to (bgp_update_receive). Try to avoid leaking as4_path.
* bgp_packet.c: (bgp_update_receive) Adjust to deal with BGP_ATTR_PARSE_WITHDRAW
  error level from bgp_attr_parse, which should lead to a withdraw, by
  making the attribute parameter in call to (bgp_nlri_parse) conditional
  on the error, so the update case morphs also into a withdraw.
  Use bgp_attr_unintern_sub from above, instead of doing this itself.
  Fix error case returns which were not calling bgp_attr_unintern_sub
  and probably leaking memory.
* tests/aspath_test.c: Fix to work for null return with bad segments |