version 1.1.1.4, 2013/07/21 23:54:40
|
version 1.1.1.5, 2016/11/02 10:09:12
|
Line 323 ospf_packet_max (struct ospf_interface *oi)
|
Line 323 ospf_packet_max (struct ospf_interface *oi)
|
return max; |
return max; |
} |
} |
|
|
| |
static int |
static int |
ospf_check_md5_digest (struct ospf_interface *oi, struct ospf_header *ospfh) |
ospf_check_md5_digest (struct ospf_interface *oi, struct ospf_header *ospfh) |
{ |
{ |
Line 383 static int
|
Line 383 static int
|
ospf_make_md5_digest (struct ospf_interface *oi, struct ospf_packet *op) |
ospf_make_md5_digest (struct ospf_interface *oi, struct ospf_packet *op) |
{ |
{ |
struct ospf_header *ospfh; |
struct ospf_header *ospfh; |
unsigned char digest[OSPF_AUTH_MD5_SIZE]; | unsigned char digest[OSPF_AUTH_MD5_SIZE] = {0}; |
MD5_CTX ctx; |
MD5_CTX ctx; |
void *ibuf; |
void *ibuf; |
u_int32_t t; |
u_int32_t t; |
Line 410 ospf_make_md5_digest (struct ospf_interface *oi, struc
|
Line 410 ospf_make_md5_digest (struct ospf_interface *oi, struc
|
|
|
/* Get MD5 Authentication key from auth_key list. */ |
/* Get MD5 Authentication key from auth_key list. */ |
if (list_isempty (OSPF_IF_PARAM (oi, auth_crypt))) |
if (list_isempty (OSPF_IF_PARAM (oi, auth_crypt))) |
auth_key = (const u_int8_t *) ""; | auth_key = (const u_int8_t *) digest; |
else |
else |
{ |
{ |
ck = listgetdata (listtail(OSPF_IF_PARAM (oi, auth_crypt))); |
ck = listgetdata (listtail(OSPF_IF_PARAM (oi, auth_crypt))); |
Line 438 ospf_make_md5_digest (struct ospf_interface *oi, struc
|
Line 438 ospf_make_md5_digest (struct ospf_interface *oi, struc
|
return OSPF_AUTH_MD5_SIZE; |
return OSPF_AUTH_MD5_SIZE; |
} |
} |
|
|
| |
static int |
static int |
ospf_ls_req_timer (struct thread *thread) |
ospf_ls_req_timer (struct thread *thread) |
{ |
{ |
Line 644 ospf_write (struct thread *thread)
|
Line 644 ospf_write (struct thread *thread)
|
struct listnode *node; |
struct listnode *node; |
#ifdef WANT_OSPF_WRITE_FRAGMENT |
#ifdef WANT_OSPF_WRITE_FRAGMENT |
static u_int16_t ipid = 0; |
static u_int16_t ipid = 0; |
#endif /* WANT_OSPF_WRITE_FRAGMENT */ |
|
u_int16_t maxdatasize; |
u_int16_t maxdatasize; |
|
#endif /* WANT_OSPF_WRITE_FRAGMENT */ |
#define OSPF_WRITE_IPHL_SHIFT 2 |
#define OSPF_WRITE_IPHL_SHIFT 2 |
|
|
ospf->t_write = NULL; |
ospf->t_write = NULL; |
Line 659 ospf_write (struct thread *thread)
|
Line 659 ospf_write (struct thread *thread)
|
/* seed ipid static with low order bits of time */ |
/* seed ipid static with low order bits of time */ |
if (ipid == 0) |
if (ipid == 0) |
ipid = (time(NULL) & 0xffff); |
ipid = (time(NULL) & 0xffff); |
#endif /* WANT_OSPF_WRITE_FRAGMENT */ |
|
|
|
/* convenience - max OSPF data per packet, |
/* convenience - max OSPF data per packet, |
* and reliability - not more data, than our |
* and reliability - not more data, than our |
Line 667 ospf_write (struct thread *thread)
|
Line 666 ospf_write (struct thread *thread)
|
*/ |
*/ |
maxdatasize = MIN (oi->ifp->mtu, ospf->maxsndbuflen) - |
maxdatasize = MIN (oi->ifp->mtu, ospf->maxsndbuflen) - |
sizeof (struct ip); |
sizeof (struct ip); |
|
#endif /* WANT_OSPF_WRITE_FRAGMENT */ |
|
|
/* Get one packet from queue. */ |
/* Get one packet from queue. */ |
op = ospf_fifo_head (oi->obuf); |
op = ospf_fifo_head (oi->obuf); |
Line 789 ospf_write (struct thread *thread)
|
Line 789 ospf_write (struct thread *thread)
|
/* Now delete packet from queue. */ |
/* Now delete packet from queue. */ |
ospf_packet_delete (oi); |
ospf_packet_delete (oi); |
|
|
|
/* Move this interface to the tail of write_q to |
|
serve everyone in a round robin fashion */ |
|
listnode_move_to_tail (ospf->oi_write_q, node); |
if (ospf_fifo_head (oi->obuf) == NULL) |
if (ospf_fifo_head (oi->obuf) == NULL) |
{ |
{ |
oi->on_write_q = 0; |
oi->on_write_q = 0; |
Line 891 ospf_hello (struct ip *iph, struct ospf_header *ospfh,
|
Line 894 ospf_hello (struct ip *iph, struct ospf_header *ospfh,
|
} |
} |
#endif /* REJECT_IF_TBIT_ON */ |
#endif /* REJECT_IF_TBIT_ON */ |
|
|
#ifdef HAVE_OPAQUE_LSA |
|
if (CHECK_FLAG (oi->ospf->config, OSPF_OPAQUE_CAPABLE) |
if (CHECK_FLAG (oi->ospf->config, OSPF_OPAQUE_CAPABLE) |
&& CHECK_FLAG (hello->options, OSPF_OPTION_O)) |
&& CHECK_FLAG (hello->options, OSPF_OPTION_O)) |
{ |
{ |
Line 907 ospf_hello (struct ip *iph, struct ospf_header *ospfh,
|
Line 909 ospf_hello (struct ip *iph, struct ospf_header *ospfh,
|
UNSET_FLAG (hello->options, OSPF_OPTION_O); /* Ignore O-bit. */ |
UNSET_FLAG (hello->options, OSPF_OPTION_O); /* Ignore O-bit. */ |
#endif /* STRICT_OBIT_USAGE_CHECK */ |
#endif /* STRICT_OBIT_USAGE_CHECK */ |
} |
} |
#endif /* HAVE_OPAQUE_LSA */ |
|
|
|
/* new for NSSA is to ensure that NP is on and E is off */ |
/* new for NSSA is to ensure that NP is on and E is off */ |
|
|
Line 1059 ospf_db_desc_proc (struct stream *s, struct ospf_inter
|
Line 1060 ospf_db_desc_proc (struct stream *s, struct ospf_inter
|
return; |
return; |
} |
} |
|
|
#ifdef HAVE_OPAQUE_LSA |
|
if (IS_OPAQUE_LSA (lsah->type) |
if (IS_OPAQUE_LSA (lsah->type) |
&& ! CHECK_FLAG (nbr->options, OSPF_OPTION_O)) |
&& ! CHECK_FLAG (nbr->options, OSPF_OPTION_O)) |
{ |
{ |
Line 1067 ospf_db_desc_proc (struct stream *s, struct ospf_inter
|
Line 1067 ospf_db_desc_proc (struct stream *s, struct ospf_inter
|
OSPF_NSM_EVENT_SCHEDULE (nbr, NSM_SeqNumberMismatch); |
OSPF_NSM_EVENT_SCHEDULE (nbr, NSM_SeqNumberMismatch); |
return; |
return; |
} |
} |
#endif /* HAVE_OPAQUE_LSA */ |
|
|
|
switch (lsah->type) |
switch (lsah->type) |
{ |
{ |
case OSPF_AS_EXTERNAL_LSA: |
case OSPF_AS_EXTERNAL_LSA: |
#ifdef HAVE_OPAQUE_LSA |
|
case OSPF_OPAQUE_AS_LSA: |
case OSPF_OPAQUE_AS_LSA: |
#endif /* HAVE_OPAQUE_LSA */ |
|
/* Check for stub area. Reject if AS-External from stub but |
/* Check for stub area. Reject if AS-External from stub but |
allow if from NSSA. */ |
allow if from NSSA. */ |
if (oi->area->external_routing == OSPF_AREA_STUB) |
if (oi->area->external_routing == OSPF_AREA_STUB) |
Line 1245 ospf_db_desc (struct ip *iph, struct ospf_header *ospf
|
Line 1242 ospf_db_desc (struct ip *iph, struct ospf_header *ospf
|
} |
} |
#endif /* REJECT_IF_TBIT_ON */ |
#endif /* REJECT_IF_TBIT_ON */ |
|
|
#ifdef HAVE_OPAQUE_LSA |
|
if (CHECK_FLAG (dd->options, OSPF_OPTION_O) |
if (CHECK_FLAG (dd->options, OSPF_OPTION_O) |
&& !CHECK_FLAG (oi->ospf->config, OSPF_OPAQUE_CAPABLE)) |
&& !CHECK_FLAG (oi->ospf->config, OSPF_OPAQUE_CAPABLE)) |
{ |
{ |
Line 1255 ospf_db_desc (struct ip *iph, struct ospf_header *ospf
|
Line 1251 ospf_db_desc (struct ip *iph, struct ospf_header *ospf
|
*/ |
*/ |
UNSET_FLAG (dd->options, OSPF_OPTION_O); |
UNSET_FLAG (dd->options, OSPF_OPTION_O); |
} |
} |
#endif /* HAVE_OPAQUE_LSA */ |
|
|
|
/* Add event to thread. */ |
/* Add event to thread. */ |
OSPF_NSM_EVENT_SCHEDULE (nbr, NSM_PacketReceived); |
OSPF_NSM_EVENT_SCHEDULE (nbr, NSM_PacketReceived); |
Line 1320 ospf_db_desc (struct ip *iph, struct ospf_header *ospf
|
Line 1315 ospf_db_desc (struct ip *iph, struct ospf_header *ospf
|
/* This is where the real Options are saved */ |
/* This is where the real Options are saved */ |
nbr->options = dd->options; |
nbr->options = dd->options; |
|
|
#ifdef HAVE_OPAQUE_LSA |
|
if (CHECK_FLAG (oi->ospf->config, OSPF_OPAQUE_CAPABLE)) |
if (CHECK_FLAG (oi->ospf->config, OSPF_OPAQUE_CAPABLE)) |
{ |
{ |
if (IS_DEBUG_OSPF_EVENT) |
if (IS_DEBUG_OSPF_EVENT) |
Line 1338 ospf_db_desc (struct ip *iph, struct ospf_header *ospf
|
Line 1332 ospf_db_desc (struct ip *iph, struct ospf_header *ospf
|
/* This situation is undesirable, but not a real error. */ |
/* This situation is undesirable, but not a real error. */ |
} |
} |
} |
} |
#endif /* HAVE_OPAQUE_LSA */ |
|
|
|
OSPF_NSM_EVENT_EXECUTE (nbr, NSM_NegotiationDone); |
OSPF_NSM_EVENT_EXECUTE (nbr, NSM_NegotiationDone); |
|
|
Line 1616 ospf_ls_upd_list_lsa (struct ospf_neighbor *nbr, struc
|
Line 1609 ospf_ls_upd_list_lsa (struct ospf_neighbor *nbr, struc
|
if (ntohs (lsah->ls_age) > OSPF_LSA_MAXAGE) |
if (ntohs (lsah->ls_age) > OSPF_LSA_MAXAGE) |
lsah->ls_age = htons (OSPF_LSA_MAXAGE); |
lsah->ls_age = htons (OSPF_LSA_MAXAGE); |
|
|
#ifdef HAVE_OPAQUE_LSA |
|
if (CHECK_FLAG (nbr->options, OSPF_OPTION_O)) |
if (CHECK_FLAG (nbr->options, OSPF_OPTION_O)) |
{ |
{ |
#ifdef STRICT_OBIT_USAGE_CHECK |
#ifdef STRICT_OBIT_USAGE_CHECK |
Line 1648 ospf_ls_upd_list_lsa (struct ospf_neighbor *nbr, struc
|
Line 1640 ospf_ls_upd_list_lsa (struct ospf_neighbor *nbr, struc
|
zlog_warn ("LSA[Type%d:%s]: Opaque capability mismatch?", lsah->type, inet_ntoa (lsah->id)); |
zlog_warn ("LSA[Type%d:%s]: Opaque capability mismatch?", lsah->type, inet_ntoa (lsah->id)); |
continue; |
continue; |
} |
} |
#endif /* HAVE_OPAQUE_LSA */ |
|
|
|
/* Create OSPF LSA instance. */ |
/* Create OSPF LSA instance. */ |
lsa = ospf_lsa_new (); |
lsa = ospf_lsa_new (); |
Line 1658 ospf_ls_upd_list_lsa (struct ospf_neighbor *nbr, struc
|
Line 1649 ospf_ls_upd_list_lsa (struct ospf_neighbor *nbr, struc
|
switch (lsah->type) |
switch (lsah->type) |
{ |
{ |
case OSPF_AS_EXTERNAL_LSA: |
case OSPF_AS_EXTERNAL_LSA: |
#ifdef HAVE_OPAQUE_LSA |
|
case OSPF_OPAQUE_AS_LSA: |
case OSPF_OPAQUE_AS_LSA: |
lsa->area = NULL; |
lsa->area = NULL; |
break; |
break; |
case OSPF_OPAQUE_LINK_LSA: |
case OSPF_OPAQUE_LINK_LSA: |
lsa->oi = oi; /* Remember incoming interface for flooding control. */ |
lsa->oi = oi; /* Remember incoming interface for flooding control. */ |
/* Fallthrough */ |
/* Fallthrough */ |
#endif /* HAVE_OPAQUE_LSA */ |
|
default: |
default: |
lsa->area = oi->area; |
lsa->area = oi->area; |
break; |
break; |
Line 1676 ospf_ls_upd_list_lsa (struct ospf_neighbor *nbr, struc
|
Line 1665 ospf_ls_upd_list_lsa (struct ospf_neighbor *nbr, struc
|
|
|
if (IS_DEBUG_OSPF_EVENT) |
if (IS_DEBUG_OSPF_EVENT) |
zlog_debug("LSA[Type%d:%s]: %p new LSA created with Link State Update", |
zlog_debug("LSA[Type%d:%s]: %p new LSA created with Link State Update", |
lsa->data->type, inet_ntoa (lsa->data->id), lsa); | lsa->data->type, inet_ntoa (lsa->data->id), (void *)lsa); |
listnode_add (lsas, lsa); |
listnode_add (lsas, lsa); |
} |
} |
|
|
Line 1698 ospf_upd_list_clean (struct list *lsas)
|
Line 1687 ospf_upd_list_clean (struct list *lsas)
|
|
|
/* OSPF Link State Update message read -- RFC2328 Section 13. */ |
/* OSPF Link State Update message read -- RFC2328 Section 13. */ |
static void |
static void |
ospf_ls_upd (struct ip *iph, struct ospf_header *ospfh, | ospf_ls_upd (struct ospf *ospf, struct ip *iph, struct ospf_header *ospfh, |
struct stream *s, struct ospf_interface *oi, u_int16_t size) |
struct stream *s, struct ospf_interface *oi, u_int16_t size) |
{ |
{ |
struct ospf_neighbor *nbr; |
struct ospf_neighbor *nbr; |
Line 1740 ospf_ls_upd (struct ip *iph, struct ospf_header *ospfh
|
Line 1729 ospf_ls_upd (struct ip *iph, struct ospf_header *ospfh
|
*/ |
*/ |
lsas = ospf_ls_upd_list_lsa (nbr, s, oi, size); |
lsas = ospf_ls_upd_list_lsa (nbr, s, oi, size); |
|
|
#ifdef HAVE_OPAQUE_LSA |
|
/* |
|
* If self-originated Opaque-LSAs that have flooded before restart |
|
* are contained in the received LSUpd message, corresponding LSReq |
|
* messages to be sent may have to be modified. |
|
* To eliminate possible race conditions such that flushing and normal |
|
* updating for the same LSA would take place alternately, this trick |
|
* must be done before entering to the loop below. |
|
*/ |
|
/* XXX: Why is this Opaque specific? Either our core code is deficient |
|
* and this should be fixed generally, or Opaque is inventing strawman |
|
* problems */ |
|
ospf_opaque_adjust_lsreq (nbr, lsas); |
|
#endif /* HAVE_OPAQUE_LSA */ |
|
|
|
#define DISCARD_LSA(L,N) {\ |
#define DISCARD_LSA(L,N) {\ |
if (IS_DEBUG_OSPF_EVENT) \ |
if (IS_DEBUG_OSPF_EVENT) \ |
zlog_debug ("ospf_lsa_discard() in ospf_ls_upd() point %d: lsa %p Type-%d", N, lsa, (int) lsa->data->type); \ | zlog_debug ("ospf_lsa_discard() in ospf_ls_upd() point %d: lsa %p" \ |
| " Type-%d", N, (void *)lsa, (int) lsa->data->type); \ |
ospf_lsa_discard (L); \ |
ospf_lsa_discard (L); \ |
continue; } |
continue; } |
|
|
Line 1821 ospf_ls_upd (struct ip *iph, struct ospf_header *ospfh
|
Line 1796 ospf_ls_upd (struct ip *iph, struct ospf_header *ospfh
|
DISCARD_LSA (lsa,2); |
DISCARD_LSA (lsa,2); |
} |
} |
|
|
|
/* VU229804: Router-LSA Adv-ID must be equal to LS-ID */ |
|
if (lsa->data->type == OSPF_ROUTER_LSA) |
|
if (!IPV4_ADDR_SAME(&lsa->data->id, &lsa->data->adv_router)) |
|
{ |
|
char buf1[INET_ADDRSTRLEN]; |
|
char buf2[INET_ADDRSTRLEN]; |
|
char buf3[INET_ADDRSTRLEN]; |
|
|
|
zlog_err("Incoming Router-LSA from %s with " |
|
"Adv-ID[%s] != LS-ID[%s]", |
|
inet_ntop (AF_INET, &ospfh->router_id, |
|
buf1, INET_ADDRSTRLEN), |
|
inet_ntop (AF_INET, &lsa->data->id, |
|
buf2, INET_ADDRSTRLEN), |
|
inet_ntop (AF_INET, &lsa->data->adv_router, |
|
buf3, INET_ADDRSTRLEN)); |
|
zlog_err("OSPF domain compromised by attack or corruption. " |
|
"Verify correct operation of -ALL- OSPF routers."); |
|
DISCARD_LSA (lsa, 0); |
|
} |
|
|
/* Find the LSA in the current database. */ |
/* Find the LSA in the current database. */ |
|
|
current = ospf_lsa_lookup_by_header (oi->area, lsa->data); |
current = ospf_lsa_lookup_by_header (oi->area, lsa->data); |
Line 1831 ospf_ls_upd (struct ip *iph, struct ospf_header *ospfh
|
Line 1827 ospf_ls_upd (struct ip *iph, struct ospf_header *ospfh
|
then take the following actions: */ |
then take the following actions: */ |
|
|
if (IS_LSA_MAXAGE (lsa) && !current && |
if (IS_LSA_MAXAGE (lsa) && !current && |
(ospf_nbr_count (oi, NSM_Exchange) + | ospf_check_nbr_status(oi->ospf)) |
ospf_nbr_count (oi, NSM_Loading)) == 0) | |
{ |
{ |
/* (4a) Response Link State Acknowledgment. */ |
/* (4a) Response Link State Acknowledgment. */ |
ospf_ls_ack_send (nbr, lsa); |
ospf_ls_ack_send (nbr, lsa); |
Line 1846 ospf_ls_upd (struct ip *iph, struct ospf_header *ospfh
|
Line 1841 ospf_ls_upd (struct ip *iph, struct ospf_header *ospfh
|
DISCARD_LSA (lsa, 3); |
DISCARD_LSA (lsa, 3); |
} |
} |
|
|
#ifdef HAVE_OPAQUE_LSA |
|
if (IS_OPAQUE_LSA (lsa->data->type) |
if (IS_OPAQUE_LSA (lsa->data->type) |
&& IPV4_ADDR_SAME (&lsa->data->adv_router, &oi->ospf->router_id)) |
&& IPV4_ADDR_SAME (&lsa->data->adv_router, &oi->ospf->router_id)) |
{ |
{ |
Line 1894 ospf_ls_upd (struct ip *iph, struct ospf_header *ospfh
|
Line 1888 ospf_ls_upd (struct ip *iph, struct ospf_header *ospfh
|
continue; |
continue; |
} |
} |
} |
} |
#endif /* HAVE_OPAQUE_LSA */ |
|
|
|
/* It might be happen that received LSA is self-originated network LSA, but |
/* It might be happen that received LSA is self-originated network LSA, but |
* router ID is changed. So, we should check if LSA is a network-LSA whose |
* router ID is changed. So, we should check if LSA is a network-LSA whose |
Line 1922 ospf_ls_upd (struct ip *iph, struct ospf_header *ospfh
|
Line 1915 ospf_ls_upd (struct ip *iph, struct ospf_header *ospfh
|
ospf_lsa_flush_area(lsa,out_if->area); |
ospf_lsa_flush_area(lsa,out_if->area); |
if(IS_DEBUG_OSPF_EVENT) |
if(IS_DEBUG_OSPF_EVENT) |
zlog_debug ("ospf_lsa_discard() in ospf_ls_upd() point 9: lsa %p Type-%d", |
zlog_debug ("ospf_lsa_discard() in ospf_ls_upd() point 9: lsa %p Type-%d", |
lsa, (int) lsa->data->type); | (void *)lsa, (int) lsa->data->type); |
ospf_lsa_discard (lsa); |
ospf_lsa_discard (lsa); |
Flag = 1; |
Flag = 1; |
} |
} |
Line 2035 ospf_ls_upd (struct ip *iph, struct ospf_header *ospfh
|
Line 2028 ospf_ls_upd (struct ip *iph, struct ospf_header *ospfh
|
quagga_gettime (QUAGGA_CLK_MONOTONIC, &now); |
quagga_gettime (QUAGGA_CLK_MONOTONIC, &now); |
|
|
if (tv_cmp (tv_sub (now, current->tv_orig), |
if (tv_cmp (tv_sub (now, current->tv_orig), |
int2tv (OSPF_MIN_LS_ARRIVAL)) >= 0) | msec2tv (ospf->min_ls_arrival)) >= 0) |
/* Trap NSSA type later.*/ |
/* Trap NSSA type later.*/ |
ospf_ls_upd_send_lsa (nbr, current, OSPF_SEND_PACKET_DIRECT); |
ospf_ls_upd_send_lsa (nbr, current, OSPF_SEND_PACKET_DIRECT); |
DISCARD_LSA (lsa, 8); |
DISCARD_LSA (lsa, 8); |
Line 2098 ospf_ls_ack (struct ip *iph, struct ospf_header *ospfh
|
Line 2091 ospf_ls_ack (struct ip *iph, struct ospf_header *ospfh
|
|
|
lsr = ospf_ls_retransmit_lookup (nbr, lsa); |
lsr = ospf_ls_retransmit_lookup (nbr, lsa); |
|
|
if (lsr != NULL && lsr->data->ls_seqnum == lsa->data->ls_seqnum) | if (lsr != NULL && ospf_lsa_more_recent (lsr, lsa) == 0) |
{ | ospf_ls_retransmit_delete (nbr, lsr); |
#ifdef HAVE_OPAQUE_LSA | |
if (IS_OPAQUE_LSA (lsr->data->type)) | |
ospf_opaque_ls_ack_received (nbr, lsr); | |
#endif /* HAVE_OPAQUE_LSA */ | |
|
|
ospf_ls_retransmit_delete (nbr, lsr); |
|
} |
|
|
|
lsa->data = NULL; |
lsa->data = NULL; |
ospf_lsa_discard (lsa); |
ospf_lsa_discard (lsa); |
} |
} |
|
|
return; |
return; |
} |
} |
| |
static struct stream * |
static struct stream * |
ospf_recv_packet (int fd, struct interface **ifp, struct stream *ibuf) |
ospf_recv_packet (int fd, struct interface **ifp, struct stream *ibuf) |
{ |
{ |
int ret; |
int ret; |
struct ip *iph; |
struct ip *iph; |
u_int16_t ip_len; |
u_int16_t ip_len; |
unsigned int ifindex = 0; | ifindex_t ifindex = 0; |
struct iovec iov; |
struct iovec iov; |
/* Header and data both require alignment. */ |
/* Header and data both require alignment. */ |
char buff [CMSG_SPACE(SOPT_SIZE_CMSG_IFINDEX_IPV4())]; |
char buff [CMSG_SPACE(SOPT_SIZE_CMSG_IFINDEX_IPV4())]; |
Line 2477 ospf_lsa_examin (struct lsa_header * lsah, const u_int
|
Line 2463 ospf_lsa_examin (struct lsa_header * lsah, const u_int
|
case OSPF_SUMMARY_LSA: |
case OSPF_SUMMARY_LSA: |
case OSPF_ASBR_SUMMARY_LSA: |
case OSPF_ASBR_SUMMARY_LSA: |
/* RFC2328 A.4.4, LSA header + 4 bytes followed by N>=1 4-bytes TOS blocks */ |
/* RFC2328 A.4.4, LSA header + 4 bytes followed by N>=1 4-bytes TOS blocks */ |
#ifdef HAVE_OPAQUE_LSA |
|
case OSPF_OPAQUE_LINK_LSA: |
case OSPF_OPAQUE_LINK_LSA: |
case OSPF_OPAQUE_AREA_LSA: |
case OSPF_OPAQUE_AREA_LSA: |
case OSPF_OPAQUE_AS_LSA: |
case OSPF_OPAQUE_AS_LSA: |
Line 2485 ospf_lsa_examin (struct lsa_header * lsah, const u_int
|
Line 2470 ospf_lsa_examin (struct lsa_header * lsah, const u_int
|
* data) padded to 32-bit alignment." This is considered equivalent |
* data) padded to 32-bit alignment." This is considered equivalent |
* to 4-byte alignment of all other LSA types, see OSPF-ALIGNMENT.txt |
* to 4-byte alignment of all other LSA types, see OSPF-ALIGNMENT.txt |
* file for the detailed analysis of this passage. */ |
* file for the detailed analysis of this passage. */ |
#endif |
|
ret = lsalen % 4 ? MSG_NG : MSG_OK; |
ret = lsalen % 4 ? MSG_NG : MSG_OK; |
break; |
break; |
default: |
default: |
Line 2928 ospf_read (struct thread *thread)
|
Line 2912 ospf_read (struct thread *thread)
|
ospf_ls_req (iph, ospfh, ibuf, oi, length); |
ospf_ls_req (iph, ospfh, ibuf, oi, length); |
break; |
break; |
case OSPF_MSG_LS_UPD: |
case OSPF_MSG_LS_UPD: |
ospf_ls_upd (iph, ospfh, ibuf, oi, length); | ospf_ls_upd (ospf, iph, ospfh, ibuf, oi, length); |
break; |
break; |
case OSPF_MSG_LS_ACK: |
case OSPF_MSG_LS_ACK: |
ospf_ls_ack (iph, ospfh, ibuf, oi, length); |
ospf_ls_ack (iph, ospfh, ibuf, oi, length); |
Line 3116 ospf_make_db_desc (struct ospf_interface *oi, struct o
|
Line 3100 ospf_make_db_desc (struct ospf_interface *oi, struct o
|
|
|
/* Set Options. */ |
/* Set Options. */ |
options = OPTIONS (oi); |
options = OPTIONS (oi); |
#ifdef HAVE_OPAQUE_LSA |
|
if (CHECK_FLAG (oi->ospf->config, OSPF_OPAQUE_CAPABLE)) |
if (CHECK_FLAG (oi->ospf->config, OSPF_OPAQUE_CAPABLE)) |
{ | SET_FLAG (options, OSPF_OPTION_O); |
if (IS_SET_DD_I (nbr->dd_flags) | |
|| CHECK_FLAG (nbr->options, OSPF_OPTION_O)) | |
/* | |
* Set O-bit in the outgoing DD packet for capablity negotiation, | |
* if one of following case is applicable. | |
* | |
* 1) WaitTimer expiration event triggered the neighbor state to | |
* change to Exstart, but no (valid) DD packet has received | |
* from the neighbor yet. | |
* | |
* 2) At least one DD packet with O-bit on has received from the | |
* neighbor. | |
*/ | |
SET_FLAG (options, OSPF_OPTION_O); | |
} | |
#endif /* HAVE_OPAQUE_LSA */ | |
stream_putc (s, options); |
stream_putc (s, options); |
|
|
/* DD flags */ |
/* DD flags */ |
Line 3159 ospf_make_db_desc (struct ospf_interface *oi, struct o
|
Line 3126 ospf_make_db_desc (struct ospf_interface *oi, struct o
|
for (rn = route_top (table); rn; rn = route_next (rn)) |
for (rn = route_top (table); rn; rn = route_next (rn)) |
if ((lsa = rn->info) != NULL) |
if ((lsa = rn->info) != NULL) |
{ |
{ |
#ifdef HAVE_OPAQUE_LSA |
|
if (IS_OPAQUE_LSA (lsa->data->type) |
if (IS_OPAQUE_LSA (lsa->data->type) |
&& (! CHECK_FLAG (options, OSPF_OPTION_O))) |
&& (! CHECK_FLAG (options, OSPF_OPTION_O))) |
{ |
{ |
Line 3168 ospf_make_db_desc (struct ospf_interface *oi, struct o
|
Line 3134 ospf_make_db_desc (struct ospf_interface *oi, struct o
|
ospf_lsdb_delete (lsdb, lsa); |
ospf_lsdb_delete (lsdb, lsa); |
continue; |
continue; |
} |
} |
#endif /* HAVE_OPAQUE_LSA */ |
|
|
|
if (!CHECK_FLAG (lsa->flags, OSPF_LSA_DISCARD)) |
if (!CHECK_FLAG (lsa->flags, OSPF_LSA_DISCARD)) |
{ |
{ |
Line 3304 ospf_make_ls_upd (struct ospf_interface *oi, struct li
|
Line 3269 ospf_make_ls_upd (struct ospf_interface *oi, struct li
|
u_int16_t ls_age; |
u_int16_t ls_age; |
|
|
if (IS_DEBUG_OSPF_EVENT) |
if (IS_DEBUG_OSPF_EVENT) |
zlog_debug ("ospf_make_ls_upd: List Iteration"); | zlog_debug ("ospf_make_ls_upd: List Iteration %d", count); |
|
|
lsa = listgetdata (node); |
lsa = listgetdata (node); |
|
|
Line 3710 ospf_ls_upd_queue_send (struct ospf_interface *oi, str
|
Line 3675 ospf_ls_upd_queue_send (struct ospf_interface *oi, str
|
u_int16_t length = OSPF_HEADER_SIZE; |
u_int16_t length = OSPF_HEADER_SIZE; |
|
|
if (IS_DEBUG_OSPF_EVENT) |
if (IS_DEBUG_OSPF_EVENT) |
zlog_debug ("listcount = %d, dst %s", listcount (update), inet_ntoa(addr)); | zlog_debug ("listcount = %d, [%s]dst %s", listcount (update), IF_NAME(oi), |
| inet_ntoa(addr)); |
|
|
op = ospf_ls_upd_packet_new (update, oi); |
op = ospf_ls_upd_packet_new (update, oi); |
|
|
Line 3832 ospf_ls_upd_send (struct ospf_neighbor *nbr, struct li
|
Line 3798 ospf_ls_upd_send (struct ospf_neighbor *nbr, struct li
|
|
|
if (rn->info == NULL) |
if (rn->info == NULL) |
rn->info = list_new (); |
rn->info = list_new (); |
|
else |
|
route_unlock_node (rn); |
|
|
for (ALL_LIST_ELEMENTS_RO (update, node, lsa)) |
for (ALL_LIST_ELEMENTS_RO (update, node, lsa)) |
listnode_add (rn->info, ospf_lsa_lock (lsa)); /* oi->ls_upd_queue */ |
listnode_add (rn->info, ospf_lsa_lock (lsa)); /* oi->ls_upd_queue */ |