diff options
author | Chris Hall <GMCH@hestia.halldom.com> | 2010-01-27 22:37:55 +0000 |
---|---|---|
committer | Chris Hall <GMCH@hestia.halldom.com> | 2010-01-27 22:37:55 +0000 |
commit | e29ed2adec0ef11ca1c84b40b2c98247f162f3df (patch) | |
tree | d0a65837f2a544c8e46f8ddda654e70686c531a1 /bgpd/bgp_session.c | |
parent | e6d986058f23f350aa6aedac4da5fe9f3afda6e8 (diff) | |
download | quagga-e29ed2adec0ef11ca1c84b40b2c98247f162f3df.tar.bz2 quagga-e29ed2adec0ef11ca1c84b40b2c98247f162f3df.tar.xz |
Binding to interfaces and counting of messages.
Wired up message counters in bgp_session structure.
Added fields to session for neighbor interface and
neighbor update-source -- so that these can be set when connect()
is done. Peering Engine resolves any interface name to an address,
so that BGP Engine doesn't have to.
Reinstated as much code as necessary in bgp_network to bind to
specific interfaces, as set in the session.
Moved setting of bgp_nexthop_set() back into Routeing Engine.
Result is that only Peering Engine talks to Zebra or uses the
iflist.
Wired up setting of TTL.
Reworked connections locking of the session mutex so more robust
if/when connections are cut loose from the session.
Made peer_index entry point at connection, not session. Works
better in bgp_network that way.
modified: bgpd/bgp_connection.c
modified: bgpd/bgp_connection.h
modified: bgpd/bgp_fsm.c
modified: bgpd/bgp_msg_read.c
modified: bgpd/bgp_msg_write.c
modified: bgpd/bgp_network.c
modified: bgpd/bgp_network.h
modified: bgpd/bgp_peer.c
modified: bgpd/bgp_peer.h
modified: bgpd/bgp_peer_index.c
modified: bgpd/bgp_peer_index.h
modified: bgpd/bgp_session.c
modified: bgpd/bgp_session.h
modified: lib/prefix.h
modified: lib/sockunion.c
modified: lib/sockunion.h
Diffstat (limited to 'bgpd/bgp_session.c')
-rw-r--r-- | bgpd/bgp_session.c | 59 |
1 files changed, 48 insertions, 11 deletions
diff --git a/bgpd/bgp_session.c b/bgpd/bgp_session.c index dcc338bf..936857c0 100644 --- a/bgpd/bgp_session.c +++ b/bgpd/bgp_session.c @@ -28,6 +28,7 @@ #include "bgpd/bgp_open_state.h" #include "bgpd/bgp_route_refresh.h" #include "bgpd/bgp_msg_write.h" +#include "bgpd/bgp_network.h" #include "bgpd/bgp_packet.h" @@ -150,6 +151,10 @@ bgp_session_init_new(bgp_session session, bgp_peer peer) * as_peer -- unset * su_peer -- NULL -- none * + * ifname -- NULL -- none + * ifindex -- 0 -- none + * ifaddress -- NULL -- none + * * log -- NULL -- none * host -- NULL -- none * password -- NULL -- none @@ -190,10 +195,16 @@ bgp_session_free(bgp_session session) bgp_notify_free(session->notification); bgp_open_state_free(session->open_send); bgp_open_state_free(session->open_recv); + if (session->ifname != NULL) + free(session->ifname) ; + sockunion_unset(&session->ifaddress) ; + sockunion_unset(&session->su_peer) ; if (session->host != NULL) - XFREE(MTYPE_BGP_SESSION, session->host); + XFREE(MTYPE_BGP_PEER_HOST, session->host); if (session->password != NULL) - XFREE(MTYPE_BGP_SESSION, session->password); + XFREE(MTYPE_PEER_PASSWORD, session->password); + sockunion_unset(&session->su_local) ; + sockunion_unset(&session->su_remote) ; /* Zeroize to catch dangling references asap */ memset(session, 0, sizeof(struct bgp_session)) ; @@ -256,20 +267,38 @@ bgp_session_enable(bgp_peer peer) session->ttl = peer->ttl ; session->port = peer->port ; + if (session->ifname != NULL) + free(session->ifname) ; + session->ifindex = 0 ; + + if (peer->ifname != NULL) + { + session->ifname = strdup(peer->ifname) ; + session->ifindex = if_nametoindex(peer->ifname) ; + } ; + + sockunion_unset(&session->ifaddress) ; + if (peer->update_source != NULL) + session->ifaddress = sockunion_dup(peer->update_source) ; + else if (peer->update_if != NULL) + session->ifaddress = bgp_peer_get_ifaddress(peer, peer->update_if, + peer->su.sa.sa_family) ; + session->as_peer = peer->as ; - session->su_peer = sockunion_dup(&peer->su) ; + sockunion_set_dup(&session->su_peer, &peer->su) ; session->log = peer->log ; /* take copies of host and password */ - XFREE(MTYPE_BGP_SESSION, session->host); + if (session->host != NULL) + XFREE(MTYPE_BGP_PEER_HOST, session->host); session->host = (peer->host != NULL) - ? XSTRDUP(MTYPE_BGP_SESSION, peer->host) + ? XSTRDUP(MTYPE_BGP_PEER_HOST, peer->host) : NULL; - - XFREE(MTYPE_BGP_SESSION, session->password); + if (session->password != NULL) + XFREE(MTYPE_PEER_PASSWORD, session->password); session->password = (peer->password != NULL) - ? XSTRDUP(MTYPE_BGP_SESSION, peer->password) + ? XSTRDUP(MTYPE_PEER_PASSWORD, peer->password) : NULL; session->idle_hold_timer_interval = peer->v_start ; @@ -890,9 +919,17 @@ bgp_session_do_set_ttl(mqueue_block mqb, mqb_flag_t flag) if (flag == mqb_action) { - bgp_session session = mqb_get_arg0(mqb); - struct bgp_session_ttl_args *args = mqb_get_args(mqb); - /* TODO ttl */ + bgp_session session = mqb_get_arg0(mqb) ; + struct bgp_session_ttl_args *args = mqb_get_args(mqb) ; + + BGP_SESSION_LOCK(session) ; /*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/ + + session->ttl = args->ttl ; + + bgp_set_ttl(session->connections[bgp_connection_primary], session->ttl) ; + bgp_set_ttl(session->connections[bgp_connection_secondary], session->ttl); + + BGP_SESSION_UNLOCK(session) ; /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/ } mqb_free(mqb) ; |