From: Benjamin Cama Date: Sun, 7 Aug 2011 22:35:08 +0000 (+0200) Subject: Merge branch 'rfc4760' into fdn-mods X-Git-Tag: debian/2.2.1-1fdn2~5^2 X-Git-Url: http://git.sameswireless.fr/l2tpns.git/commitdiff_plain/ae7d3c9fca4afa0dcc83095c4405ce3461276075?ds=sidebyside;hp=-c Merge branch 'rfc4760' into fdn-mods --- ae7d3c9fca4afa0dcc83095c4405ce3461276075 diff --combined bgp.c index 600c950,bfcb86e..901ea55 --- a/bgp.c +++ b/bgp.c @@@ -101,7 -101,7 +101,7 @@@ int bgp_setup(int as /* start connection with a peer */ int bgp_start(struct bgp_peer *peer, char *name, int as, int keepalive, - int hold, int enable) + int hold, struct in_addr update_source, int enable) { struct hostent *h; int ibgp; @@@ -130,7 -130,6 +130,7 @@@ } memcpy(&peer->addr, h->h_addr, sizeof(peer->addr)); + peer->source_addr = update_source.s_addr; peer->as = as > 0 ? as : our_as; ibgp = peer->as == our_as; @@@ -233,14 -232,7 +233,14 @@@ /* NEXT_HOP */ a.flags = BGP_PATH_ATTR_FLAG_TRANS; a.code = BGP_PATH_ATTR_CODE_NEXT_HOP; - ip = my_address; /* we're it */ + if (config->nexthop_address) + { + ip = config->nexthop_address; + } + else + { + ip = my_address; /* we're it */ + } a.data.s.len = sizeof(ip); memcpy(a.data.s.value, &ip, sizeof(ip)); @@@ -913,7 -905,6 +913,7 @@@ static int bgp_connect(struct bgp_peer { static int bgp_port = 0; struct sockaddr_in addr; + struct sockaddr_in source_addr; struct epoll_event ev; if (!bgp_port) @@@ -945,19 -936,6 +945,19 @@@ /* set to non-blocking */ fcntl(peer->sock, F_SETFL, fcntl(peer->sock, F_GETFL, 0) | O_NONBLOCK); + /* set source address */ + memset(&source_addr, 0, sizeof(source_addr)); + source_addr.sin_family = AF_INET; + source_addr.sin_addr.s_addr = peer->source_addr; /* defaults to INADDR_ANY */ + if (bind(peer->sock, (struct sockaddr *) &source_addr, sizeof(source_addr)) < 0) + { + LOG(1, 0, 0, "Can't set source address to %s: %s\n", + inet_ntoa(source_addr.sin_addr), strerror(errno)); + + bgp_set_retry(peer); + return 0; + } + /* try connect */ memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; @@@ -1316,7 -1294,7 +1316,7 @@@ static int bgp_handle_input(struct bgp_ if (notification->error_code == BGP_ERR_CEASE) { LOG(4, 0, 0, "BGP peer %s sent CEASE\n", peer->name); - bgp_restart(peer); + bgp_set_retry(peer); return 0; } @@@ -1383,7 -1361,11 +1383,11 @@@ static int bgp_send_open(struct bgp_pee data.version = BGP_VERSION; data.as = htons(our_as); data.hold_time = htons(peer->hold); - data.identifier = my_address; + /* use the source IP we use as identifier, if available */ + if (peer->source_addr != INADDR_ANY) + data.identifier = peer->source_addr; + else + data.identifier = my_address; /* if we know peer doesn't support MP (mp_handling == DoesntHandleIPv6Routes) then don't add this parameter */