Commit 374917ad authored by Ondrej Zajicek's avatar Ondrej Zajicek
Browse files

Make BGP protocol instance search a separate function

Thanks to Alexander V. Chernikov for the patch.
parent 6264aad1
Loading
Loading
Loading
Loading
+71 −51
Original line number Diff line number Diff line
@@ -712,6 +712,28 @@ bgp_connect(struct bgp_proto *p) /* Enter Connect state and start establishing c
  return;
}

/**
 * bgp_find_proto - find existing proto for incoming connection
 * @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_is_link_local(sk->daddr) || (p->cf->iface == sk->iface)))
	  return p;
      }

  return NULL;
}

/**
 * bgp_incoming_connection - handle an incoming connection
 * @sk: TCP socket
@@ -727,18 +749,21 @@ 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_is_link_local(sk->daddr) || (p->cf->iface == sk->iface)))
  p = bgp_find_proto(sk);
  if (!p)
    {
      log(L_WARN "BGP: Unexpected connect from unknown address %I%J (port %d)",
	  sk->daddr, ipa_is_link_local(sk->daddr) ? sk->iface : NULL, sk->dport);
      rfree(sk);
      return 0;
    }

  /* 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) &&
  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)
@@ -754,9 +779,12 @@ bgp_incoming_connection(sock *sk, int dummy UNUSED)
	    sk->dport, acc ? "accepted" : "rejected");

  if (!acc)
	      goto reject;
    {
      rfree(sk);
      return 0;
    }

	    int hops = p->cf->multihop ? : 1;
  hops = p->cf->multihop ? : 1;

  if (sk_set_ttl(sk, p->cf->ttl_security ? 255 : hops) < 0)
    goto err;
@@ -776,14 +804,6 @@ bgp_incoming_connection(sock *sk, int dummy UNUSED)
  rfree(sk);
  return 0;
}
      }

  log(L_WARN "BGP: Unexpected connect from unknown address %I%J (port %d)",
      sk->daddr, ipa_is_link_local(sk->daddr) ? sk->iface : NULL, sk->dport);
 reject:
  rfree(sk);
  return 0;
}

static void
bgp_listen_sock_err(sock *sk UNUSED, int err)