Commit 95127cbb authored by Ondrej Zajicek's avatar Ondrej Zajicek
Browse files

Real broadcast mode for OSPFv2.

parent 0ec031f7
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -1825,6 +1825,7 @@ protocol ospf <name> {
			type [broadcast|bcast|pointopoint|ptp|
				nonbroadcast|nbma|pointomultipoint|ptmp];
			strict nonbroadcast <switch>;
			real broadcast <switch>;
			check link <switch>;
			ecmp weight <num>;
			authentication [none|simple|cryptographic];
@@ -2058,6 +2059,16 @@ protocol ospf <name> {
	 If set, don't send hello to any undefined neighbor. This switch
	 is ignored on other than NBMA or PtMP networks. Default value is no.

	<tag>real broadcast <m/switch/</tag>
	 In <cf/type broadcast/ or <cf/type ptp/ network
	 configuration, OSPF packets are sent as IP multicast
	 packets. This option changes the behavior to using
	 old-fashioned IP broadcast packets. This may be useful as a
	 workaround if IP multicast for some reason does not work or
	 does not work reliably. This is a non-standard option and
	 probably is not interoperable with other OSPF
	 implementations. Default value is no.

	<tag>check link <M>switch</M></tag>
	 If set, a hardware link state (reported by OS) is taken into
	 consideration. When a link disappears (e.g. an ethernet cable is
+2 −1
Original line number Diff line number Diff line
@@ -130,7 +130,7 @@ CF_KEYWORDS(NONE, SIMPLE, AUTHENTICATION, STRICT, CRYPTOGRAPHIC)
CF_KEYWORDS(ELIGIBLE, POLL, NETWORKS, HIDDEN, VIRTUAL, CHECK, LINK)
CF_KEYWORDS(RX, BUFFER, LARGE, NORMAL, STUBNET, HIDDEN, SUMMARY, TAG, EXTERNAL)
CF_KEYWORDS(WAIT, DELAY, LSADB, ECMP, LIMIT, WEIGHT, NSSA, TRANSLATOR, STABILITY)
CF_KEYWORDS(GLOBAL, LSID, ROUTER, SELF, INSTANCE)
CF_KEYWORDS(GLOBAL, LSID, ROUTER, SELF, INSTANCE, REAL)

%type <t> opttext
%type <ld> lsadb_args
@@ -287,6 +287,7 @@ ospf_iface_item:
 | TYPE PTP { OSPF_PATT->type = OSPF_IT_PTP ; }
 | TYPE POINTOMULTIPOINT { OSPF_PATT->type = OSPF_IT_PTMP ; }
 | TYPE PTMP { OSPF_PATT->type = OSPF_IT_PTMP ; }
 | REAL BROADCAST bool { OSPF_PATT->real_bcast = $3; if (OSPF_VERSION != 2) cf_error("Real broadcast option requires OSPFv2"); }
 | TRANSMIT DELAY expr { OSPF_PATT->inftransdelay = $3 ; if (($3<=0) || ($3>65535)) cf_error("Transmit delay must be in range 1-65535"); }
 | PRIORITY expr { OSPF_PATT->priority = $2 ; if (($2<0) || ($2>255)) cf_error("Priority must be in range 0-255"); }
 | STRICT NONBROADCAST bool { OSPF_PATT->strictnbma = $3 ; }
+1 −1
Original line number Diff line number Diff line
@@ -303,7 +303,7 @@ ospf_hello_send(struct ospf_iface *ifa, int kind, struct ospf_neighbor *dirn)
  {
  case OSPF_IT_BCAST:
  case OSPF_IT_PTP:
    ospf_send_to(ifa, AllSPFRouters);
    ospf_send_to_all(ifa);
    break;

  case OSPF_IT_NBMA:
+31 −13
Original line number Diff line number Diff line
@@ -120,14 +120,25 @@ ospf_sk_open(struct ospf_iface *ifa)
  sk->saddr = ifa->addr->ip;
  if ((ifa->type == OSPF_IT_BCAST) || (ifa->type == OSPF_IT_PTP))
  {
    if (ifa->cf->real_bcast)
    {
      ifa->all_routers = ifa->addr->brd;

      if (sk_set_broadcast(sk, 1) < 0)
        goto err;
    }
    else
    {
      ifa->all_routers = AllSPFRouters;
      sk->ttl = 1;	/* Hack, this will affect just multicast packets */

      if (sk_setup_multicast(sk) < 0)
        goto err;

    if (sk_join_group(sk, AllSPFRouters) < 0)
      if (sk_join_group(sk, ifa->all_routers) < 0)
        goto err;
    }
  }

  ifa->sk = sk;
  ifa->sk_dr = 0;
@@ -265,7 +276,7 @@ ospf_iface_chstate(struct ospf_iface *ifa, u8 state)
    OSPF_TRACE(D_EVENTS, "Changing state of iface %s from %s to %s",
	       ifa->iface->name, ospf_is[oldstate], ospf_is[state]);

  if ((ifa->type == OSPF_IT_BCAST) && ifa->sk)
  if ((ifa->type == OSPF_IT_BCAST) && !ifa->cf->real_bcast && ifa->sk)
  {
    if ((state == OSPF_IS_BACKUP) || (state == OSPF_IS_DR))
      ospf_sk_join_dr(ifa);
@@ -536,6 +547,7 @@ ospf_iface_new(struct ospf_area *oa, struct ifa *addr, struct ospf_iface_patt *i

  /* Check validity of interface type */
  int old_type = ifa->type;
  u32 if_multi_flag = ip->real_bcast ? IF_BROADCAST : IF_MULTICAST;

#ifdef OSPFv2
  if ((ifa->type == OSPF_IT_BCAST) && (addr->flags & IA_PEER))
@@ -545,10 +557,10 @@ ospf_iface_new(struct ospf_area *oa, struct ifa *addr, struct ospf_iface_patt *i
    ifa->type = OSPF_IT_PTMP;
#endif

  if ((ifa->type == OSPF_IT_BCAST) && !(iface->flags & IF_MULTICAST))
  if ((ifa->type == OSPF_IT_BCAST) && !(iface->flags & if_multi_flag))
    ifa->type = OSPF_IT_NBMA;

  if ((ifa->type == OSPF_IT_PTP) && !(iface->flags & IF_MULTICAST))
  if ((ifa->type == OSPF_IT_PTP) && !(iface->flags & if_multi_flag))
    ifa->type = OSPF_IT_PTMP;

  if (ifa->type != old_type)
@@ -628,6 +640,9 @@ ospf_iface_reconfigure(struct ospf_iface *ifa, struct ospf_iface_patt *new)
  if (ifa->stub != new_stub)
    return 0;

  if (new->real_bcast != ifa->cf->real_bcast)
    return 0;

  ifa->cf = new;
  ifa->marked = 0;

@@ -1099,11 +1114,15 @@ ospf_if_notify(struct proto *p, unsigned flags, struct iface *iface)
void
ospf_iface_info(struct ospf_iface *ifa)
{
  char *strict = "";
  char *more = "";

  if (ifa->strictnbma &&
      ((ifa->type == OSPF_IT_NBMA) || (ifa->type == OSPF_IT_PTMP)))
    strict = "(strict)";
    more = " (strict)";

  if (ifa->cf->real_bcast &&
      ((ifa->type == OSPF_IT_BCAST) || (ifa->type == OSPF_IT_PTP)))
    more = " (real)";

  if (ifa->type == OSPF_IT_VLINK)
  {
@@ -1124,11 +1143,10 @@ ospf_iface_info(struct ospf_iface *ifa)
#else /* OSPFv3 */
    cli_msg(-1015, "Interface %s (IID %d)", ifa->iface->name, ifa->instance_id);
#endif
    cli_msg(-1015, "\tType: %s %s", ospf_it[ifa->type], strict);
    cli_msg(-1015, "\tType: %s%s", ospf_it[ifa->type], more);
    cli_msg(-1015, "\tArea: %R (%u)", ifa->oa->areaid, ifa->oa->areaid);
  }
  cli_msg(-1015, "\tState: %s %s", ospf_is[ifa->state],
	  ifa->stub ? "(stub)" : "");
  cli_msg(-1015, "\tState: %s%s", ospf_is[ifa->state], ifa->stub ? " (stub)" : "");
  cli_msg(-1015, "\tPriority: %u", ifa->priority);
  cli_msg(-1015, "\tCost: %u", ifa->cost);
  if (ifa->oa->po->ecmp)
+6 −2
Original line number Diff line number Diff line
@@ -97,7 +97,9 @@ ospf_lsack_send(struct ospf_neighbor *n, int queue)
	if (ifa->type == OSPF_IT_BCAST)
	{
	  if ((ifa->state == OSPF_IS_DR) || (ifa->state == OSPF_IS_BACKUP))
	    ospf_send_to(ifa, AllSPFRouters);
	    ospf_send_to_all(ifa);
	  else if (ifa->cf->real_bcast)
	    ospf_send_to_bdr(ifa);
	  else
	    ospf_send_to(ifa, AllDRouters);
	}
@@ -124,7 +126,9 @@ ospf_lsack_send(struct ospf_neighbor *n, int queue)
  if (ifa->type == OSPF_IT_BCAST)
  {
    if ((ifa->state == OSPF_IS_DR) || (ifa->state == OSPF_IS_BACKUP))
      ospf_send_to(ifa, AllSPFRouters);
      ospf_send_to_all(ifa);
    else if (ifa->cf->real_bcast)
      ospf_send_to_bdr(ifa);
    else
      ospf_send_to(ifa, AllDRouters);
  }
Loading