struct bgp_listen_request *req = &p->listen;
/* We assume that cf->iface is defined iff cf->local_ip is link-local */
- req->iface = p->cf->strict_bind ? p->cf->iface : NULL;
- req->vrf = p->p.vrf;
- req->addr = p->cf->strict_bind ? p->cf->local_ip :
+ req->params.iface = p->cf->strict_bind ? p->cf->iface : NULL;
+ req->params.vrf = p->p.vrf;
+ req->params.addr = p->cf->strict_bind ? p->cf->local_ip :
(p->ipv4 ? IPA_NONE4 : IPA_NONE6);
- req->port = p->cf->local_port;
- req->flags = p->cf->free_bind ? SKF_FREEBIND : 0;
+ req->params.port = p->cf->local_port;
+ req->params.flags = p->cf->free_bind ? SKF_FREEBIND : 0;
- BGP_TRACE(D_EVENTS, "Requesting listen socket at %I%J port %u", req->addr, req->iface, req->port);
+ BGP_TRACE(D_EVENTS, "Requesting listen socket at %I%J port %u", req->params.addr, req->params.iface, req->params.port);
add_tail(&bgp_listen_pending, &req->n);
ev_send(&global_event_list, &bgp_listen_event);
/* First try to find existing socket */
struct bgp_socket *bs;
WALK_LIST(bs, bgp_sockets)
- if (ipa_equal(bs->sk->saddr, req->addr) &&
- (bs->sk->sport == req->port) &&
- (bs->sk->iface == req->iface) &&
- (bs->sk->vrf == req->vrf) &&
- ((bs->sk->flags & flag_mask) == req->flags))
+ if (ipa_equal(bs->sk->saddr, req->params.addr) &&
+ (bs->sk->sport == req->params.port) &&
+ (bs->sk->iface == req->params.iface) &&
+ (bs->sk->vrf == req->params.vrf) &&
+ ((bs->sk->flags & flag_mask) == req->params.flags))
break;
/* Not found any */
sock *sk = sk_new(bgp_listen_pool);
sk->type = SK_TCP_PASSIVE;
sk->ttl = 255;
- sk->saddr = req->addr;
- sk->sport = req->port;
- sk->iface = req->iface;
- sk->vrf = req->vrf;
- sk->flags = req->flags;
+ sk->saddr = req->params.addr;
+ sk->sport = req->params.port;
+ sk->iface = req->params.iface;
+ sk->vrf = req->params.vrf;
+ sk->flags = req->params.flags;
sk->tos = IP_PREC_INTERNET_CONTROL;
sk->rbsize = BGP_RX_BUFFER_SIZE;
sk->tbsize = BGP_TX_BUFFER_SIZE;
(ipa_equal(p->remote_ip, sk->daddr) || bgp_is_dynamic(p)) &&
(!p->cf->remote_range || ipa_in_netX(sk->daddr, p->cf->remote_range)) &&
(p->p.vrf == sk->vrf) &&
- (p->cf->local_port == sk->sport) &&
+ (req->params.port == sk->sport) &&
(!link || (p->cf->iface == sk->iface)) &&
(ipa_zero(p->cf->local_ip) || ipa_equal(p->cf->local_ip, sk->saddr)))
{
node n; /* Node in global bgp_sockets */
list requests; /* Listen requests */
sock *sk; /* Real listening socket */
+ struct bgp_socket_params {
+ ip_addr addr; /* Local address to bind to */
+ struct iface *iface; /* Local interface to bind to */
+ struct iface *vrf; /* VRF to bind to */
+ uint port; /* Local port to bind to (mandatory) */
+ uint flags; /* Additional SKF_* flags */
+ } params;
};
struct bgp_stats {
struct bgp_listen_request {
node n; /* Node in bgp_socket / pending list */
struct bgp_socket *sock; /* Assigned socket */
- ip_addr addr;
- struct iface *iface;
- struct iface *vrf;
- uint port;
- uint flags;
+ struct bgp_socket_params params;
};
struct bgp_proto {