From 716d97caa91e90bf079ce55356193d854c63dfdd Mon Sep 17 00:00:00 2001 From: "Alexander V. Chernikov" Date: Sat, 31 Jan 2015 20:34:38 +0300 Subject: [PATCH 2/6] Make BGP protocol instance search separate function. --- proto/bgp/bgp.c | 122 +++++++++++++++++++++++++++++++++----------------------- 1 file changed, 71 insertions(+), 51 deletions(-) diff --git a/proto/bgp/bgp.c b/proto/bgp/bgp.c index e233911..99ec1ce 100644 --- a/proto/bgp/bgp.c +++ b/proto/bgp/bgp.c @@ -713,6 +713,28 @@ bgp_connect(struct bgp_proto *p) /* Enter Connect state and start establishing c } /** + * bgp_find_proto - find existing proto by socket + * @sk: TCP socket + * + */ +static struct bgp_proto * +bgp_find_proto(sock *sk) +{ + struct proto_config *pc; + + WALK_LIST(pc, config->protos) + if (pc->protocol == &proto_bgp && pc->proto) + { + struct bgp_proto *p = (struct bgp_proto *) pc->proto; + if (ipa_equal(p->cf->remote_ip, sk->daddr) && + (!ipa_has_link_scope(sk->daddr) || (p->cf->iface == sk->iface))) + return p; + } + + return NULL; +} + +/** * bgp_incoming_connection - handle an incoming connection * @sk: TCP socket * @dummy: unused @@ -727,60 +749,58 @@ bgp_connect(struct bgp_proto *p) /* Enter Connect state and start establishing c static int bgp_incoming_connection(sock *sk, int dummy UNUSED) { - struct proto_config *pc; + struct bgp_proto *p; + int acc, hops; DBG("BGP: Incoming connection from %I port %d\n", sk->daddr, sk->dport); - WALK_LIST(pc, config->protos) - if (pc->protocol == &proto_bgp && pc->proto) - { - struct bgp_proto *p = (struct bgp_proto *) pc->proto; - if (ipa_equal(p->cf->remote_ip, sk->daddr) && - (!ipa_has_link_scope(sk->daddr) || (p->cf->iface == sk->iface))) - { - /* We are in proper state and there is no other incoming connection */ - int acc = (p->p.proto_state == PS_START || p->p.proto_state == PS_UP) && - (p->start_state >= BSS_CONNECT) && (!p->incoming_conn.sk); - - if (p->conn && (p->conn->state == BS_ESTABLISHED) && p->gr_ready) - { - bgp_store_error(p, NULL, BE_MISC, BEM_GRACEFUL_RESTART); - bgp_handle_graceful_restart(p); - bgp_conn_enter_idle_state(p->conn); - acc = 1; - } - - BGP_TRACE(D_EVENTS, "Incoming connection from %I%J (port %d) %s", - sk->daddr, ipa_has_link_scope(sk->daddr) ? sk->iface : NULL, - sk->dport, acc ? "accepted" : "rejected"); - - if (!acc) - goto reject; - - int hops = p->cf->multihop ? : 1; - - if (sk_set_ttl(sk, p->cf->ttl_security ? 255 : hops) < 0) - goto err; - - if (p->cf->ttl_security) - if (sk_set_min_ttl(sk, 256 - hops) < 0) - goto err; - - bgp_setup_conn(p, &p->incoming_conn); - bgp_setup_sk(&p->incoming_conn, sk); - bgp_send_open(&p->incoming_conn); - return 0; - - err: - sk_log_error(sk, p->p.name); - log(L_ERR "%s: Incoming connection aborted", p->p.name); - rfree(sk); - return 0; - } - } - log(L_WARN "BGP: Unexpected connect from unknown address %I%J (port %d)", - sk->daddr, ipa_has_link_scope(sk->daddr) ? sk->iface : NULL, sk->dport); - reject: + p = bgp_find_proto(sk); + if (!p) + { + log(L_WARN "BGP: Unexpected connect from unknown address %I%J (port %d)", + sk->daddr, ipa_has_link_scope(sk->daddr) ? sk->iface : NULL, sk->dport); + rfree(sk); + return 0; + } + + /* We are in proper state and there is no other incoming connection */ + acc = (p->p.proto_state == PS_START || p->p.proto_state == PS_UP) && + (p->start_state >= BSS_CONNECT) && (!p->incoming_conn.sk); + + if (p->conn && (p->conn->state == BS_ESTABLISHED) && p->gr_ready) + { + bgp_store_error(p, NULL, BE_MISC, BEM_GRACEFUL_RESTART); + bgp_handle_graceful_restart(p); + bgp_conn_enter_idle_state(p->conn); + acc = 1; + } + + BGP_TRACE(D_EVENTS, "Incoming connection from %I%J (port %d) %s", + sk->daddr, ipa_has_link_scope(sk->daddr) ? sk->iface : NULL, + sk->dport, acc ? "accepted" : "rejected"); + + if (!acc) + { + rfree(sk); + return 0; + } + + hops = p->cf->multihop ? : 1; + + if (sk_set_ttl(sk, p->cf->ttl_security ? 255 : hops) < 0) + goto err; + + if (p->cf->ttl_security && ((sk_set_min_ttl(sk, 256 - hops) < 0))) + goto err; + + bgp_setup_conn(p, &p->incoming_conn); + bgp_setup_sk(&p->incoming_conn, sk); + bgp_send_open(&p->incoming_conn); + return 0; + +err: + sk_log_error(sk, p->p.name); + log(L_ERR "%s: Incoming connection aborted", p->p.name); rfree(sk); return 0; } -- 2.1.2