From e29ed2adec0ef11ca1c84b40b2c98247f162f3df Mon Sep 17 00:00:00 2001 From: Chris Hall Date: Wed, 27 Jan 2010 22:37:55 +0000 Subject: 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 --- lib/sockunion.c | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) (limited to 'lib/sockunion.c') diff --git a/lib/sockunion.c b/lib/sockunion.c index 700d539f..bfcadc96 100644 --- a/lib/sockunion.c +++ b/lib/sockunion.c @@ -735,6 +735,37 @@ sockunion_free (union sockunion *su) * Sockunion reference utilities */ +extern sockunion +sockunion_new(struct prefix* p) +{ + sockunion nsu = XCALLOC (MTYPE_SOCKUNION, sizeof (union sockunion)) ; + + if (p == NULL) + return NULL ; + + switch (p->family) + { + case AF_INET: + nsu->sin.sin_family = AF_INET ; + nsu->sin.sin_port = 0 ; + nsu->sin.sin_addr = p->u.prefix4 ; + break ; + +#ifdef HAVE_IPV6 + case AF_INET6: + nsu->sin6.sin6_family = AF_INET ; + nsu->sin6.sin6_port = 0 ; + nsu->sin6.sin6_addr = p->u.prefix6 ; + break ; +#endif + + default: + break ; + } ; + + return nsu ; +} ; + /*------------------------------------------------------------------------------ * Unset pointer to sockunion -- free any sockunion referenced * @@ -744,7 +775,7 @@ extern void sockunion_unset(sockunion* p_su) { if (*p_su != NULL) - XFREE(MTYPE_BGP_NOTIFY, *p_su) ; /* sets *p_su NULL */ + XFREE(MTYPE_SOCKUNION, *p_su) ; /* sets *p_su NULL */ } ; /*------------------------------------------------------------------------------ -- cgit v1.2.3