Commit 16605f2f authored by Ondrej Zajicek (work)'s avatar Ondrej Zajicek (work)
Browse files

OSPF: Reject duplicate DBDES packets after dead interval

Master may free last DBDES packet immediately. Slave must wait dead
interval before freeing last DBDES packet and then reject duplicate
DBDES packets with SeqNumberMismatch.
parent 9c94583a
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -238,6 +238,14 @@ ospf_rxmt_dbdes(struct ospf_proto *p, struct ospf_neighbor *n)
  ospf_do_send_dbdes(p, n);
}

void
ospf_reset_ldd(struct ospf_proto *p UNUSED, struct ospf_neighbor *n)
{
  mb_free(n->ldd_buffer);
  n->ldd_buffer = NULL;
  n->ldd_bsize = 0;
}

static int
ospf_process_dbdes(struct ospf_proto *p, struct ospf_packet *pkt, struct ospf_neighbor *n)
{
@@ -434,6 +442,7 @@ ospf_receive_dbdes(struct ospf_packet *pkt, struct ospf_iface *ifa,
      if (!(n->myimms & DBDES_M) && !(n->imms & DBDES_M))
      {
	tm_stop(n->dbdes_timer);
	ospf_reset_ldd(p, n);
	ospf_neigh_sm(n, INM_EXDONE);
	break;
      }
@@ -457,8 +466,12 @@ ospf_receive_dbdes(struct ospf_packet *pkt, struct ospf_iface *ifa,
      ospf_send_dbdes(p, n);

      if (!(n->myimms & DBDES_M) && !(n->imms & DBDES_M))
      {
	/* Use dbdes timer to postpone freeing of Last DBDES packet buffer */
	tm_start(n->dbdes_timer, n->ifa->deadint S);
	ospf_neigh_sm(n, INM_EXDONE);
      }
    }
    break;

  case NEIGHBOR_LOADING:
+6 −0
Original line number Diff line number Diff line
@@ -608,6 +608,12 @@ dbdes_timer_hook(timer *t)

  if ((n->state == NEIGHBOR_EXCHANGE) && (n->myimms & DBDES_MS))
    ospf_rxmt_dbdes(p, n);

  if ((n->state > NEIGHBOR_LOADING) && !(n->myimms & DBDES_MS))
  {
    ospf_reset_ldd(p, n);
    tm_stop(n->dbdes_timer);
  }
}

static void
+1 −0
Original line number Diff line number Diff line
@@ -1041,6 +1041,7 @@ uint ospf_hello3_options(struct ospf_packet *pkt);
/* dbdes.c */
void ospf_send_dbdes(struct ospf_proto *p, struct ospf_neighbor *n);
void ospf_rxmt_dbdes(struct ospf_proto *p, struct ospf_neighbor *n);
void ospf_reset_ldd(struct ospf_proto *p, struct ospf_neighbor *n);
void ospf_receive_dbdes(struct ospf_packet *pkt, struct ospf_iface *ifa, struct ospf_neighbor *n);
uint ospf_dbdes3_options(struct ospf_packet *pkt);