summaryrefslogtreecommitdiffstats
path: root/bgpd/bgp_session.c
diff options
context:
space:
mode:
Diffstat (limited to 'bgpd/bgp_session.c')
-rw-r--r--bgpd/bgp_session.c50
1 files changed, 46 insertions, 4 deletions
diff --git a/bgpd/bgp_session.c b/bgpd/bgp_session.c
index dbf6c5ca..1f8e06dc 100644
--- a/bgpd/bgp_session.c
+++ b/bgpd/bgp_session.c
@@ -145,6 +145,31 @@ bgp_session_init_new(bgp_session session, bgp_peer peer)
return session ;
} ;
+/* Free session structure
+ *
+ */
+bgp_session
+bgp_session_free(bgp_session session)
+{
+ if (session == NULL)
+ return NULL;
+
+ qpt_mutex_destroy(&session->mutex, 0) ;
+
+ bgp_notify_free(session->notification);
+ bgp_open_state_free(session->open_send);
+ bgp_open_state_free(session->open_recv);
+ XFREE(MTYPE_BGP_SESSION, session->host);
+ XFREE(MTYPE_BGP_SESSION, session->password);
+
+ /* Zeroize to catch dangling references asap */
+ memset(session, 0, sizeof(struct bgp_session)) ;
+ XFREE(MTYPE_BGP_SESSION, session);
+
+ return NULL;
+}
+
+
/* Look up session
*
*/
@@ -190,6 +215,15 @@ bgp_session_enable(bgp_peer peer)
} ;
/* Initialise what we need to make and run connections */
+ session->state = bgp_session_sIdle;
+ session->made = 0;
+ session->event = bgp_session_null_event;
+ session->notification = bgp_notify_free(session->notification);
+ session->err = 0;
+ session->ordinal = 0;
+
+ session->open_send = bgp_peer_open_state_init_new(session->open_send, peer);
+ session->open_recv = bgp_open_state_free(session->open_recv);
session->connect = (peer->flags & PEER_FLAG_PASSIVE) != 0 ;
session->listen = 1 ;
@@ -200,17 +234,25 @@ bgp_session_enable(bgp_peer peer)
session->su_peer = sockunion_dup(&peer->su) ;
session->log = peer->log ;
- session->host = peer->host ; /* TODO: duplicate string ? */
+
+ /* take copies of host and password */
+ XFREE(MTYPE_BGP_SESSION, session->host);
+ session->host = XSTRDUP(MTYPE_BGP_SESSION, peer->host);
+ XFREE(MTYPE_BGP_SESSION, session->password);
+ session->password = XSTRDUP(MTYPE_BGP_SESSION, peer->password);
session->idle_hold_timer_interval = peer->v_start ;
session->connect_retry_timer_interval = peer->v_connect ;
/* TODO: proper value for open_hold_timer_interval */
- session->open_hold_timer_interval = peer->v_connect ;
+ session->open_hold_timer_interval = 4 * 60;
session->hold_timer_interval = peer->v_holdtime ;
session->keepalive_timer_interval = peer->v_keepalive ;
- /* Initialise the BGP Open negotiating position */
- /* TODO: set up open_state in bgp_session_enable.... */
+ session->as4 = 0;
+ session->route_refresh_pre = 0;
+
+ /* su_local set when session Established */
+ /* su_remote set when session Established */
/* Routeing Engine does the state change now. */
session->state = bgp_session_sEnabled ;