Commit 1647923b authored by Ondrej Zajicek (work)'s avatar Ondrej Zajicek (work)
Browse files

OSPF: Minor refactoring of packet sending code

Common behavior for LSupd and delayed LSack moved to ospf_send_to_iface()
and other minor changes.
parent 255722e0
Loading
Loading
Loading
Loading
+3 −11
Original line number Diff line number Diff line
@@ -111,20 +111,12 @@ ospf_send_lsack_(struct ospf_proto *p, struct ospf_neighbor *n, int queue)
  {
    OSPF_PACKET(ospf_dump_lsack, pkt, "LSACK packet sent to nbr %R on %s", n->rid, ifa->ifname);
    ospf_send_to(ifa, n->ip);
    return;
  }

  OSPF_PACKET(ospf_dump_lsack, pkt, "LSACK packet sent via %s", ifa->ifname);

  if (ifa->type == OSPF_IT_BCAST)
  {
    if ((ifa->state == OSPF_IS_DR) || (ifa->state == OSPF_IS_BACKUP))
      ospf_send_to_all(ifa);
  else
      ospf_send_to_des(ifa);
  {
    OSPF_PACKET(ospf_dump_lsack, pkt, "LSACK packet sent via %s", ifa->ifname);
    ospf_send_to_iface(ifa);
  }
  else
    ospf_send_to_agt(ifa, NEIGHBOR_EXCHANGE);
}

void
+1 −9
Original line number Diff line number Diff line
@@ -398,15 +398,7 @@ ospf_flood_lsupd(struct ospf_proto *p, struct top_hash_entry **lsa_list, uint ls
    OSPF_PACKET(ospf_dump_lsupd, ospf_tx_buffer(ifa),
		"LSUPD packet flooded via %s", ifa->ifname);

    if (ifa->type == OSPF_IT_BCAST)
    {
      if ((ifa->state == OSPF_IS_DR) || (ifa->state == OSPF_IS_BACKUP))
	ospf_send_to_all(ifa);
      else
	ospf_send_to_des(ifa);
    }
    else
      ospf_send_to_agt(ifa, NEIGHBOR_EXCHANGE);
    ospf_send_to_iface(ifa);
  }

  return i;
+3 −12
Original line number Diff line number Diff line
@@ -1056,22 +1056,13 @@ int ospf_rx_hook(sock * sk, uint size);
void ospf_err_hook(sock * sk, int err);
void ospf_verr_hook(sock *sk, int err);
void ospf_send_to(struct ospf_iface *ifa, ip_addr ip);
void ospf_send_to_agt(struct ospf_iface *ifa, u8 state);
void ospf_send_to_bdr(struct ospf_iface *ifa);

static inline uint ospf_pkt_maxsize(struct ospf_iface *ifa)
{ return ifa->tx_length - ifa->tx_hdrlen; }
void ospf_send_to_iface(struct ospf_iface *ifa);

static inline void ospf_send_to_all(struct ospf_iface *ifa)
{ ospf_send_to(ifa, ifa->all_routers); }

static inline void ospf_send_to_des(struct ospf_iface *ifa)
{
  if (ipa_nonzero(ifa->des_routers))
    ospf_send_to(ifa, ifa->des_routers);
  else
    ospf_send_to_bdr(ifa);
}
static inline uint ospf_pkt_maxsize(struct ospf_iface *ifa)
{ return ifa->tx_length - ifa->tx_hdrlen; }

#ifndef PARSER
#define DROP(DSC,VAL) do { err_dsc = DSC; err_val = VAL; goto drop; } while(0)
+31 −8
Original line number Diff line number Diff line
@@ -664,21 +664,44 @@ ospf_send_to(struct ospf_iface *ifa, ip_addr dst)
    log(L_WARN "OSPF: TX queue full on %s", ifa->ifname);
}

void
ospf_send_to_agt(struct ospf_iface *ifa, u8 state)
static void
ospf_send_to_designated(struct ospf_iface *ifa)
{
  /* In case of real-broadcast mode */
  if (ipa_zero(ifa->des_routers))
  {
    if (ipa_nonzero2(ifa->drip))
      ospf_send_to(ifa, ifa->drip);

    if (ipa_nonzero2(ifa->bdrip))
      ospf_send_to(ifa, ifa->bdrip);

    return;
  }

  ospf_send_to(ifa, ifa->des_routers);
}

static void
ospf_send_to_adjacent(struct ospf_iface *ifa)
{
  struct ospf_neighbor *n;

  WALK_LIST(n, ifa->neigh_list)
    if (n->state >= state)
    if (n->state >= NEIGHBOR_EXCHANGE)
      ospf_send_to(ifa, n->ip);
}

void
ospf_send_to_bdr(struct ospf_iface *ifa)
ospf_send_to_iface(struct ospf_iface *ifa)
{
  if (ipa_nonzero2(ifa->drip))
    ospf_send_to(ifa, ifa->drip);
  if (ipa_nonzero2(ifa->bdrip))
    ospf_send_to(ifa, ifa->bdrip);
  if (ifa->type == OSPF_IT_BCAST)
  {
    if ((ifa->state == OSPF_IS_DR) || (ifa->state == OSPF_IS_BACKUP))
      ospf_send_to_all(ifa);
    else
      ospf_send_to_designated(ifa);
  }
  else /* Non-broadcast */
    ospf_send_to_adjacent(ifa);
}