2 * OSPF Sending and Receiving OSPF Packets.
3 * Copyright (C) 1999, 2000 Toshiaki Takada
5 * This file is part of GNU Zebra.
7 * GNU Zebra is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation; either version 2, or (at your option) any
12 * GNU Zebra is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with GNU Zebra; see the file COPYING. If not, write to the Free
19 * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
31 #include "sockunion.h"
38 #include "ospfd/ospfd.h"
39 #include "ospfd/ospf_network.h"
40 #include "ospfd/ospf_interface.h"
41 #include "ospfd/ospf_ism.h"
42 #include "ospfd/ospf_asbr.h"
43 #include "ospfd/ospf_lsa.h"
44 #include "ospfd/ospf_lsdb.h"
45 #include "ospfd/ospf_neighbor.h"
46 #include "ospfd/ospf_nsm.h"
47 #include "ospfd/ospf_packet.h"
48 #include "ospfd/ospf_spf.h"
49 #include "ospfd/ospf_flood.h"
50 #include "ospfd/ospf_dump.h"
52 /* Packet Type String. */
53 const struct message ospf_packet_type_str
[] =
55 { OSPF_MSG_HELLO
, "Hello" },
56 { OSPF_MSG_DB_DESC
, "Database Description" },
57 { OSPF_MSG_LS_REQ
, "Link State Request" },
58 { OSPF_MSG_LS_UPD
, "Link State Update" },
59 { OSPF_MSG_LS_ACK
, "Link State Acknowledgment" },
61 const size_t ospf_packet_type_str_max
= sizeof (ospf_packet_type_str
) /
62 sizeof (ospf_packet_type_str
[0]);
64 /* Minimum (besides OSPF_HEADER_SIZE) lengths for OSPF packets of
65 particular types, offset is the "type" field of a packet. */
66 static const u_int16_t ospf_packet_minlen
[] =
70 OSPF_DB_DESC_MIN_SIZE
,
76 /* Minimum (besides OSPF_LSA_HEADER_SIZE) lengths for LSAs of particular
77 types, offset is the "LSA type" field. */
78 static const u_int16_t ospf_lsa_minlen
[] =
81 OSPF_ROUTER_LSA_MIN_SIZE
,
82 OSPF_NETWORK_LSA_MIN_SIZE
,
83 OSPF_SUMMARY_LSA_MIN_SIZE
,
84 OSPF_SUMMARY_LSA_MIN_SIZE
,
85 OSPF_AS_EXTERNAL_LSA_MIN_SIZE
,
87 OSPF_AS_EXTERNAL_LSA_MIN_SIZE
,
94 /* for ospf_check_auth() */
95 static int ospf_check_sum (struct ospf_header
*);
97 /* OSPF authentication checking function */
99 ospf_auth_type (struct ospf_interface
*oi
)
103 if (OSPF_IF_PARAM (oi
, auth_type
) == OSPF_AUTH_NOTSET
)
104 auth_type
= oi
->area
->auth_type
;
106 auth_type
= OSPF_IF_PARAM (oi
, auth_type
);
108 /* Handle case where MD5 key list is not configured aka Cisco */
109 if (auth_type
== OSPF_AUTH_CRYPTOGRAPHIC
&&
110 list_isempty (OSPF_IF_PARAM (oi
, auth_crypt
)))
111 return OSPF_AUTH_NULL
;
118 ospf_packet_new (size_t size
)
120 struct ospf_packet
*new;
122 new = XCALLOC (MTYPE_OSPF_PACKET
, sizeof (struct ospf_packet
));
123 new->s
= stream_new (size
);
129 ospf_packet_free (struct ospf_packet
*op
)
134 XFREE (MTYPE_OSPF_PACKET
, op
);
142 struct ospf_fifo
*new;
144 new = XCALLOC (MTYPE_OSPF_FIFO
, sizeof (struct ospf_fifo
));
148 /* Add new packet to fifo. */
150 ospf_fifo_push (struct ospf_fifo
*fifo
, struct ospf_packet
*op
)
153 fifo
->tail
->next
= op
;
162 /* Add new packet to head of fifo. */
164 ospf_fifo_push_head (struct ospf_fifo
*fifo
, struct ospf_packet
*op
)
166 op
->next
= fifo
->head
;
168 if (fifo
->tail
== NULL
)
176 /* Delete first packet from fifo. */
178 ospf_fifo_pop (struct ospf_fifo
*fifo
)
180 struct ospf_packet
*op
;
186 fifo
->head
= op
->next
;
188 if (fifo
->head
== NULL
)
197 /* Return first fifo entry. */
199 ospf_fifo_head (struct ospf_fifo
*fifo
)
204 /* Flush ospf packet fifo. */
206 ospf_fifo_flush (struct ospf_fifo
*fifo
)
208 struct ospf_packet
*op
;
209 struct ospf_packet
*next
;
211 for (op
= fifo
->head
; op
; op
= next
)
214 ospf_packet_free (op
);
216 fifo
->head
= fifo
->tail
= NULL
;
220 /* Free ospf packet fifo. */
222 ospf_fifo_free (struct ospf_fifo
*fifo
)
224 ospf_fifo_flush (fifo
);
226 XFREE (MTYPE_OSPF_FIFO
, fifo
);
230 ospf_packet_add (struct ospf_interface
*oi
, struct ospf_packet
*op
)
234 zlog_err("ospf_packet_add(interface %s in state %d [%s], packet type %s, "
235 "destination %s) called with NULL obuf, ignoring "
236 "(please report this bug)!\n",
237 IF_NAME(oi
), oi
->state
, LOOKUP (ospf_ism_state_msg
, oi
->state
),
238 LOOKUP (ospf_packet_type_str
, stream_getc_from(op
->s
, 1)),
239 inet_ntoa (op
->dst
));
243 /* Add packet to end of queue. */
244 ospf_fifo_push (oi
->obuf
, op
);
246 /* Debug of packet fifo*/
247 /* ospf_fifo_debug (oi->obuf); */
251 ospf_packet_add_top (struct ospf_interface
*oi
, struct ospf_packet
*op
)
255 zlog_err("ospf_packet_add(interface %s in state %d [%s], packet type %s, "
256 "destination %s) called with NULL obuf, ignoring "
257 "(please report this bug)!\n",
258 IF_NAME(oi
), oi
->state
, LOOKUP (ospf_ism_state_msg
, oi
->state
),
259 LOOKUP (ospf_packet_type_str
, stream_getc_from(op
->s
, 1)),
260 inet_ntoa (op
->dst
));
264 /* Add packet to head of queue. */
265 ospf_fifo_push_head (oi
->obuf
, op
);
267 /* Debug of packet fifo*/
268 /* ospf_fifo_debug (oi->obuf); */
272 ospf_packet_delete (struct ospf_interface
*oi
)
274 struct ospf_packet
*op
;
276 op
= ospf_fifo_pop (oi
->obuf
);
279 ospf_packet_free (op
);
283 ospf_packet_dup (struct ospf_packet
*op
)
285 struct ospf_packet
*new;
287 if (stream_get_endp(op
->s
) != op
->length
)
289 zlog_warn ("ospf_packet_dup stream %lu ospf_packet %u size mismatch",
290 (u_long
)STREAM_SIZE(op
->s
), op
->length
);
292 /* Reserve space for MD5 authentication that may be added later. */
293 new = ospf_packet_new (stream_get_endp(op
->s
) + OSPF_AUTH_MD5_SIZE
);
294 stream_copy (new->s
, op
->s
);
297 new->length
= op
->length
;
304 ospf_packet_authspace (struct ospf_interface
*oi
)
308 if ( ospf_auth_type (oi
) == OSPF_AUTH_CRYPTOGRAPHIC
)
309 auth
= OSPF_AUTH_MD5_SIZE
;
315 ospf_packet_max (struct ospf_interface
*oi
)
319 max
= oi
->ifp
->mtu
- ospf_packet_authspace(oi
);
321 max
-= (OSPF_HEADER_SIZE
+ sizeof (struct ip
));
328 ospf_check_md5_digest (struct ospf_interface
*oi
, struct ospf_header
*ospfh
)
331 unsigned char digest
[OSPF_AUTH_MD5_SIZE
];
332 struct crypt_key
*ck
;
333 struct ospf_neighbor
*nbr
;
334 u_int16_t length
= ntohs (ospfh
->length
);
336 /* Get secret key. */
337 ck
= ospf_crypt_key_lookup (OSPF_IF_PARAM (oi
, auth_crypt
),
338 ospfh
->u
.crypt
.key_id
);
341 zlog_warn ("interface %s: ospf_check_md5 no key %d",
342 IF_NAME (oi
), ospfh
->u
.crypt
.key_id
);
346 /* check crypto seqnum. */
347 nbr
= ospf_nbr_lookup_by_routerid (oi
->nbrs
, &ospfh
->router_id
);
349 if (nbr
&& ntohl(nbr
->crypt_seqnum
) > ntohl(ospfh
->u
.crypt
.crypt_seqnum
))
351 zlog_warn ("interface %s: ospf_check_md5 bad sequence %d (expect %d)",
353 ntohl(ospfh
->u
.crypt
.crypt_seqnum
),
354 ntohl(nbr
->crypt_seqnum
));
358 /* Generate a digest for the ospf packet - their digest + our digest. */
359 memset(&ctx
, 0, sizeof(ctx
));
361 MD5Update(&ctx
, ospfh
, length
);
362 MD5Update(&ctx
, ck
->auth_key
, OSPF_AUTH_MD5_SIZE
);
363 MD5Final(digest
, &ctx
);
365 /* compare the two */
366 if (memcmp ((caddr_t
)ospfh
+ length
, digest
, OSPF_AUTH_MD5_SIZE
))
368 zlog_warn ("interface %s: ospf_check_md5 checksum mismatch",
373 /* save neighbor's crypt_seqnum */
375 nbr
->crypt_seqnum
= ospfh
->u
.crypt
.crypt_seqnum
;
379 /* This function is called from ospf_write(), it will detect the
380 authentication scheme and if it is MD5, it will change the sequence
381 and update the MD5 digest. */
383 ospf_make_md5_digest (struct ospf_interface
*oi
, struct ospf_packet
*op
)
385 struct ospf_header
*ospfh
;
386 unsigned char digest
[OSPF_AUTH_MD5_SIZE
];
390 struct crypt_key
*ck
;
391 const u_int8_t
*auth_key
;
393 ibuf
= STREAM_DATA (op
->s
);
394 ospfh
= (struct ospf_header
*) ibuf
;
396 if (ntohs (ospfh
->auth_type
) != OSPF_AUTH_CRYPTOGRAPHIC
)
399 /* We do this here so when we dup a packet, we don't have to
400 waste CPU rewriting other headers.
402 Note that quagga_time /deliberately/ is not used here */
403 t
= (time(NULL
) & 0xFFFFFFFF);
404 if (t
> oi
->crypt_seqnum
)
405 oi
->crypt_seqnum
= t
;
409 ospfh
->u
.crypt
.crypt_seqnum
= htonl (oi
->crypt_seqnum
);
411 /* Get MD5 Authentication key from auth_key list. */
412 if (list_isempty (OSPF_IF_PARAM (oi
, auth_crypt
)))
413 auth_key
= (const u_int8_t
*) "";
416 ck
= listgetdata (listtail(OSPF_IF_PARAM (oi
, auth_crypt
)));
417 auth_key
= ck
->auth_key
;
420 /* Generate a digest for the entire packet + our secret key. */
421 memset(&ctx
, 0, sizeof(ctx
));
423 MD5Update(&ctx
, ibuf
, ntohs (ospfh
->length
));
424 MD5Update(&ctx
, auth_key
, OSPF_AUTH_MD5_SIZE
);
425 MD5Final(digest
, &ctx
);
427 /* Append md5 digest to the end of the stream. */
428 stream_put (op
->s
, digest
, OSPF_AUTH_MD5_SIZE
);
430 /* We do *NOT* increment the OSPF header length. */
431 op
->length
= ntohs (ospfh
->length
) + OSPF_AUTH_MD5_SIZE
;
433 if (stream_get_endp(op
->s
) != op
->length
)
435 zlog_warn("ospf_make_md5_digest: length mismatch stream %lu ospf_packet %u",
436 (u_long
)stream_get_endp(op
->s
), op
->length
);
438 return OSPF_AUTH_MD5_SIZE
;
443 ospf_ls_req_timer (struct thread
*thread
)
445 struct ospf_neighbor
*nbr
;
447 nbr
= THREAD_ARG (thread
);
448 nbr
->t_ls_req
= NULL
;
450 /* Send Link State Request. */
451 if (ospf_ls_request_count (nbr
))
452 ospf_ls_req_send (nbr
);
454 /* Set Link State Request retransmission timer. */
455 OSPF_NSM_TIMER_ON (nbr
->t_ls_req
, ospf_ls_req_timer
, nbr
->v_ls_req
);
461 ospf_ls_req_event (struct ospf_neighbor
*nbr
)
465 thread_cancel (nbr
->t_ls_req
);
466 nbr
->t_ls_req
= NULL
;
468 nbr
->t_ls_req
= thread_add_event (master
, ospf_ls_req_timer
, nbr
, 0);
471 /* Cyclic timer function. Fist registered in ospf_nbr_new () in
474 ospf_ls_upd_timer (struct thread
*thread
)
476 struct ospf_neighbor
*nbr
;
478 nbr
= THREAD_ARG (thread
);
479 nbr
->t_ls_upd
= NULL
;
481 /* Send Link State Update. */
482 if (ospf_ls_retransmit_count (nbr
) > 0)
485 struct ospf_lsdb
*lsdb
;
487 int retransmit_interval
;
489 retransmit_interval
= OSPF_IF_PARAM (nbr
->oi
, retransmit_interval
);
491 lsdb
= &nbr
->ls_rxmt
;
492 update
= list_new ();
494 for (i
= OSPF_MIN_LSA
; i
< OSPF_MAX_LSA
; i
++)
496 struct route_table
*table
= lsdb
->type
[i
].db
;
497 struct route_node
*rn
;
499 for (rn
= route_top (table
); rn
; rn
= route_next (rn
))
501 struct ospf_lsa
*lsa
;
503 if ((lsa
= rn
->info
) != NULL
)
504 /* Don't retransmit an LSA if we received it within
505 the last RxmtInterval seconds - this is to allow the
506 neighbour a chance to acknowledge the LSA as it may
507 have ben just received before the retransmit timer
508 fired. This is a small tweak to what is in the RFC,
509 but it will cut out out a lot of retransmit traffic
511 if (tv_cmp (tv_sub (recent_relative_time (), lsa
->tv_recv
),
512 int2tv (retransmit_interval
)) >= 0)
513 listnode_add (update
, rn
->info
);
517 if (listcount (update
) > 0)
518 ospf_ls_upd_send (nbr
, update
, OSPF_SEND_PACKET_DIRECT
);
519 list_delete (update
);
522 /* Set LS Update retransmission timer. */
523 OSPF_NSM_TIMER_ON (nbr
->t_ls_upd
, ospf_ls_upd_timer
, nbr
->v_ls_upd
);
529 ospf_ls_ack_timer (struct thread
*thread
)
531 struct ospf_interface
*oi
;
533 oi
= THREAD_ARG (thread
);
536 /* Send Link State Acknowledgment. */
537 if (listcount (oi
->ls_ack
) > 0)
538 ospf_ls_ack_send_delayed (oi
);
540 /* Set LS Ack timer. */
541 OSPF_ISM_TIMER_ON (oi
->t_ls_ack
, ospf_ls_ack_timer
, oi
->v_ls_ack
);
546 #ifdef WANT_OSPF_WRITE_FRAGMENT
548 ospf_write_frags (int fd
, struct ospf_packet
*op
, struct ip
*iph
,
549 struct msghdr
*msg
, unsigned int maxdatasize
,
550 unsigned int mtu
, int flags
, u_char type
)
552 #define OSPF_WRITE_FRAG_SHIFT 3
557 assert ( op
->length
== stream_get_endp(op
->s
) );
558 assert (msg
->msg_iovlen
== 2);
562 * SunOS, BSD and BSD derived kernels likely will clear ip_id, as
563 * well as the IP_MF flag, making this all quite pointless.
565 * However, for a system on which IP_MF is left alone, and ip_id left
566 * alone or else which sets same ip_id for each fragment this might
569 * XXX-TODO: It would be much nicer to have the kernel's use their
570 * existing fragmentation support to do this for us. Bugs/RFEs need to
571 * be raised against the various kernels.
575 iph
->ip_off
|= IP_MF
;
577 /* ip frag offset is expressed in units of 8byte words */
578 offset
= maxdatasize
>> OSPF_WRITE_FRAG_SHIFT
;
580 iovp
= &msg
->msg_iov
[1];
582 while ( (stream_get_endp(op
->s
) - stream_get_getp (op
->s
))
585 /* data length of this frag is to next offset value */
586 iovp
->iov_len
= offset
<< OSPF_WRITE_FRAG_SHIFT
;
587 iph
->ip_len
= iovp
->iov_len
+ sizeof (struct ip
);
588 assert (iph
->ip_len
<= mtu
);
590 sockopt_iphdrincl_swab_htosys (iph
);
592 ret
= sendmsg (fd
, msg
, flags
);
594 sockopt_iphdrincl_swab_systoh (iph
);
597 zlog_warn ("*** ospf_write_frags: sendmsg failed to %s,"
598 " id %d, off %d, len %d, mtu %u failed with %s",
599 inet_ntoa (iph
->ip_dst
),
604 safe_strerror (errno
));
606 if (IS_DEBUG_OSPF_PACKET (type
- 1, SEND
))
608 zlog_debug ("ospf_write_frags: sent id %d, off %d, len %d to %s\n",
609 iph
->ip_id
, iph
->ip_off
, iph
->ip_len
,
610 inet_ntoa (iph
->ip_dst
));
611 if (IS_DEBUG_OSPF_PACKET (type
- 1, DETAIL
))
613 zlog_debug ("-----------------IP Header Dump----------------------");
614 ospf_ip_header_dump (iph
);
615 zlog_debug ("-----------------------------------------------------");
619 iph
->ip_off
+= offset
;
620 stream_forward_getp (op
->s
, iovp
->iov_len
);
621 iovp
->iov_base
= STREAM_PNT (op
->s
);
624 /* setup for final fragment */
625 iovp
->iov_len
= stream_get_endp(op
->s
) - stream_get_getp (op
->s
);
626 iph
->ip_len
= iovp
->iov_len
+ sizeof (struct ip
);
627 iph
->ip_off
&= (~IP_MF
);
629 #endif /* WANT_OSPF_WRITE_FRAGMENT */
632 ospf_write (struct thread
*thread
)
634 struct ospf
*ospf
= THREAD_ARG (thread
);
635 struct ospf_interface
*oi
;
636 struct ospf_packet
*op
;
637 struct sockaddr_in sa_dst
;
644 struct listnode
*node
;
645 #ifdef WANT_OSPF_WRITE_FRAGMENT
646 static u_int16_t ipid
= 0;
647 #endif /* WANT_OSPF_WRITE_FRAGMENT */
648 u_int16_t maxdatasize
;
649 #define OSPF_WRITE_IPHL_SHIFT 2
651 ospf
->t_write
= NULL
;
653 node
= listhead (ospf
->oi_write_q
);
655 oi
= listgetdata (node
);
658 #ifdef WANT_OSPF_WRITE_FRAGMENT
659 /* seed ipid static with low order bits of time */
661 ipid
= (time(NULL
) & 0xffff);
662 #endif /* WANT_OSPF_WRITE_FRAGMENT */
664 /* convenience - max OSPF data per packet,
665 * and reliability - not more data, than our
668 maxdatasize
= MIN (oi
->ifp
->mtu
, ospf
->maxsndbuflen
) -
671 /* Get one packet from queue. */
672 op
= ospf_fifo_head (oi
->obuf
);
674 assert (op
->length
>= OSPF_HEADER_SIZE
);
676 if (op
->dst
.s_addr
== htonl (OSPF_ALLSPFROUTERS
)
677 || op
->dst
.s_addr
== htonl (OSPF_ALLDROUTERS
))
678 ospf_if_ipmulticast (ospf
, oi
->address
, oi
->ifp
->ifindex
);
680 /* Rewrite the md5 signature & update the seq */
681 ospf_make_md5_digest (oi
, op
);
683 /* Retrieve OSPF packet type. */
684 stream_set_getp (op
->s
, 1);
685 type
= stream_getc (op
->s
);
687 /* reset get pointer */
688 stream_set_getp (op
->s
, 0);
690 memset (&iph
, 0, sizeof (struct ip
));
691 memset (&sa_dst
, 0, sizeof (sa_dst
));
693 sa_dst
.sin_family
= AF_INET
;
694 #ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
695 sa_dst
.sin_len
= sizeof(sa_dst
);
696 #endif /* HAVE_STRUCT_SOCKADDR_IN_SIN_LEN */
697 sa_dst
.sin_addr
= op
->dst
;
698 sa_dst
.sin_port
= htons (0);
700 /* Set DONTROUTE flag if dst is unicast. */
701 if (oi
->type
!= OSPF_IFTYPE_VIRTUALLINK
)
702 if (!IN_MULTICAST (htonl (op
->dst
.s_addr
)))
703 flags
= MSG_DONTROUTE
;
705 iph
.ip_hl
= sizeof (struct ip
) >> OSPF_WRITE_IPHL_SHIFT
;
706 /* it'd be very strange for header to not be 4byte-word aligned but.. */
707 if ( sizeof (struct ip
)
708 > (unsigned int)(iph
.ip_hl
<< OSPF_WRITE_IPHL_SHIFT
) )
709 iph
.ip_hl
++; /* we presume sizeof struct ip cant overflow ip_hl.. */
711 iph
.ip_v
= IPVERSION
;
712 iph
.ip_tos
= IPTOS_PREC_INTERNETCONTROL
;
713 iph
.ip_len
= (iph
.ip_hl
<< OSPF_WRITE_IPHL_SHIFT
) + op
->length
;
715 #if defined(__DragonFly__)
717 * DragonFly's raw socket expects ip_len/ip_off in network byte order.
719 iph
.ip_len
= htons(iph
.ip_len
);
722 #ifdef WANT_OSPF_WRITE_FRAGMENT
723 /* XXX-MT: not thread-safe at all..
724 * XXX: this presumes this is only programme sending OSPF packets
725 * otherwise, no guarantee ipid will be unique
728 #endif /* WANT_OSPF_WRITE_FRAGMENT */
731 if (oi
->type
== OSPF_IFTYPE_VIRTUALLINK
)
732 iph
.ip_ttl
= OSPF_VL_IP_TTL
;
734 iph
.ip_ttl
= OSPF_IP_TTL
;
735 iph
.ip_p
= IPPROTO_OSPFIGP
;
737 iph
.ip_src
.s_addr
= oi
->address
->u
.prefix4
.s_addr
;
738 iph
.ip_dst
.s_addr
= op
->dst
.s_addr
;
740 memset (&msg
, 0, sizeof (msg
));
741 msg
.msg_name
= (caddr_t
) &sa_dst
;
742 msg
.msg_namelen
= sizeof (sa_dst
);
745 iov
[0].iov_base
= (char*)&iph
;
746 iov
[0].iov_len
= iph
.ip_hl
<< OSPF_WRITE_IPHL_SHIFT
;
747 iov
[1].iov_base
= STREAM_PNT (op
->s
);
748 iov
[1].iov_len
= op
->length
;
750 /* Sadly we can not rely on kernels to fragment packets because of either
751 * IP_HDRINCL and/or multicast destination being set.
753 #ifdef WANT_OSPF_WRITE_FRAGMENT
754 if ( op
->length
> maxdatasize
)
755 ospf_write_frags (ospf
->fd
, op
, &iph
, &msg
, maxdatasize
,
756 oi
->ifp
->mtu
, flags
, type
);
757 #endif /* WANT_OSPF_WRITE_FRAGMENT */
759 /* send final fragment (could be first) */
760 sockopt_iphdrincl_swab_htosys (&iph
);
761 ret
= sendmsg (ospf
->fd
, &msg
, flags
);
762 sockopt_iphdrincl_swab_systoh (&iph
);
765 zlog_warn ("*** sendmsg in ospf_write failed to %s, "
766 "id %d, off %d, len %d, interface %s, mtu %u: %s",
767 inet_ntoa (iph
.ip_dst
), iph
.ip_id
, iph
.ip_off
, iph
.ip_len
,
768 oi
->ifp
->name
, oi
->ifp
->mtu
, safe_strerror (errno
));
770 /* Show debug sending packet. */
771 if (IS_DEBUG_OSPF_PACKET (type
- 1, SEND
))
773 if (IS_DEBUG_OSPF_PACKET (type
- 1, DETAIL
))
775 zlog_debug ("-----------------------------------------------------");
776 ospf_ip_header_dump (&iph
);
777 stream_set_getp (op
->s
, 0);
778 ospf_packet_dump (op
->s
);
781 zlog_debug ("%s sent to [%s] via [%s].",
782 LOOKUP (ospf_packet_type_str
, type
), inet_ntoa (op
->dst
),
785 if (IS_DEBUG_OSPF_PACKET (type
- 1, DETAIL
))
786 zlog_debug ("-----------------------------------------------------");
789 /* Now delete packet from queue. */
790 ospf_packet_delete (oi
);
792 if (ospf_fifo_head (oi
->obuf
) == NULL
)
795 list_delete_node (ospf
->oi_write_q
, node
);
798 /* If packets still remain in queue, call write thread. */
799 if (!list_isempty (ospf
->oi_write_q
))
801 thread_add_write (master
, ospf_write
, ospf
, ospf
->fd
);
806 /* OSPF Hello message read -- RFC2328 Section 10.5. */
808 ospf_hello (struct ip
*iph
, struct ospf_header
*ospfh
,
809 struct stream
* s
, struct ospf_interface
*oi
, int size
)
811 struct ospf_hello
*hello
;
812 struct ospf_neighbor
*nbr
;
816 /* increment statistics. */
819 hello
= (struct ospf_hello
*) STREAM_PNT (s
);
821 /* If Hello is myself, silently discard. */
822 if (IPV4_ADDR_SAME (&ospfh
->router_id
, &oi
->ospf
->router_id
))
824 if (IS_DEBUG_OSPF_PACKET (ospfh
->type
- 1, RECV
))
826 zlog_debug ("ospf_header[%s/%s]: selforiginated, "
828 LOOKUP (ospf_packet_type_str
, ospfh
->type
),
829 inet_ntoa (iph
->ip_src
));
834 /* get neighbor prefix. */
836 p
.prefixlen
= ip_masklen (hello
->network_mask
);
837 p
.u
.prefix4
= iph
->ip_src
;
839 /* Compare network mask. */
840 /* Checking is ignored for Point-to-Point and Virtual link. */
841 if (oi
->type
!= OSPF_IFTYPE_POINTOPOINT
842 && oi
->type
!= OSPF_IFTYPE_VIRTUALLINK
)
843 if (oi
->address
->prefixlen
!= p
.prefixlen
)
845 zlog_warn ("Packet %s [Hello:RECV]: NetworkMask mismatch on %s (configured prefix length is %d, but hello packet indicates %d).",
846 inet_ntoa(ospfh
->router_id
), IF_NAME(oi
),
847 (int)oi
->address
->prefixlen
, (int)p
.prefixlen
);
851 /* Compare Router Dead Interval. */
852 if (OSPF_IF_PARAM (oi
, v_wait
) != ntohl (hello
->dead_interval
))
854 zlog_warn ("Packet %s [Hello:RECV]: RouterDeadInterval mismatch "
855 "(expected %u, but received %u).",
856 inet_ntoa(ospfh
->router_id
),
857 OSPF_IF_PARAM(oi
, v_wait
), ntohl(hello
->dead_interval
));
861 /* Compare Hello Interval - ignored if fast-hellos are set. */
862 if (OSPF_IF_PARAM (oi
, fast_hello
) == 0)
864 if (OSPF_IF_PARAM (oi
, v_hello
) != ntohs (hello
->hello_interval
))
866 zlog_warn ("Packet %s [Hello:RECV]: HelloInterval mismatch "
867 "(expected %u, but received %u).",
868 inet_ntoa(ospfh
->router_id
),
869 OSPF_IF_PARAM(oi
, v_hello
), ntohs(hello
->hello_interval
));
874 if (IS_DEBUG_OSPF_EVENT
)
875 zlog_debug ("Packet %s [Hello:RECV]: Options %s",
876 inet_ntoa (ospfh
->router_id
),
877 ospf_options_dump (hello
->options
));
879 /* Compare options. */
880 #define REJECT_IF_TBIT_ON 1 /* XXX */
881 #ifdef REJECT_IF_TBIT_ON
882 if (CHECK_FLAG (hello
->options
, OSPF_OPTION_T
))
885 * This router does not support non-zero TOS.
886 * Drop this Hello packet not to establish neighbor relationship.
888 zlog_warn ("Packet %s [Hello:RECV]: T-bit on, drop it.",
889 inet_ntoa (ospfh
->router_id
));
892 #endif /* REJECT_IF_TBIT_ON */
894 #ifdef HAVE_OPAQUE_LSA
895 if (CHECK_FLAG (oi
->ospf
->config
, OSPF_OPAQUE_CAPABLE
)
896 && CHECK_FLAG (hello
->options
, OSPF_OPTION_O
))
899 * This router does know the correct usage of O-bit
900 * the bit should be set in DD packet only.
902 zlog_warn ("Packet %s [Hello:RECV]: O-bit abuse?",
903 inet_ntoa (ospfh
->router_id
));
904 #ifdef STRICT_OBIT_USAGE_CHECK
905 return; /* Reject this packet. */
906 #else /* STRICT_OBIT_USAGE_CHECK */
907 UNSET_FLAG (hello
->options
, OSPF_OPTION_O
); /* Ignore O-bit. */
908 #endif /* STRICT_OBIT_USAGE_CHECK */
910 #endif /* HAVE_OPAQUE_LSA */
912 /* new for NSSA is to ensure that NP is on and E is off */
914 if (oi
->area
->external_routing
== OSPF_AREA_NSSA
)
916 if (! (CHECK_FLAG (OPTIONS (oi
), OSPF_OPTION_NP
)
917 && CHECK_FLAG (hello
->options
, OSPF_OPTION_NP
)
918 && ! CHECK_FLAG (OPTIONS (oi
), OSPF_OPTION_E
)
919 && ! CHECK_FLAG (hello
->options
, OSPF_OPTION_E
)))
921 zlog_warn ("NSSA-Packet-%s[Hello:RECV]: my options: %x, his options %x", inet_ntoa (ospfh
->router_id
), OPTIONS (oi
), hello
->options
);
924 if (IS_DEBUG_OSPF_NSSA
)
925 zlog_debug ("NSSA-Hello:RECV:Packet from %s:", inet_ntoa(ospfh
->router_id
));
928 /* The setting of the E-bit found in the Hello Packet's Options
929 field must match this area's ExternalRoutingCapability A
930 mismatch causes processing to stop and the packet to be
931 dropped. The setting of the rest of the bits in the Hello
932 Packet's Options field should be ignored. */
933 if (CHECK_FLAG (OPTIONS (oi
), OSPF_OPTION_E
) !=
934 CHECK_FLAG (hello
->options
, OSPF_OPTION_E
))
936 zlog_warn ("Packet %s [Hello:RECV]: my options: %x, his options %x",
937 inet_ntoa(ospfh
->router_id
), OPTIONS (oi
), hello
->options
);
941 /* get neighbour struct */
942 nbr
= ospf_nbr_get (oi
, ospfh
, iph
, &p
);
944 /* neighbour must be valid, ospf_nbr_get creates if none existed */
947 old_state
= nbr
->state
;
949 /* Add event to thread. */
950 OSPF_NSM_EVENT_SCHEDULE (nbr
, NSM_PacketReceived
);
952 /* RFC2328 Section 9.5.1
953 If the router is not eligible to become Designated Router,
954 (snip) It must also send an Hello Packet in reply to an
955 Hello Packet received from any eligible neighbor (other than
956 the current Designated Router and Backup Designated Router). */
957 if (oi
->type
== OSPF_IFTYPE_NBMA
)
958 if (PRIORITY(oi
) == 0 && hello
->priority
> 0
959 && IPV4_ADDR_CMP(&DR(oi
), &iph
->ip_src
)
960 && IPV4_ADDR_CMP(&BDR(oi
), &iph
->ip_src
))
961 OSPF_NSM_TIMER_ON (nbr
->t_hello_reply
, ospf_hello_reply_timer
,
962 OSPF_HELLO_REPLY_DELAY
);
964 /* on NBMA network type, it happens to receive bidirectional Hello packet
965 without advance 1-Way Received event.
966 To avoid incorrect DR-seletion, raise 1-Way Received event.*/
967 if (oi
->type
== OSPF_IFTYPE_NBMA
&&
968 (old_state
== NSM_Down
|| old_state
== NSM_Attempt
))
970 OSPF_NSM_EVENT_SCHEDULE (nbr
, NSM_OneWayReceived
);
971 nbr
->priority
= hello
->priority
;
972 nbr
->d_router
= hello
->d_router
;
973 nbr
->bd_router
= hello
->bd_router
;
977 if (ospf_nbr_bidirectional (&oi
->ospf
->router_id
, hello
->neighbors
,
978 size
- OSPF_HELLO_MIN_SIZE
))
980 OSPF_NSM_EVENT_SCHEDULE (nbr
, NSM_TwoWayReceived
);
981 nbr
->options
|= hello
->options
;
985 OSPF_NSM_EVENT_SCHEDULE (nbr
, NSM_OneWayReceived
);
986 /* Set neighbor information. */
987 nbr
->priority
= hello
->priority
;
988 nbr
->d_router
= hello
->d_router
;
989 nbr
->bd_router
= hello
->bd_router
;
993 /* If neighbor itself declares DR and no BDR exists,
994 cause event BackupSeen */
995 if (IPV4_ADDR_SAME (&nbr
->address
.u
.prefix4
, &hello
->d_router
))
996 if (hello
->bd_router
.s_addr
== 0 && oi
->state
== ISM_Waiting
)
997 OSPF_ISM_EVENT_SCHEDULE (oi
, ISM_BackupSeen
);
999 /* neighbor itself declares BDR. */
1000 if (oi
->state
== ISM_Waiting
&&
1001 IPV4_ADDR_SAME (&nbr
->address
.u
.prefix4
, &hello
->bd_router
))
1002 OSPF_ISM_EVENT_SCHEDULE (oi
, ISM_BackupSeen
);
1004 /* had not previously. */
1005 if ((IPV4_ADDR_SAME (&nbr
->address
.u
.prefix4
, &hello
->d_router
) &&
1006 IPV4_ADDR_CMP (&nbr
->address
.u
.prefix4
, &nbr
->d_router
)) ||
1007 (IPV4_ADDR_CMP (&nbr
->address
.u
.prefix4
, &hello
->d_router
) &&
1008 IPV4_ADDR_SAME (&nbr
->address
.u
.prefix4
, &nbr
->d_router
)))
1009 OSPF_ISM_EVENT_SCHEDULE (oi
, ISM_NeighborChange
);
1011 /* had not previously. */
1012 if ((IPV4_ADDR_SAME (&nbr
->address
.u
.prefix4
, &hello
->bd_router
) &&
1013 IPV4_ADDR_CMP (&nbr
->address
.u
.prefix4
, &nbr
->bd_router
)) ||
1014 (IPV4_ADDR_CMP (&nbr
->address
.u
.prefix4
, &hello
->bd_router
) &&
1015 IPV4_ADDR_SAME (&nbr
->address
.u
.prefix4
, &nbr
->bd_router
)))
1016 OSPF_ISM_EVENT_SCHEDULE (oi
, ISM_NeighborChange
);
1018 /* Neighbor priority check. */
1019 if (nbr
->priority
>= 0 && nbr
->priority
!= hello
->priority
)
1020 OSPF_ISM_EVENT_SCHEDULE (oi
, ISM_NeighborChange
);
1022 /* Set neighbor information. */
1023 nbr
->priority
= hello
->priority
;
1024 nbr
->d_router
= hello
->d_router
;
1025 nbr
->bd_router
= hello
->bd_router
;
1028 /* Save DD flags/options/Seqnum received. */
1030 ospf_db_desc_save_current (struct ospf_neighbor
*nbr
,
1031 struct ospf_db_desc
*dd
)
1033 nbr
->last_recv
.flags
= dd
->flags
;
1034 nbr
->last_recv
.options
= dd
->options
;
1035 nbr
->last_recv
.dd_seqnum
= ntohl (dd
->dd_seqnum
);
1038 /* Process rest of DD packet. */
1040 ospf_db_desc_proc (struct stream
*s
, struct ospf_interface
*oi
,
1041 struct ospf_neighbor
*nbr
, struct ospf_db_desc
*dd
,
1044 struct ospf_lsa
*new, *find
;
1045 struct lsa_header
*lsah
;
1047 stream_forward_getp (s
, OSPF_DB_DESC_MIN_SIZE
);
1048 for (size
-= OSPF_DB_DESC_MIN_SIZE
;
1049 size
>= OSPF_LSA_HEADER_SIZE
; size
-= OSPF_LSA_HEADER_SIZE
)
1051 lsah
= (struct lsa_header
*) STREAM_PNT (s
);
1052 stream_forward_getp (s
, OSPF_LSA_HEADER_SIZE
);
1054 /* Unknown LS type. */
1055 if (lsah
->type
< OSPF_MIN_LSA
|| lsah
->type
>= OSPF_MAX_LSA
)
1057 zlog_warn ("Packet [DD:RECV]: Unknown LS type %d.", lsah
->type
);
1058 OSPF_NSM_EVENT_SCHEDULE (nbr
, NSM_SeqNumberMismatch
);
1062 #ifdef HAVE_OPAQUE_LSA
1063 if (IS_OPAQUE_LSA (lsah
->type
)
1064 && ! CHECK_FLAG (nbr
->options
, OSPF_OPTION_O
))
1066 zlog_warn ("LSA[Type%d:%s]: Opaque capability mismatch?", lsah
->type
, inet_ntoa (lsah
->id
));
1067 OSPF_NSM_EVENT_SCHEDULE (nbr
, NSM_SeqNumberMismatch
);
1070 #endif /* HAVE_OPAQUE_LSA */
1074 case OSPF_AS_EXTERNAL_LSA
:
1075 #ifdef HAVE_OPAQUE_LSA
1076 case OSPF_OPAQUE_AS_LSA
:
1077 #endif /* HAVE_OPAQUE_LSA */
1078 /* Check for stub area. Reject if AS-External from stub but
1079 allow if from NSSA. */
1080 if (oi
->area
->external_routing
== OSPF_AREA_STUB
)
1082 zlog_warn ("Packet [DD:RECV]: LSA[Type%d:%s] from %s area.",
1083 lsah
->type
, inet_ntoa (lsah
->id
),
1084 (oi
->area
->external_routing
== OSPF_AREA_STUB
) ?\
1086 OSPF_NSM_EVENT_SCHEDULE (nbr
, NSM_SeqNumberMismatch
);
1094 /* Create LS-request object. */
1095 new = ospf_ls_request_new (lsah
);
1097 /* Lookup received LSA, then add LS request list. */
1098 find
= ospf_lsa_lookup_by_header (oi
->area
, lsah
);
1100 /* ospf_lsa_more_recent is fine with NULL pointers */
1101 switch (ospf_lsa_more_recent (find
, new))
1104 /* Neighbour has a more recent LSA, we must request it */
1105 ospf_ls_request_add (nbr
, new);
1107 /* If we have a copy of this LSA, it's either less recent
1108 * and we're requesting it from neighbour (the case above), or
1109 * it's as recent and we both have same copy (this case).
1111 * In neither of these two cases is there any point in
1112 * describing our copy of the LSA to the neighbour in a
1113 * DB-Summary packet, if we're still intending to do so.
1115 * See: draft-ogier-ospf-dbex-opt-00.txt, describing the
1116 * backward compatible optimisation to OSPF DB Exchange /
1117 * DB Description process implemented here.
1120 ospf_lsdb_delete (&nbr
->db_sum
, find
);
1121 ospf_lsa_discard (new);
1124 /* We have the more recent copy, nothing specific to do:
1125 * - no need to request neighbours stale copy
1126 * - must leave DB summary list copy alone
1128 if (IS_DEBUG_OSPF_EVENT
)
1129 zlog_debug ("Packet [DD:RECV]: LSA received Type %d, "
1130 "ID %s is not recent.", lsah
->type
, inet_ntoa (lsah
->id
));
1131 ospf_lsa_discard (new);
1136 if (IS_SET_DD_MS (nbr
->dd_flags
))
1140 /* Both sides have no More, then we're done with Exchange */
1141 if (!IS_SET_DD_M (dd
->flags
) && !IS_SET_DD_M (nbr
->dd_flags
))
1142 OSPF_NSM_EVENT_SCHEDULE (nbr
, NSM_ExchangeDone
);
1144 ospf_db_desc_send (nbr
);
1149 nbr
->dd_seqnum
= ntohl (dd
->dd_seqnum
);
1151 /* Send DD packet in reply.
1153 * Must be done to acknowledge the Master's DD, regardless of
1154 * whether we have more LSAs ourselves to describe.
1156 * This function will clear the 'More' bit, if after this DD
1157 * we have no more LSAs to describe to the master..
1159 ospf_db_desc_send (nbr
);
1161 /* Slave can raise ExchangeDone now, if master is also done */
1162 if (!IS_SET_DD_M (dd
->flags
) && !IS_SET_DD_M (nbr
->dd_flags
))
1163 OSPF_NSM_EVENT_SCHEDULE (nbr
, NSM_ExchangeDone
);
1166 /* Save received neighbor values from DD. */
1167 ospf_db_desc_save_current (nbr
, dd
);
1171 ospf_db_desc_is_dup (struct ospf_db_desc
*dd
, struct ospf_neighbor
*nbr
)
1173 /* Is DD duplicated? */
1174 if (dd
->options
== nbr
->last_recv
.options
&&
1175 dd
->flags
== nbr
->last_recv
.flags
&&
1176 dd
->dd_seqnum
== htonl (nbr
->last_recv
.dd_seqnum
))
1182 /* OSPF Database Description message read -- RFC2328 Section 10.6. */
1184 ospf_db_desc (struct ip
*iph
, struct ospf_header
*ospfh
,
1185 struct stream
*s
, struct ospf_interface
*oi
, u_int16_t size
)
1187 struct ospf_db_desc
*dd
;
1188 struct ospf_neighbor
*nbr
;
1190 /* Increment statistics. */
1193 dd
= (struct ospf_db_desc
*) STREAM_PNT (s
);
1195 nbr
= ospf_nbr_lookup (oi
, iph
, ospfh
);
1198 zlog_warn ("Packet[DD]: Unknown Neighbor %s",
1199 inet_ntoa (ospfh
->router_id
));
1204 if ((OSPF_IF_PARAM (oi
, mtu_ignore
) == 0) &&
1205 (ntohs (dd
->mtu
) > oi
->ifp
->mtu
))
1207 zlog_warn ("Packet[DD]: Neighbor %s MTU %u is larger than [%s]'s MTU %u",
1208 inet_ntoa (nbr
->router_id
), ntohs (dd
->mtu
),
1209 IF_NAME (oi
), oi
->ifp
->mtu
);
1214 * XXX HACK by Hasso Tepper. Setting N/P bit in NSSA area DD packets is not
1215 * required. In fact at least JunOS sends DD packets with P bit clear.
1216 * Until proper solution is developped, this hack should help.
1218 * Update: According to the RFCs, N bit is specified /only/ for Hello
1219 * options, unfortunately its use in DD options is not specified. Hence some
1220 * implementations follow E-bit semantics and set it in DD options, and some
1221 * treat it as unspecified and hence follow the directive "default for
1222 * options is clear", ie unset.
1224 * Reset the flag, as ospfd follows E-bit semantics.
1226 if ( (oi
->area
->external_routing
== OSPF_AREA_NSSA
)
1227 && (CHECK_FLAG (nbr
->options
, OSPF_OPTION_NP
))
1228 && (!CHECK_FLAG (dd
->options
, OSPF_OPTION_NP
)) )
1230 if (IS_DEBUG_OSPF_EVENT
)
1231 zlog_debug ("Packet[DD]: Neighbour %s: Has NSSA capability, sends with N bit clear in DD options",
1232 inet_ntoa (nbr
->router_id
) );
1233 SET_FLAG (dd
->options
, OSPF_OPTION_NP
);
1236 #ifdef REJECT_IF_TBIT_ON
1237 if (CHECK_FLAG (dd
->options
, OSPF_OPTION_T
))
1240 * In Hello protocol, optional capability must have checked
1241 * to prevent this T-bit enabled router be my neighbor.
1243 zlog_warn ("Packet[DD]: Neighbor %s: T-bit on?", inet_ntoa (nbr
->router_id
));
1246 #endif /* REJECT_IF_TBIT_ON */
1248 #ifdef HAVE_OPAQUE_LSA
1249 if (CHECK_FLAG (dd
->options
, OSPF_OPTION_O
)
1250 && !CHECK_FLAG (oi
->ospf
->config
, OSPF_OPAQUE_CAPABLE
))
1253 * This node is not configured to handle O-bit, for now.
1254 * Clear it to ignore unsupported capability proposed by neighbor.
1256 UNSET_FLAG (dd
->options
, OSPF_OPTION_O
);
1258 #endif /* HAVE_OPAQUE_LSA */
1260 /* Add event to thread. */
1261 OSPF_NSM_EVENT_SCHEDULE (nbr
, NSM_PacketReceived
);
1263 /* Process DD packet by neighbor status. */
1269 zlog_warn ("Packet[DD]: Neighbor %s state is %s, packet discarded.",
1270 inet_ntoa(nbr
->router_id
),
1271 LOOKUP (ospf_nsm_state_msg
, nbr
->state
));
1274 OSPF_NSM_EVENT_EXECUTE (nbr
, NSM_TwoWayReceived
);
1275 /* If the new state is ExStart, the processing of the current
1276 packet should then continue in this new state by falling
1277 through to case ExStart below. */
1278 if (nbr
->state
!= NSM_ExStart
)
1282 if ((IS_SET_DD_ALL (dd
->flags
) == OSPF_DD_FLAG_ALL
) &&
1283 (size
== OSPF_DB_DESC_MIN_SIZE
))
1285 if (IPV4_ADDR_CMP (&nbr
->router_id
, &oi
->ospf
->router_id
) > 0)
1287 /* We're Slave---obey */
1288 zlog_info ("Packet[DD]: Neighbor %s Negotiation done (Slave).",
1289 inet_ntoa(nbr
->router_id
));
1290 nbr
->dd_seqnum
= ntohl (dd
->dd_seqnum
);
1293 UNSET_FLAG (nbr
->dd_flags
, (OSPF_DD_FLAG_MS
|OSPF_DD_FLAG_I
));
1297 /* We're Master, ignore the initial DBD from Slave */
1298 zlog_info ("Packet[DD]: Neighbor %s: Initial DBD from Slave, "
1299 "ignoring.", inet_ntoa(nbr
->router_id
));
1303 /* Ack from the Slave */
1304 else if (!IS_SET_DD_MS (dd
->flags
) && !IS_SET_DD_I (dd
->flags
) &&
1305 ntohl (dd
->dd_seqnum
) == nbr
->dd_seqnum
&&
1306 IPV4_ADDR_CMP (&nbr
->router_id
, &oi
->ospf
->router_id
) < 0)
1308 zlog_info ("Packet[DD]: Neighbor %s Negotiation done (Master).",
1309 inet_ntoa(nbr
->router_id
));
1310 /* Reset I, leaving MS */
1311 UNSET_FLAG (nbr
->dd_flags
, OSPF_DD_FLAG_I
);
1315 zlog_warn ("Packet[DD]: Neighbor %s Negotiation fails.",
1316 inet_ntoa(nbr
->router_id
));
1320 /* This is where the real Options are saved */
1321 nbr
->options
= dd
->options
;
1323 #ifdef HAVE_OPAQUE_LSA
1324 if (CHECK_FLAG (oi
->ospf
->config
, OSPF_OPAQUE_CAPABLE
))
1326 if (IS_DEBUG_OSPF_EVENT
)
1327 zlog_debug ("Neighbor[%s] is %sOpaque-capable.",
1328 inet_ntoa (nbr
->router_id
),
1329 CHECK_FLAG (nbr
->options
, OSPF_OPTION_O
) ? "" : "NOT ");
1331 if (! CHECK_FLAG (nbr
->options
, OSPF_OPTION_O
)
1332 && IPV4_ADDR_SAME (&DR (oi
), &nbr
->address
.u
.prefix4
))
1334 zlog_warn ("DR-neighbor[%s] is NOT opaque-capable; "
1335 "Opaque-LSAs cannot be reliably advertised "
1337 inet_ntoa (nbr
->router_id
));
1338 /* This situation is undesirable, but not a real error. */
1341 #endif /* HAVE_OPAQUE_LSA */
1343 OSPF_NSM_EVENT_EXECUTE (nbr
, NSM_NegotiationDone
);
1345 /* continue processing rest of packet. */
1346 ospf_db_desc_proc (s
, oi
, nbr
, dd
, size
);
1349 if (ospf_db_desc_is_dup (dd
, nbr
))
1351 if (IS_SET_DD_MS (nbr
->dd_flags
))
1352 /* Master: discard duplicated DD packet. */
1353 zlog_info ("Packet[DD] (Master): Neighbor %s packet duplicated.",
1354 inet_ntoa (nbr
->router_id
));
1356 /* Slave: cause to retransmit the last Database Description. */
1358 zlog_info ("Packet[DD] [Slave]: Neighbor %s packet duplicated.",
1359 inet_ntoa (nbr
->router_id
));
1360 ospf_db_desc_resend (nbr
);
1365 /* Otherwise DD packet should be checked. */
1366 /* Check Master/Slave bit mismatch */
1367 if (IS_SET_DD_MS (dd
->flags
) != IS_SET_DD_MS (nbr
->last_recv
.flags
))
1369 zlog_warn ("Packet[DD]: Neighbor %s MS-bit mismatch.",
1370 inet_ntoa(nbr
->router_id
));
1371 OSPF_NSM_EVENT_SCHEDULE (nbr
, NSM_SeqNumberMismatch
);
1372 if (IS_DEBUG_OSPF_EVENT
)
1373 zlog_debug ("Packet[DD]: dd->flags=%d, nbr->dd_flags=%d",
1374 dd
->flags
, nbr
->dd_flags
);
1378 /* Check initialize bit is set. */
1379 if (IS_SET_DD_I (dd
->flags
))
1381 zlog_info ("Packet[DD]: Neighbor %s I-bit set.",
1382 inet_ntoa(nbr
->router_id
));
1383 OSPF_NSM_EVENT_SCHEDULE (nbr
, NSM_SeqNumberMismatch
);
1387 /* Check DD Options. */
1388 if (dd
->options
!= nbr
->options
)
1390 #ifdef ORIGINAL_CODING
1391 /* Save the new options for debugging */
1392 nbr
->options
= dd
->options
;
1393 #endif /* ORIGINAL_CODING */
1394 zlog_warn ("Packet[DD]: Neighbor %s options mismatch.",
1395 inet_ntoa(nbr
->router_id
));
1396 OSPF_NSM_EVENT_SCHEDULE (nbr
, NSM_SeqNumberMismatch
);
1400 /* Check DD sequence number. */
1401 if ((IS_SET_DD_MS (nbr
->dd_flags
) &&
1402 ntohl (dd
->dd_seqnum
) != nbr
->dd_seqnum
) ||
1403 (!IS_SET_DD_MS (nbr
->dd_flags
) &&
1404 ntohl (dd
->dd_seqnum
) != nbr
->dd_seqnum
+ 1))
1406 zlog_warn ("Packet[DD]: Neighbor %s sequence number mismatch.",
1407 inet_ntoa(nbr
->router_id
));
1408 OSPF_NSM_EVENT_SCHEDULE (nbr
, NSM_SeqNumberMismatch
);
1412 /* Continue processing rest of packet. */
1413 ospf_db_desc_proc (s
, oi
, nbr
, dd
, size
);
1417 if (ospf_db_desc_is_dup (dd
, nbr
))
1419 if (IS_SET_DD_MS (nbr
->dd_flags
))
1421 /* Master should discard duplicate DD packet. */
1422 zlog_info ("Packet[DD]: Neighbor %s duplicated, "
1423 "packet discarded.",
1424 inet_ntoa(nbr
->router_id
));
1429 struct timeval t
, now
;
1430 quagga_gettime (QUAGGA_CLK_MONOTONIC
, &now
);
1431 t
= tv_sub (now
, nbr
->last_send_ts
);
1432 if (tv_cmp (t
, int2tv (nbr
->v_inactivity
)) < 0)
1434 /* In states Loading and Full the slave must resend
1435 its last Database Description packet in response to
1436 duplicate Database Description packets received
1437 from the master. For this reason the slave must
1438 wait RouterDeadInterval seconds before freeing the
1439 last Database Description packet. Reception of a
1440 Database Description packet from the master after
1441 this interval will generate a SeqNumberMismatch
1442 neighbor event. RFC2328 Section 10.8 */
1443 ospf_db_desc_resend (nbr
);
1449 OSPF_NSM_EVENT_SCHEDULE (nbr
, NSM_SeqNumberMismatch
);
1452 zlog_warn ("Packet[DD]: Neighbor %s NSM illegal status %u.",
1453 inet_ntoa(nbr
->router_id
), nbr
->state
);
1458 #define OSPF_LSA_KEY_SIZE 12 /* type(4) + id(4) + ar(4) */
1460 /* OSPF Link State Request Read -- RFC2328 Section 10.7. */
1462 ospf_ls_req (struct ip
*iph
, struct ospf_header
*ospfh
,
1463 struct stream
*s
, struct ospf_interface
*oi
, u_int16_t size
)
1465 struct ospf_neighbor
*nbr
;
1467 struct in_addr ls_id
;
1468 struct in_addr adv_router
;
1469 struct ospf_lsa
*find
;
1470 struct list
*ls_upd
;
1471 unsigned int length
;
1473 /* Increment statistics. */
1476 nbr
= ospf_nbr_lookup (oi
, iph
, ospfh
);
1479 zlog_warn ("Link State Request: Unknown Neighbor %s.",
1480 inet_ntoa (ospfh
->router_id
));
1484 /* Add event to thread. */
1485 OSPF_NSM_EVENT_SCHEDULE (nbr
, NSM_PacketReceived
);
1487 /* Neighbor State should be Exchange or later. */
1488 if (nbr
->state
!= NSM_Exchange
&&
1489 nbr
->state
!= NSM_Loading
&&
1490 nbr
->state
!= NSM_Full
)
1492 zlog_warn ("Link State Request received from %s: "
1493 "Neighbor state is %s, packet discarded.",
1494 inet_ntoa (ospfh
->router_id
),
1495 LOOKUP (ospf_nsm_state_msg
, nbr
->state
));
1499 /* Send Link State Update for ALL requested LSAs. */
1500 ls_upd
= list_new ();
1501 length
= OSPF_HEADER_SIZE
+ OSPF_LS_UPD_MIN_SIZE
;
1503 while (size
>= OSPF_LSA_KEY_SIZE
)
1505 /* Get one slice of Link State Request. */
1506 ls_type
= stream_getl (s
);
1507 ls_id
.s_addr
= stream_get_ipv4 (s
);
1508 adv_router
.s_addr
= stream_get_ipv4 (s
);
1510 /* Verify LSA type. */
1511 if (ls_type
< OSPF_MIN_LSA
|| ls_type
>= OSPF_MAX_LSA
)
1513 OSPF_NSM_EVENT_SCHEDULE (nbr
, NSM_BadLSReq
);
1514 list_delete (ls_upd
);
1518 /* Search proper LSA in LSDB. */
1519 find
= ospf_lsa_lookup (oi
->area
, ls_type
, ls_id
, adv_router
);
1522 OSPF_NSM_EVENT_SCHEDULE (nbr
, NSM_BadLSReq
);
1523 list_delete (ls_upd
);
1527 /* Packet overflows MTU size, send immediately. */
1528 if (length
+ ntohs (find
->data
->length
) > ospf_packet_max (oi
))
1530 if (oi
->type
== OSPF_IFTYPE_NBMA
)
1531 ospf_ls_upd_send (nbr
, ls_upd
, OSPF_SEND_PACKET_DIRECT
);
1533 ospf_ls_upd_send (nbr
, ls_upd
, OSPF_SEND_PACKET_INDIRECT
);
1535 /* Only remove list contents. Keep ls_upd. */
1536 list_delete_all_node (ls_upd
);
1538 length
= OSPF_HEADER_SIZE
+ OSPF_LS_UPD_MIN_SIZE
;
1541 /* Append LSA to update list. */
1542 listnode_add (ls_upd
, find
);
1543 length
+= ntohs (find
->data
->length
);
1545 size
-= OSPF_LSA_KEY_SIZE
;
1548 /* Send rest of Link State Update. */
1549 if (listcount (ls_upd
) > 0)
1551 if (oi
->type
== OSPF_IFTYPE_NBMA
)
1552 ospf_ls_upd_send (nbr
, ls_upd
, OSPF_SEND_PACKET_DIRECT
);
1554 ospf_ls_upd_send (nbr
, ls_upd
, OSPF_SEND_PACKET_INDIRECT
);
1556 list_delete (ls_upd
);
1562 /* Get the list of LSAs from Link State Update packet.
1563 And process some validation -- RFC2328 Section 13. (1)-(2). */
1564 static struct list
*
1565 ospf_ls_upd_list_lsa (struct ospf_neighbor
*nbr
, struct stream
*s
,
1566 struct ospf_interface
*oi
, size_t size
)
1568 u_int16_t count
, sum
;
1570 struct lsa_header
*lsah
;
1571 struct ospf_lsa
*lsa
;
1576 count
= stream_getl (s
);
1577 size
-= OSPF_LS_UPD_MIN_SIZE
; /* # LSAs */
1579 for (; size
>= OSPF_LSA_HEADER_SIZE
&& count
> 0;
1580 size
-= length
, stream_forward_getp (s
, length
), count
--)
1582 lsah
= (struct lsa_header
*) STREAM_PNT (s
);
1583 length
= ntohs (lsah
->length
);
1587 zlog_warn ("Link State Update: LSA length exceeds packet size.");
1591 /* Validate the LSA's LS checksum. */
1592 sum
= lsah
->checksum
;
1593 if (! ospf_lsa_checksum_valid (lsah
))
1595 /* (bug #685) more details in a one-line message make it possible
1596 * to identify problem source on the one hand and to have a better
1597 * chance to compress repeated messages in syslog on the other */
1598 zlog_warn ("Link State Update: LSA checksum error %x/%x, ID=%s from: nbr %s, router ID %s, adv router %s",
1599 sum
, lsah
->checksum
, inet_ntoa (lsah
->id
),
1600 inet_ntoa (nbr
->src
), inet_ntoa (nbr
->router_id
),
1601 inet_ntoa (lsah
->adv_router
));
1605 /* Examine the LSA's LS type. */
1606 if (lsah
->type
< OSPF_MIN_LSA
|| lsah
->type
>= OSPF_MAX_LSA
)
1608 zlog_warn ("Link State Update: Unknown LS type %d", lsah
->type
);
1613 * What if the received LSA's age is greater than MaxAge?
1614 * Treat it as a MaxAge case -- endo.
1616 if (ntohs (lsah
->ls_age
) > OSPF_LSA_MAXAGE
)
1617 lsah
->ls_age
= htons (OSPF_LSA_MAXAGE
);
1619 #ifdef HAVE_OPAQUE_LSA
1620 if (CHECK_FLAG (nbr
->options
, OSPF_OPTION_O
))
1622 #ifdef STRICT_OBIT_USAGE_CHECK
1623 if ((IS_OPAQUE_LSA(lsah
->type
) &&
1624 ! CHECK_FLAG (lsah
->options
, OSPF_OPTION_O
))
1625 || (! IS_OPAQUE_LSA(lsah
->type
) &&
1626 CHECK_FLAG (lsah
->options
, OSPF_OPTION_O
)))
1629 * This neighbor must know the exact usage of O-bit;
1630 * the bit will be set in Type-9,10,11 LSAs only.
1632 zlog_warn ("LSA[Type%d:%s]: O-bit abuse?", lsah
->type
, inet_ntoa (lsah
->id
));
1635 #endif /* STRICT_OBIT_USAGE_CHECK */
1637 /* Do not take in AS External Opaque-LSAs if we are a stub. */
1638 if (lsah
->type
== OSPF_OPAQUE_AS_LSA
1639 && nbr
->oi
->area
->external_routing
!= OSPF_AREA_DEFAULT
)
1641 if (IS_DEBUG_OSPF_EVENT
)
1642 zlog_debug ("LSA[Type%d:%s]: We are a stub, don't take this LSA.", lsah
->type
, inet_ntoa (lsah
->id
));
1646 else if (IS_OPAQUE_LSA(lsah
->type
))
1648 zlog_warn ("LSA[Type%d:%s]: Opaque capability mismatch?", lsah
->type
, inet_ntoa (lsah
->id
));
1651 #endif /* HAVE_OPAQUE_LSA */
1653 /* Create OSPF LSA instance. */
1654 lsa
= ospf_lsa_new ();
1656 /* We may wish to put some error checking if type NSSA comes in
1657 and area not in NSSA mode */
1660 case OSPF_AS_EXTERNAL_LSA
:
1661 #ifdef HAVE_OPAQUE_LSA
1662 case OSPF_OPAQUE_AS_LSA
:
1663 #endif /* HAVE_OPAQUE_LSA */
1666 #ifdef HAVE_OPAQUE_LSA
1667 case OSPF_OPAQUE_LINK_LSA
:
1668 lsa
->oi
= oi
; /* Remember incoming interface for flooding control. */
1670 #endif /* HAVE_OPAQUE_LSA */
1672 lsa
->area
= oi
->area
;
1676 lsa
->data
= ospf_lsa_data_new (length
);
1677 memcpy (lsa
->data
, lsah
, length
);
1679 if (IS_DEBUG_OSPF_EVENT
)
1680 zlog_debug("LSA[Type%d:%s]: %p new LSA created with Link State Update",
1681 lsa
->data
->type
, inet_ntoa (lsa
->data
->id
), lsa
);
1682 listnode_add (lsas
, lsa
);
1688 /* Cleanup Update list. */
1690 ospf_upd_list_clean (struct list
*lsas
)
1692 struct listnode
*node
, *nnode
;
1693 struct ospf_lsa
*lsa
;
1695 for (ALL_LIST_ELEMENTS (lsas
, node
, nnode
, lsa
))
1696 ospf_lsa_discard (lsa
);
1701 /* OSPF Link State Update message read -- RFC2328 Section 13. */
1703 ospf_ls_upd (struct ip
*iph
, struct ospf_header
*ospfh
,
1704 struct stream
*s
, struct ospf_interface
*oi
, u_int16_t size
)
1706 struct ospf_neighbor
*nbr
;
1708 struct listnode
*node
, *nnode
;
1709 struct ospf_lsa
*lsa
= NULL
;
1710 /* unsigned long ls_req_found = 0; */
1712 /* Dis-assemble the stream, update each entry, re-encapsulate for flooding */
1714 /* Increment statistics. */
1717 /* Check neighbor. */
1718 nbr
= ospf_nbr_lookup (oi
, iph
, ospfh
);
1721 zlog_warn ("Link State Update: Unknown Neighbor %s on int: %s",
1722 inet_ntoa (ospfh
->router_id
), IF_NAME (oi
));
1726 /* Add event to thread. */
1727 OSPF_NSM_EVENT_SCHEDULE (nbr
, NSM_PacketReceived
);
1729 /* Check neighbor state. */
1730 if (nbr
->state
< NSM_Exchange
)
1732 zlog_warn ("Link State Update: "
1733 "Neighbor[%s] state %s is less than Exchange",
1734 inet_ntoa (ospfh
->router_id
),
1735 LOOKUP(ospf_nsm_state_msg
, nbr
->state
));
1739 /* Get list of LSAs from Link State Update packet. - Also perorms Stages
1740 * 1 (validate LSA checksum) and 2 (check for LSA consistent type)
1743 lsas
= ospf_ls_upd_list_lsa (nbr
, s
, oi
, size
);
1745 #ifdef HAVE_OPAQUE_LSA
1747 * If self-originated Opaque-LSAs that have flooded before restart
1748 * are contained in the received LSUpd message, corresponding LSReq
1749 * messages to be sent may have to be modified.
1750 * To eliminate possible race conditions such that flushing and normal
1751 * updating for the same LSA would take place alternately, this trick
1752 * must be done before entering to the loop below.
1754 /* XXX: Why is this Opaque specific? Either our core code is deficient
1755 * and this should be fixed generally, or Opaque is inventing strawman
1757 ospf_opaque_adjust_lsreq (nbr
, lsas
);
1758 #endif /* HAVE_OPAQUE_LSA */
1760 #define DISCARD_LSA(L,N) {\
1761 if (IS_DEBUG_OSPF_EVENT) \
1762 zlog_debug ("ospf_lsa_discard() in ospf_ls_upd() point %d: lsa %p Type-%d", N, lsa, (int) lsa->data->type); \
1763 ospf_lsa_discard (L); \
1766 /* Process each LSA received in the one packet.
1768 * Numbers in parentheses, e.g. (1), (2), etc., and the corresponding
1769 * text below are from the steps in RFC 2328, Section 13.
1771 for (ALL_LIST_ELEMENTS (lsas
, node
, nnode
, lsa
))
1773 struct ospf_lsa
*ls_ret
, *current
;
1776 if (IS_DEBUG_OSPF_NSSA
)
1778 char buf1
[INET_ADDRSTRLEN
];
1779 char buf2
[INET_ADDRSTRLEN
];
1780 char buf3
[INET_ADDRSTRLEN
];
1782 zlog_debug("LSA Type-%d from %s, ID: %s, ADV: %s",
1784 inet_ntop (AF_INET
, &ospfh
->router_id
,
1785 buf1
, INET_ADDRSTRLEN
),
1786 inet_ntop (AF_INET
, &lsa
->data
->id
,
1787 buf2
, INET_ADDRSTRLEN
),
1788 inet_ntop (AF_INET
, &lsa
->data
->adv_router
,
1789 buf3
, INET_ADDRSTRLEN
));
1792 listnode_delete (lsas
, lsa
); /* We don't need it in list anymore */
1794 /* (1) Validate Checksum - Done above by ospf_ls_upd_list_lsa() */
1796 /* (2) LSA Type - Done above by ospf_ls_upd_list_lsa() */
1798 /* (3) Do not take in AS External LSAs if we are a stub or NSSA. */
1800 /* Do not take in AS NSSA if this neighbor and we are not NSSA */
1802 /* Do take in Type-7's if we are an NSSA */
1804 /* If we are also an ABR, later translate them to a Type-5 packet */
1806 /* Later, an NSSA Re-fresh can Re-fresh Type-7's and an ABR will
1807 translate them to a separate Type-5 packet. */
1809 if (lsa
->data
->type
== OSPF_AS_EXTERNAL_LSA
)
1810 /* Reject from STUB or NSSA */
1811 if (nbr
->oi
->area
->external_routing
!= OSPF_AREA_DEFAULT
)
1813 if (IS_DEBUG_OSPF_NSSA
)
1814 zlog_debug("Incoming External LSA Discarded: We are NSSA/STUB Area");
1815 DISCARD_LSA (lsa
, 1);
1818 if (lsa
->data
->type
== OSPF_AS_NSSA_LSA
)
1819 if (nbr
->oi
->area
->external_routing
!= OSPF_AREA_NSSA
)
1821 if (IS_DEBUG_OSPF_NSSA
)
1822 zlog_debug("Incoming NSSA LSA Discarded: Not NSSA Area");
1823 DISCARD_LSA (lsa
,2);
1826 /* VU229804: Router-LSA Adv-ID must be equal to LS-ID */
1827 if (lsa
->data
->type
== OSPF_ROUTER_LSA
)
1828 if (!IPV4_ADDR_SAME(&lsa
->data
->id
, &lsa
->data
->adv_router
))
1830 char buf1
[INET_ADDRSTRLEN
];
1831 char buf2
[INET_ADDRSTRLEN
];
1832 char buf3
[INET_ADDRSTRLEN
];
1834 zlog_err("Incoming Router-LSA from %s with "
1835 "Adv-ID[%s] != LS-ID[%s]",
1836 inet_ntop (AF_INET
, &ospfh
->router_id
,
1837 buf1
, INET_ADDRSTRLEN
),
1838 inet_ntop (AF_INET
, &lsa
->data
->id
,
1839 buf2
, INET_ADDRSTRLEN
),
1840 inet_ntop (AF_INET
, &lsa
->data
->adv_router
,
1841 buf3
, INET_ADDRSTRLEN
));
1842 zlog_err("OSPF domain compromised by attack or corruption. "
1843 "Verify correct operation of -ALL- OSPF routers.");
1844 DISCARD_LSA (lsa
, 0);
1847 /* Find the LSA in the current database. */
1849 current
= ospf_lsa_lookup_by_header (oi
->area
, lsa
->data
);
1851 /* (4) If the LSA's LS age is equal to MaxAge, and there is currently
1852 no instance of the LSA in the router's link state database,
1853 and none of router's neighbors are in states Exchange or Loading,
1854 then take the following actions: */
1856 if (IS_LSA_MAXAGE (lsa
) && !current
&&
1857 ospf_check_nbr_status(oi
->ospf
))
1859 /* (4a) Response Link State Acknowledgment. */
1860 ospf_ls_ack_send (nbr
, lsa
);
1862 /* (4b) Discard LSA. */
1863 if (IS_DEBUG_OSPF (lsa
, LSA
))
1865 zlog_debug ("Link State Update[%s]: LS age is equal to MaxAge.",
1868 DISCARD_LSA (lsa
, 3);
1871 #ifdef HAVE_OPAQUE_LSA
1872 if (IS_OPAQUE_LSA (lsa
->data
->type
)
1873 && IPV4_ADDR_SAME (&lsa
->data
->adv_router
, &oi
->ospf
->router_id
))
1876 * Even if initial flushing seems to be completed, there might
1877 * be a case that self-originated LSA with MaxAge still remain
1878 * in the routing domain.
1879 * Just send an LSAck message to cease retransmission.
1881 if (IS_LSA_MAXAGE (lsa
))
1883 zlog_warn ("LSA[%s]: Boomerang effect?", dump_lsa_key (lsa
));
1884 ospf_ls_ack_send (nbr
, lsa
);
1885 ospf_lsa_discard (lsa
);
1887 if (current
!= NULL
&& ! IS_LSA_MAXAGE (current
))
1888 ospf_opaque_lsa_refresh_schedule (current
);
1893 * If an instance of self-originated Opaque-LSA is not found
1894 * in the LSDB, there are some possible cases here.
1896 * 1) This node lost opaque-capability after restart.
1897 * 2) Else, a part of opaque-type is no more supported.
1898 * 3) Else, a part of opaque-id is no more supported.
1900 * Anyway, it is still this node's responsibility to flush it.
1901 * Otherwise, the LSA instance remains in the routing domain
1902 * until its age reaches to MaxAge.
1904 /* XXX: We should deal with this for *ALL* LSAs, not just opaque */
1905 if (current
== NULL
)
1907 if (IS_DEBUG_OSPF_EVENT
)
1908 zlog_debug ("LSA[%s]: Previously originated Opaque-LSA,"
1909 "not found in the LSDB.", dump_lsa_key (lsa
));
1911 SET_FLAG (lsa
->flags
, OSPF_LSA_SELF
);
1913 ospf_opaque_self_originated_lsa_received (nbr
, lsa
);
1914 ospf_ls_ack_send (nbr
, lsa
);
1919 #endif /* HAVE_OPAQUE_LSA */
1921 /* It might be happen that received LSA is self-originated network LSA, but
1922 * router ID is changed. So, we should check if LSA is a network-LSA whose
1923 * Link State ID is one of the router's own IP interface addresses but whose
1924 * Advertising Router is not equal to the router's own Router ID
1925 * According to RFC 2328 12.4.2 and 13.4 this LSA should be flushed.
1928 if(lsa
->data
->type
== OSPF_NETWORK_LSA
)
1930 struct listnode
*oinode
, *oinnode
;
1931 struct ospf_interface
*out_if
;
1934 for (ALL_LIST_ELEMENTS (oi
->ospf
->oiflist
, oinode
, oinnode
, out_if
))
1939 if((IPV4_ADDR_SAME(&out_if
->address
->u
.prefix4
, &lsa
->data
->id
)) &&
1940 (!(IPV4_ADDR_SAME(&oi
->ospf
->router_id
, &lsa
->data
->adv_router
))))
1942 if(out_if
->network_lsa_self
)
1944 ospf_lsa_flush_area(lsa
,out_if
->area
);
1945 if(IS_DEBUG_OSPF_EVENT
)
1946 zlog_debug ("ospf_lsa_discard() in ospf_ls_upd() point 9: lsa %p Type-%d",
1947 lsa
, (int) lsa
->data
->type
);
1948 ospf_lsa_discard (lsa
);
1958 /* (5) Find the instance of this LSA that is currently contained
1959 in the router's link state database. If there is no
1960 database copy, or the received LSA is more recent than
1961 the database copy the following steps must be performed.
1962 (The sub steps from RFC 2328 section 13 step (5) will be performed in
1965 if (current
== NULL
||
1966 (ret
= ospf_lsa_more_recent (current
, lsa
)) < 0)
1968 /* Actual flooding procedure. */
1969 if (ospf_flood (oi
->ospf
, nbr
, current
, lsa
) < 0) /* Trap NSSA later. */
1970 DISCARD_LSA (lsa
, 4);
1974 /* (6) Else, If there is an instance of the LSA on the sending
1975 neighbor's Link state request list, an error has occurred in
1976 the Database Exchange process. In this case, restart the
1977 Database Exchange process by generating the neighbor event
1978 BadLSReq for the sending neighbor and stop processing the
1979 Link State Update packet. */
1981 if (ospf_ls_request_lookup (nbr
, lsa
))
1983 OSPF_NSM_EVENT_SCHEDULE (nbr
, NSM_BadLSReq
);
1984 zlog_warn("LSA[%s] instance exists on Link state request list",
1987 /* Clean list of LSAs. */
1988 ospf_upd_list_clean (lsas
);
1989 /* this lsa is not on lsas list already. */
1990 ospf_lsa_discard (lsa
);
1994 /* If the received LSA is the same instance as the database copy
1995 (i.e., neither one is more recent) the following two steps
1996 should be performed: */
2000 /* If the LSA is listed in the Link state retransmission list
2001 for the receiving adjacency, the router itself is expecting
2002 an acknowledgment for this LSA. The router should treat the
2003 received LSA as an acknowledgment by removing the LSA from
2004 the Link state retransmission list. This is termed an
2005 "implied acknowledgment". */
2007 ls_ret
= ospf_ls_retransmit_lookup (nbr
, lsa
);
2011 ospf_ls_retransmit_delete (nbr
, ls_ret
);
2013 /* Delayed acknowledgment sent if advertisement received
2014 from Designated Router, otherwise do nothing. */
2015 if (oi
->state
== ISM_Backup
)
2016 if (NBR_IS_DR (nbr
))
2017 listnode_add (oi
->ls_ack
, ospf_lsa_lock (lsa
));
2019 DISCARD_LSA (lsa
, 5);
2022 /* Acknowledge the receipt of the LSA by sending a
2023 Link State Acknowledgment packet back out the receiving
2026 ospf_ls_ack_send (nbr
, lsa
);
2027 DISCARD_LSA (lsa
, 6);
2031 /* The database copy is more recent. If the database copy
2032 has LS age equal to MaxAge and LS sequence number equal to
2033 MaxSequenceNumber, simply discard the received LSA without
2034 acknowledging it. (In this case, the LSA's LS sequence number is
2035 wrapping, and the MaxSequenceNumber LSA must be completely
2036 flushed before any new LSA instance can be introduced). */
2038 else if (ret
> 0) /* Database copy is more recent */
2040 if (IS_LSA_MAXAGE (current
) &&
2041 current
->data
->ls_seqnum
== htonl (OSPF_MAX_SEQUENCE_NUMBER
))
2043 DISCARD_LSA (lsa
, 7);
2045 /* Otherwise, as long as the database copy has not been sent in a
2046 Link State Update within the last MinLSArrival seconds, send the
2047 database copy back to the sending neighbor, encapsulated within
2048 a Link State Update Packet. The Link State Update Packet should
2049 be sent directly to the neighbor. In so doing, do not put the
2050 database copy of the LSA on the neighbor's link state
2051 retransmission list, and do not acknowledge the received (less
2052 recent) LSA instance. */
2057 quagga_gettime (QUAGGA_CLK_MONOTONIC
, &now
);
2059 if (tv_cmp (tv_sub (now
, current
->tv_orig
),
2060 int2tv (OSPF_MIN_LS_ARRIVAL
)) >= 0)
2061 /* Trap NSSA type later.*/
2062 ospf_ls_upd_send_lsa (nbr
, current
, OSPF_SEND_PACKET_DIRECT
);
2063 DISCARD_LSA (lsa
, 8);
2069 assert (listcount (lsas
) == 0);
2073 /* OSPF Link State Acknowledgment message read -- RFC2328 Section 13.7. */
2075 ospf_ls_ack (struct ip
*iph
, struct ospf_header
*ospfh
,
2076 struct stream
*s
, struct ospf_interface
*oi
, u_int16_t size
)
2078 struct ospf_neighbor
*nbr
;
2080 /* increment statistics. */
2083 nbr
= ospf_nbr_lookup (oi
, iph
, ospfh
);
2086 zlog_warn ("Link State Acknowledgment: Unknown Neighbor %s.",
2087 inet_ntoa (ospfh
->router_id
));
2091 /* Add event to thread. */
2092 OSPF_NSM_EVENT_SCHEDULE (nbr
, NSM_PacketReceived
);
2094 if (nbr
->state
< NSM_Exchange
)
2096 zlog_warn ("Link State Acknowledgment: "
2097 "Neighbor[%s] state %s is less than Exchange",
2098 inet_ntoa (ospfh
->router_id
),
2099 LOOKUP(ospf_nsm_state_msg
, nbr
->state
));
2103 while (size
>= OSPF_LSA_HEADER_SIZE
)
2105 struct ospf_lsa
*lsa
, *lsr
;
2107 lsa
= ospf_lsa_new ();
2108 lsa
->data
= (struct lsa_header
*) STREAM_PNT (s
);
2110 /* lsah = (struct lsa_header *) STREAM_PNT (s); */
2111 size
-= OSPF_LSA_HEADER_SIZE
;
2112 stream_forward_getp (s
, OSPF_LSA_HEADER_SIZE
);
2114 if (lsa
->data
->type
< OSPF_MIN_LSA
|| lsa
->data
->type
>= OSPF_MAX_LSA
)
2117 ospf_lsa_discard (lsa
);
2121 lsr
= ospf_ls_retransmit_lookup (nbr
, lsa
);
2123 if (lsr
!= NULL
&& ospf_lsa_more_recent (lsr
, lsa
) == 0)
2125 #ifdef HAVE_OPAQUE_LSA
2126 if (IS_OPAQUE_LSA (lsr
->data
->type
))
2127 ospf_opaque_ls_ack_received (nbr
, lsr
);
2128 #endif /* HAVE_OPAQUE_LSA */
2130 ospf_ls_retransmit_delete (nbr
, lsr
);
2134 ospf_lsa_discard (lsa
);
2140 static struct stream
*
2141 ospf_recv_packet (int fd
, struct interface
**ifp
, struct stream
*ibuf
)
2146 unsigned int ifindex
= 0;
2148 /* Header and data both require alignment. */
2149 char buff
[CMSG_SPACE(SOPT_SIZE_CMSG_IFINDEX_IPV4())];
2152 memset (&msgh
, 0, sizeof (struct msghdr
));
2153 msgh
.msg_iov
= &iov
;
2154 msgh
.msg_iovlen
= 1;
2155 msgh
.msg_control
= (caddr_t
) buff
;
2156 msgh
.msg_controllen
= sizeof (buff
);
2158 ret
= stream_recvmsg (ibuf
, fd
, &msgh
, 0, OSPF_MAX_PACKET_SIZE
+1);
2161 zlog_warn("stream_recvmsg failed: %s", safe_strerror(errno
));
2164 if ((unsigned int)ret
< sizeof(iph
)) /* ret must be > 0 now */
2166 zlog_warn("ospf_recv_packet: discarding runt packet of length %d "
2167 "(ip header size is %u)",
2168 ret
, (u_int
)sizeof(iph
));
2172 /* Note that there should not be alignment problems with this assignment
2173 because this is at the beginning of the stream data buffer. */
2174 iph
= (struct ip
*) STREAM_DATA(ibuf
);
2175 sockopt_iphdrincl_swab_systoh (iph
);
2177 ip_len
= iph
->ip_len
;
2179 #if !defined(GNU_LINUX) && (OpenBSD < 200311) && (__FreeBSD_version < 1000000)
2181 * Kernel network code touches incoming IP header parameters,
2182 * before protocol specific processing.
2184 * 1) Convert byteorder to host representation.
2185 * --> ip_len, ip_id, ip_off
2187 * 2) Adjust ip_len to strip IP header size!
2188 * --> If user process receives entire IP packet via RAW
2189 * socket, it must consider adding IP header size to
2190 * the "ip_len" field of "ip" structure.
2192 * For more details, see <netinet/ip_input.c>.
2194 ip_len
= ip_len
+ (iph
->ip_hl
<< 2);
2197 #if defined(__DragonFly__)
2199 * in DragonFly's raw socket, ip_len/ip_off are read
2200 * in network byte order.
2201 * As OpenBSD < 200311 adjust ip_len to strip IP header size!
2203 ip_len
= ntohs(iph
->ip_len
) + (iph
->ip_hl
<< 2);
2206 ifindex
= getsockopt_ifindex (AF_INET
, &msgh
);
2208 *ifp
= if_lookup_by_index (ifindex
);
2212 zlog_warn ("ospf_recv_packet read length mismatch: ip_len is %d, "
2213 "but recvmsg returned %d", ip_len
, ret
);
2220 static struct ospf_interface
*
2221 ospf_associate_packet_vl (struct ospf
*ospf
, struct interface
*ifp
,
2222 struct ip
*iph
, struct ospf_header
*ospfh
)
2224 struct ospf_interface
*rcv_oi
;
2225 struct ospf_vl_data
*vl_data
;
2226 struct ospf_area
*vl_area
;
2227 struct listnode
*node
;
2229 if (IN_MULTICAST (ntohl (iph
->ip_dst
.s_addr
)) ||
2230 !OSPF_IS_AREA_BACKBONE (ospfh
))
2233 /* look for local OSPF interface matching the destination
2234 * to determine Area ID. We presume therefore the destination address
2235 * is unique, or at least (for "unnumbered" links), not used in other
2238 if ((rcv_oi
= ospf_if_lookup_by_local_addr (ospf
, NULL
,
2239 iph
->ip_dst
)) == NULL
)
2242 for (ALL_LIST_ELEMENTS_RO (ospf
->vlinks
, node
, vl_data
))
2244 vl_area
= ospf_area_lookup_by_area_id (ospf
, vl_data
->vl_area_id
);
2248 if (OSPF_AREA_SAME (&vl_area
, &rcv_oi
->area
) &&
2249 IPV4_ADDR_SAME (&vl_data
->vl_peer
, &ospfh
->router_id
))
2251 if (IS_DEBUG_OSPF_EVENT
)
2252 zlog_debug ("associating packet with %s",
2253 IF_NAME (vl_data
->vl_oi
));
2254 if (! CHECK_FLAG (vl_data
->vl_oi
->ifp
->flags
, IFF_UP
))
2256 if (IS_DEBUG_OSPF_EVENT
)
2257 zlog_debug ("This VL is not up yet, sorry");
2261 return vl_data
->vl_oi
;
2265 if (IS_DEBUG_OSPF_EVENT
)
2266 zlog_debug ("couldn't find any VL to associate the packet with");
2272 ospf_check_area_id (struct ospf_interface
*oi
, struct ospf_header
*ospfh
)
2274 /* Check match the Area ID of the receiving interface. */
2275 if (OSPF_AREA_SAME (&oi
->area
, &ospfh
))
2281 /* Unbound socket will accept any Raw IP packets if proto is matched.
2282 To prevent it, compare src IP address and i/f address with masking
2283 i/f network mask. */
2285 ospf_check_network_mask (struct ospf_interface
*oi
, struct in_addr ip_src
)
2287 struct in_addr mask
, me
, him
;
2289 if (oi
->type
== OSPF_IFTYPE_POINTOPOINT
||
2290 oi
->type
== OSPF_IFTYPE_VIRTUALLINK
)
2293 masklen2ip (oi
->address
->prefixlen
, &mask
);
2295 me
.s_addr
= oi
->address
->u
.prefix4
.s_addr
& mask
.s_addr
;
2296 him
.s_addr
= ip_src
.s_addr
& mask
.s_addr
;
2298 if (IPV4_ADDR_SAME (&me
, &him
))
2304 /* Return 1, if the packet is properly authenticated and checksummed,
2305 0 otherwise. In particular, check that AuType header field is valid and
2306 matches the locally configured AuType, and that D.5 requirements are met. */
2308 ospf_check_auth (struct ospf_interface
*oi
, struct ospf_header
*ospfh
)
2310 struct crypt_key
*ck
;
2311 u_int16_t iface_auth_type
;
2312 u_int16_t pkt_auth_type
= ntohs (ospfh
->auth_type
);
2314 switch (pkt_auth_type
)
2316 case OSPF_AUTH_NULL
: /* RFC2328 D.5.1 */
2317 if (OSPF_AUTH_NULL
!= (iface_auth_type
= ospf_auth_type (oi
)))
2319 if (IS_DEBUG_OSPF_PACKET (ospfh
->type
- 1, RECV
))
2320 zlog_warn ("interface %s: auth-type mismatch, local %s, rcvd Null",
2321 IF_NAME (oi
), LOOKUP (ospf_auth_type_str
, iface_auth_type
));
2324 if (! ospf_check_sum (ospfh
))
2326 if (IS_DEBUG_OSPF_PACKET (ospfh
->type
- 1, RECV
))
2327 zlog_warn ("interface %s: Null auth OK, but checksum error, Router-ID %s",
2328 IF_NAME (oi
), inet_ntoa (ospfh
->router_id
));
2332 case OSPF_AUTH_SIMPLE
: /* RFC2328 D.5.2 */
2333 if (OSPF_AUTH_SIMPLE
!= (iface_auth_type
= ospf_auth_type (oi
)))
2335 if (IS_DEBUG_OSPF_PACKET (ospfh
->type
- 1, RECV
))
2336 zlog_warn ("interface %s: auth-type mismatch, local %s, rcvd Simple",
2337 IF_NAME (oi
), LOOKUP (ospf_auth_type_str
, iface_auth_type
));
2340 if (memcmp (OSPF_IF_PARAM (oi
, auth_simple
), ospfh
->u
.auth_data
, OSPF_AUTH_SIMPLE_SIZE
))
2342 if (IS_DEBUG_OSPF_PACKET (ospfh
->type
- 1, RECV
))
2343 zlog_warn ("interface %s: Simple auth failed", IF_NAME (oi
));
2346 if (! ospf_check_sum (ospfh
))
2348 if (IS_DEBUG_OSPF_PACKET (ospfh
->type
- 1, RECV
))
2349 zlog_warn ("interface %s: Simple auth OK, checksum error, Router-ID %s",
2350 IF_NAME (oi
), inet_ntoa (ospfh
->router_id
));
2354 case OSPF_AUTH_CRYPTOGRAPHIC
: /* RFC2328 D.5.3 */
2355 if (OSPF_AUTH_CRYPTOGRAPHIC
!= (iface_auth_type
= ospf_auth_type (oi
)))
2357 if (IS_DEBUG_OSPF_PACKET (ospfh
->type
- 1, RECV
))
2358 zlog_warn ("interface %s: auth-type mismatch, local %s, rcvd Cryptographic",
2359 IF_NAME (oi
), LOOKUP (ospf_auth_type_str
, iface_auth_type
));
2362 if (ospfh
->checksum
)
2364 if (IS_DEBUG_OSPF_PACKET (ospfh
->type
- 1, RECV
))
2365 zlog_warn ("interface %s: OSPF header checksum is not 0", IF_NAME (oi
));
2368 /* only MD5 crypto method can pass ospf_packet_examin() */
2371 NULL
== (ck
= listgetdata (listtail(OSPF_IF_PARAM (oi
,auth_crypt
)))) ||
2372 ospfh
->u
.crypt
.key_id
!= ck
->key_id
||
2373 /* Condition above uses the last key ID on the list, which is
2374 different from what ospf_crypt_key_lookup() does. A bug? */
2375 ! ospf_check_md5_digest (oi
, ospfh
)
2378 if (IS_DEBUG_OSPF_PACKET (ospfh
->type
- 1, RECV
))
2379 zlog_warn ("interface %s: MD5 auth failed", IF_NAME (oi
));
2384 if (IS_DEBUG_OSPF_PACKET (ospfh
->type
- 1, RECV
))
2385 zlog_warn ("interface %s: invalid packet auth-type (%02x)",
2386 IF_NAME (oi
), pkt_auth_type
);
2392 ospf_check_sum (struct ospf_header
*ospfh
)
2397 /* clear auth_data for checksum. */
2398 memset (ospfh
->u
.auth_data
, 0, OSPF_AUTH_SIMPLE_SIZE
);
2400 /* keep checksum and clear. */
2401 sum
= ospfh
->checksum
;
2402 memset (&ospfh
->checksum
, 0, sizeof (u_int16_t
));
2404 /* calculate checksum. */
2405 ret
= in_cksum (ospfh
, ntohs (ospfh
->length
));
2409 zlog_info ("ospf_check_sum(): checksum mismatch, my %X, his %X",
2417 /* Verify, that given link/TOS records are properly sized/aligned and match
2418 Router-LSA "# links" and "# TOS" fields as specified in RFC2328 A.4.2. */
2420 ospf_router_lsa_links_examin
2422 struct router_lsa_link
* link
,
2423 u_int16_t linkbytes
,
2424 const u_int16_t num_links
2427 unsigned counted_links
= 0, thislinklen
;
2431 thislinklen
= OSPF_ROUTER_LSA_LINK_SIZE
+ 4 * link
->m
[0].tos_count
;
2432 if (thislinklen
> linkbytes
)
2434 if (IS_DEBUG_OSPF_PACKET (0, RECV
))
2435 zlog_debug ("%s: length error in link block #%u", __func__
, counted_links
);
2438 link
= (struct router_lsa_link
*)((caddr_t
) link
+ thislinklen
);
2439 linkbytes
-= thislinklen
;
2442 if (counted_links
!= num_links
)
2444 if (IS_DEBUG_OSPF_PACKET (0, RECV
))
2445 zlog_debug ("%s: %u link blocks declared, %u present",
2446 __func__
, num_links
, counted_links
);
2452 /* Verify, that the given LSA is properly sized/aligned (including type-specific
2453 minimum length constraint). */
2455 ospf_lsa_examin (struct lsa_header
* lsah
, const u_int16_t lsalen
, const u_char headeronly
)
2458 struct router_lsa
* rlsa
;
2461 lsah
->type
< OSPF_MAX_LSA
&&
2462 ospf_lsa_minlen
[lsah
->type
] &&
2463 lsalen
< OSPF_LSA_HEADER_SIZE
+ ospf_lsa_minlen
[lsah
->type
]
2466 if (IS_DEBUG_OSPF_PACKET (0, RECV
))
2467 zlog_debug ("%s: undersized (%u B) %s",
2468 __func__
, lsalen
, LOOKUP (ospf_lsa_type_msg
, lsah
->type
));
2473 case OSPF_ROUTER_LSA
:
2474 /* RFC2328 A.4.2, LSA header + 4 bytes followed by N>=1 (12+)-byte link blocks */
2477 ret
= (lsalen
- OSPF_LSA_HEADER_SIZE
- OSPF_ROUTER_LSA_MIN_SIZE
) % 4 ? MSG_NG
: MSG_OK
;
2480 rlsa
= (struct router_lsa
*) lsah
;
2481 ret
= ospf_router_lsa_links_examin
2483 (struct router_lsa_link
*) rlsa
->link
,
2484 lsalen
- OSPF_LSA_HEADER_SIZE
- 4, /* skip: basic header, "flags", 0, "# links" */
2485 ntohs (rlsa
->links
) /* 16 bits */
2488 case OSPF_AS_EXTERNAL_LSA
:
2489 /* RFC2328 A.4.5, LSA header + 4 bytes followed by N>=1 12-bytes long blocks */
2490 case OSPF_AS_NSSA_LSA
:
2491 /* RFC3101 C, idem */
2492 ret
= (lsalen
- OSPF_LSA_HEADER_SIZE
- OSPF_AS_EXTERNAL_LSA_MIN_SIZE
) % 12 ? MSG_NG
: MSG_OK
;
2494 /* Following LSA types are considered OK length-wise as soon as their minimum
2495 * length constraint is met and length of the whole LSA is a multiple of 4
2496 * (basic LSA header size is already a multiple of 4). */
2497 case OSPF_NETWORK_LSA
:
2498 /* RFC2328 A.4.3, LSA header + 4 bytes followed by N>=1 router-IDs */
2499 case OSPF_SUMMARY_LSA
:
2500 case OSPF_ASBR_SUMMARY_LSA
:
2501 /* RFC2328 A.4.4, LSA header + 4 bytes followed by N>=1 4-bytes TOS blocks */
2502 #ifdef HAVE_OPAQUE_LSA
2503 case OSPF_OPAQUE_LINK_LSA
:
2504 case OSPF_OPAQUE_AREA_LSA
:
2505 case OSPF_OPAQUE_AS_LSA
:
2506 /* RFC5250 A.2, "some number of octets (of application-specific
2507 * data) padded to 32-bit alignment." This is considered equivalent
2508 * to 4-byte alignment of all other LSA types, see OSPF-ALIGNMENT.txt
2509 * file for the detailed analysis of this passage. */
2511 ret
= lsalen
% 4 ? MSG_NG
: MSG_OK
;
2514 if (IS_DEBUG_OSPF_PACKET (0, RECV
))
2515 zlog_debug ("%s: unsupported LSA type 0x%02x", __func__
, lsah
->type
);
2518 if (ret
!= MSG_OK
&& IS_DEBUG_OSPF_PACKET (0, RECV
))
2519 zlog_debug ("%s: alignment error in %s",
2520 __func__
, LOOKUP (ospf_lsa_type_msg
, lsah
->type
));
2524 /* Verify if the provided input buffer is a valid sequence of LSAs. This
2525 includes verification of LSA blocks length/alignment and dispatching
2526 of deeper-level checks. */
2530 struct lsa_header
*lsah
, /* start of buffered data */
2532 const u_char headeronly
,
2533 /* When declared_num_lsas is not 0, compare it to the real number of LSAs
2534 and treat the difference as an error. */
2535 const u_int32_t declared_num_lsas
2538 u_int32_t counted_lsas
= 0;
2543 if (length
< OSPF_LSA_HEADER_SIZE
)
2545 if (IS_DEBUG_OSPF_PACKET (0, RECV
))
2546 zlog_debug ("%s: undersized (%zu B) trailing (#%u) LSA header",
2547 __func__
, length
, counted_lsas
);
2550 /* save on ntohs() calls here and in the LSA validator */
2551 lsalen
= ntohs (lsah
->length
);
2552 if (lsalen
< OSPF_LSA_HEADER_SIZE
)
2554 if (IS_DEBUG_OSPF_PACKET (0, RECV
))
2555 zlog_debug ("%s: malformed LSA header #%u, declared length is %u B",
2556 __func__
, counted_lsas
, lsalen
);
2561 /* less checks here and in ospf_lsa_examin() */
2562 if (MSG_OK
!= ospf_lsa_examin (lsah
, lsalen
, 1))
2564 if (IS_DEBUG_OSPF_PACKET (0, RECV
))
2565 zlog_debug ("%s: malformed header-only LSA #%u", __func__
, counted_lsas
);
2568 lsah
= (struct lsa_header
*) ((caddr_t
) lsah
+ OSPF_LSA_HEADER_SIZE
);
2569 length
-= OSPF_LSA_HEADER_SIZE
;
2573 /* make sure the input buffer is deep enough before further checks */
2574 if (lsalen
> length
)
2576 if (IS_DEBUG_OSPF_PACKET (0, RECV
))
2577 zlog_debug ("%s: anomaly in LSA #%u: declared length is %u B, buffered length is %zu B",
2578 __func__
, counted_lsas
, lsalen
, length
);
2581 if (MSG_OK
!= ospf_lsa_examin (lsah
, lsalen
, 0))
2583 if (IS_DEBUG_OSPF_PACKET (0, RECV
))
2584 zlog_debug ("%s: malformed LSA #%u", __func__
, counted_lsas
);
2587 lsah
= (struct lsa_header
*) ((caddr_t
) lsah
+ lsalen
);
2593 if (declared_num_lsas
&& counted_lsas
!= declared_num_lsas
)
2595 if (IS_DEBUG_OSPF_PACKET (0, RECV
))
2596 zlog_debug ("%s: #LSAs declared (%u) does not match actual (%u)",
2597 __func__
, declared_num_lsas
, counted_lsas
);
2603 /* Verify a complete OSPF packet for proper sizing/alignment. */
2605 ospf_packet_examin (struct ospf_header
* oh
, const unsigned bytesonwire
)
2607 u_int16_t bytesdeclared
, bytesauth
;
2609 struct ospf_ls_update
* lsupd
;
2611 /* Length, 1st approximation. */
2612 if (bytesonwire
< OSPF_HEADER_SIZE
)
2614 if (IS_DEBUG_OSPF_PACKET (0, RECV
))
2615 zlog_debug ("%s: undersized (%u B) packet", __func__
, bytesonwire
);
2618 /* Now it is safe to access header fields. Performing length check, allow
2619 * for possible extra bytes of crypto auth/padding, which are not counted
2620 * in the OSPF header "length" field. */
2621 if (oh
->version
!= OSPF_VERSION
)
2623 if (IS_DEBUG_OSPF_PACKET (0, RECV
))
2624 zlog_debug ("%s: invalid (%u) protocol version", __func__
, oh
->version
);
2627 bytesdeclared
= ntohs (oh
->length
);
2628 if (ntohs (oh
->auth_type
) != OSPF_AUTH_CRYPTOGRAPHIC
)
2632 if (oh
->u
.crypt
.auth_data_len
!= OSPF_AUTH_MD5_SIZE
)
2634 if (IS_DEBUG_OSPF_PACKET (0, RECV
))
2635 zlog_debug ("%s: unsupported crypto auth length (%u B)",
2636 __func__
, oh
->u
.crypt
.auth_data_len
);
2639 bytesauth
= OSPF_AUTH_MD5_SIZE
;
2641 if (bytesdeclared
+ bytesauth
> bytesonwire
)
2643 if (IS_DEBUG_OSPF_PACKET (0, RECV
))
2644 zlog_debug ("%s: packet length error (%u real, %u+%u declared)",
2645 __func__
, bytesonwire
, bytesdeclared
, bytesauth
);
2648 /* Length, 2nd approximation. The type-specific constraint is checked
2649 against declared length, not amount of bytes on wire. */
2652 oh
->type
>= OSPF_MSG_HELLO
&&
2653 oh
->type
<= OSPF_MSG_LS_ACK
&&
2654 bytesdeclared
< OSPF_HEADER_SIZE
+ ospf_packet_minlen
[oh
->type
]
2657 if (IS_DEBUG_OSPF_PACKET (0, RECV
))
2658 zlog_debug ("%s: undersized (%u B) %s packet", __func__
,
2659 bytesdeclared
, LOOKUP (ospf_packet_type_str
, oh
->type
));
2664 case OSPF_MSG_HELLO
:
2665 /* RFC2328 A.3.2, packet header + OSPF_HELLO_MIN_SIZE bytes followed
2666 by N>=0 router-IDs. */
2667 ret
= (bytesdeclared
- OSPF_HEADER_SIZE
- OSPF_HELLO_MIN_SIZE
) % 4 ? MSG_NG
: MSG_OK
;
2669 case OSPF_MSG_DB_DESC
:
2670 /* RFC2328 A.3.3, packet header + OSPF_DB_DESC_MIN_SIZE bytes followed
2671 by N>=0 header-only LSAs. */
2672 ret
= ospf_lsaseq_examin
2674 (struct lsa_header
*) ((caddr_t
) oh
+ OSPF_HEADER_SIZE
+ OSPF_DB_DESC_MIN_SIZE
),
2675 bytesdeclared
- OSPF_HEADER_SIZE
- OSPF_DB_DESC_MIN_SIZE
,
2676 1, /* header-only LSAs */
2680 case OSPF_MSG_LS_REQ
:
2681 /* RFC2328 A.3.4, packet header followed by N>=0 12-bytes request blocks. */
2682 ret
= (bytesdeclared
- OSPF_HEADER_SIZE
- OSPF_LS_REQ_MIN_SIZE
) %
2683 OSPF_LSA_KEY_SIZE
? MSG_NG
: MSG_OK
;
2685 case OSPF_MSG_LS_UPD
:
2686 /* RFC2328 A.3.5, packet header + OSPF_LS_UPD_MIN_SIZE bytes followed
2687 by N>=0 full LSAs (with N declared beforehand). */
2688 lsupd
= (struct ospf_ls_update
*) ((caddr_t
) oh
+ OSPF_HEADER_SIZE
);
2689 ret
= ospf_lsaseq_examin
2691 (struct lsa_header
*) ((caddr_t
) lsupd
+ OSPF_LS_UPD_MIN_SIZE
),
2692 bytesdeclared
- OSPF_HEADER_SIZE
- OSPF_LS_UPD_MIN_SIZE
,
2694 ntohl (lsupd
->num_lsas
) /* 32 bits */
2697 case OSPF_MSG_LS_ACK
:
2698 /* RFC2328 A.3.6, packet header followed by N>=0 header-only LSAs. */
2699 ret
= ospf_lsaseq_examin
2701 (struct lsa_header
*) ((caddr_t
) oh
+ OSPF_HEADER_SIZE
+ OSPF_LS_ACK_MIN_SIZE
),
2702 bytesdeclared
- OSPF_HEADER_SIZE
- OSPF_LS_ACK_MIN_SIZE
,
2703 1, /* header-only LSAs */
2708 if (IS_DEBUG_OSPF_PACKET (0, RECV
))
2709 zlog_debug ("%s: invalid packet type 0x%02x", __func__
, oh
->type
);
2712 if (ret
!= MSG_OK
&& IS_DEBUG_OSPF_PACKET (0, RECV
))
2713 zlog_debug ("%s: malformed %s packet", __func__
, LOOKUP (ospf_packet_type_str
, oh
->type
));
2717 /* OSPF Header verification. */
2719 ospf_verify_header (struct stream
*ibuf
, struct ospf_interface
*oi
,
2720 struct ip
*iph
, struct ospf_header
*ospfh
)
2722 /* Check Area ID. */
2723 if (!ospf_check_area_id (oi
, ospfh
))
2725 zlog_warn ("interface %s: ospf_read invalid Area ID %s.",
2726 IF_NAME (oi
), inet_ntoa (ospfh
->area_id
));
2730 /* Check network mask, Silently discarded. */
2731 if (! ospf_check_network_mask (oi
, iph
->ip_src
))
2733 zlog_warn ("interface %s: ospf_read network address is not same [%s]",
2734 IF_NAME (oi
), inet_ntoa (iph
->ip_src
));
2738 /* Check authentication. The function handles logging actions, where required. */
2739 if (! ospf_check_auth (oi
, ospfh
))
2745 /* Starting point of packet process function. */
2747 ospf_read (struct thread
*thread
)
2750 struct stream
*ibuf
;
2752 struct ospf_interface
*oi
;
2754 struct ospf_header
*ospfh
;
2756 struct interface
*ifp
;
2758 /* first of all get interface pointer. */
2759 ospf
= THREAD_ARG (thread
);
2761 /* prepare for next packet. */
2762 ospf
->t_read
= thread_add_read (master
, ospf_read
, ospf
, ospf
->fd
);
2764 stream_reset(ospf
->ibuf
);
2765 if (!(ibuf
= ospf_recv_packet (ospf
->fd
, &ifp
, ospf
->ibuf
)))
2767 /* This raw packet is known to be at least as big as its IP header. */
2769 /* Note that there should not be alignment problems with this assignment
2770 because this is at the beginning of the stream data buffer. */
2771 iph
= (struct ip
*) STREAM_DATA (ibuf
);
2772 /* Note that sockopt_iphdrincl_swab_systoh was called in ospf_recv_packet. */
2775 /* Handle cases where the platform does not support retrieving the ifindex,
2776 and also platforms (such as Solaris 8) that claim to support ifindex
2777 retrieval but do not. */
2778 ifp
= if_lookup_address (iph
->ip_src
);
2783 /* IP Header dump. */
2784 if (IS_DEBUG_OSPF_PACKET(0, RECV
))
2785 ospf_ip_header_dump (iph
);
2787 /* Self-originated packet should be discarded silently. */
2788 if (ospf_if_lookup_by_local_addr (ospf
, NULL
, iph
->ip_src
))
2790 if (IS_DEBUG_OSPF_PACKET (0, RECV
))
2792 zlog_debug ("ospf_read[%s]: Dropping self-originated packet",
2793 inet_ntoa (iph
->ip_src
));
2798 /* Advance from IP header to OSPF header (iph->ip_hl has been verified
2799 by ospf_recv_packet() to be correct). */
2800 stream_forward_getp (ibuf
, iph
->ip_hl
* 4);
2802 ospfh
= (struct ospf_header
*) STREAM_PNT (ibuf
);
2803 if (MSG_OK
!= ospf_packet_examin (ospfh
, stream_get_endp (ibuf
) - stream_get_getp (ibuf
)))
2805 /* Now it is safe to access all fields of OSPF packet header. */
2807 /* associate packet with ospf interface */
2808 oi
= ospf_if_lookup_recv_if (ospf
, iph
->ip_src
, ifp
);
2810 /* ospf_verify_header() relies on a valid "oi" and thus can be called only
2811 after the passive/backbone/other checks below are passed. These checks
2812 in turn access the fields of unverified "ospfh" structure for their own
2813 purposes and must remain very accurate in doing this. */
2815 /* If incoming interface is passive one, ignore it. */
2816 if (oi
&& OSPF_IF_PASSIVE_STATUS (oi
) == OSPF_IF_PASSIVE
)
2818 char buf
[3][INET_ADDRSTRLEN
];
2820 if (IS_DEBUG_OSPF_EVENT
)
2821 zlog_debug ("ignoring packet from router %s sent to %s, "
2822 "received on a passive interface, %s",
2823 inet_ntop(AF_INET
, &ospfh
->router_id
, buf
[0], sizeof(buf
[0])),
2824 inet_ntop(AF_INET
, &iph
->ip_dst
, buf
[1], sizeof(buf
[1])),
2825 inet_ntop(AF_INET
, &oi
->address
->u
.prefix4
,
2826 buf
[2], sizeof(buf
[2])));
2828 if (iph
->ip_dst
.s_addr
== htonl(OSPF_ALLSPFROUTERS
))
2830 /* Try to fix multicast membership.
2831 * Some OS:es may have problems in this area,
2832 * make sure it is removed.
2834 OI_MEMBER_JOINED(oi
, MEMBER_ALLROUTERS
);
2835 ospf_if_set_multicast(oi
);
2841 /* if no local ospf_interface,
2842 * or header area is backbone but ospf_interface is not
2843 * check for VLINK interface
2845 if ( (oi
== NULL
) ||
2846 (OSPF_IS_AREA_ID_BACKBONE(ospfh
->area_id
)
2847 && !OSPF_IS_AREA_ID_BACKBONE(oi
->area
->area_id
))
2850 if ((oi
= ospf_associate_packet_vl (ospf
, ifp
, iph
, ospfh
)) == NULL
)
2852 if (IS_DEBUG_OSPF_EVENT
)
2853 zlog_debug ("Packet from [%s] received on link %s"
2854 " but no ospf_interface",
2855 inet_ntoa (iph
->ip_src
), ifp
->name
);
2860 /* else it must be a local ospf interface, check it was received on
2863 else if (oi
->ifp
!= ifp
)
2865 if (IS_DEBUG_OSPF_EVENT
)
2866 zlog_warn ("Packet from [%s] received on wrong link %s",
2867 inet_ntoa (iph
->ip_src
), ifp
->name
);
2870 else if (oi
->state
== ISM_Down
)
2872 char buf
[2][INET_ADDRSTRLEN
];
2873 zlog_warn ("Ignoring packet from %s to %s received on interface that is "
2874 "down [%s]; interface flags are %s",
2875 inet_ntop(AF_INET
, &iph
->ip_src
, buf
[0], sizeof(buf
[0])),
2876 inet_ntop(AF_INET
, &iph
->ip_dst
, buf
[1], sizeof(buf
[1])),
2877 ifp
->name
, if_flag_dump(ifp
->flags
));
2878 /* Fix multicast memberships? */
2879 if (iph
->ip_dst
.s_addr
== htonl(OSPF_ALLSPFROUTERS
))
2880 OI_MEMBER_JOINED(oi
, MEMBER_ALLROUTERS
);
2881 else if (iph
->ip_dst
.s_addr
== htonl(OSPF_ALLDROUTERS
))
2882 OI_MEMBER_JOINED(oi
, MEMBER_DROUTERS
);
2883 if (oi
->multicast_memberships
)
2884 ospf_if_set_multicast(oi
);
2889 * If the received packet is destined for AllDRouters, the packet
2890 * should be accepted only if the received ospf interface state is
2891 * either DR or Backup -- endo.
2893 if (iph
->ip_dst
.s_addr
== htonl (OSPF_ALLDROUTERS
)
2894 && (oi
->state
!= ISM_DR
&& oi
->state
!= ISM_Backup
))
2896 zlog_warn ("Dropping packet for AllDRouters from [%s] via [%s] (ISM: %s)",
2897 inet_ntoa (iph
->ip_src
), IF_NAME (oi
),
2898 LOOKUP (ospf_ism_state_msg
, oi
->state
));
2899 /* Try to fix multicast membership. */
2900 SET_FLAG(oi
->multicast_memberships
, MEMBER_DROUTERS
);
2901 ospf_if_set_multicast(oi
);
2905 /* Verify more OSPF header fields. */
2906 ret
= ospf_verify_header (ibuf
, oi
, iph
, ospfh
);
2909 if (IS_DEBUG_OSPF_PACKET (0, RECV
))
2910 zlog_debug ("ospf_read[%s]: Header check failed, "
2912 inet_ntoa (iph
->ip_src
));
2916 /* Show debug receiving packet. */
2917 if (IS_DEBUG_OSPF_PACKET (ospfh
->type
- 1, RECV
))
2919 if (IS_DEBUG_OSPF_PACKET (ospfh
->type
- 1, DETAIL
))
2921 zlog_debug ("-----------------------------------------------------");
2922 ospf_packet_dump (ibuf
);
2925 zlog_debug ("%s received from [%s] via [%s]",
2926 LOOKUP (ospf_packet_type_str
, ospfh
->type
),
2927 inet_ntoa (ospfh
->router_id
), IF_NAME (oi
));
2928 zlog_debug (" src [%s],", inet_ntoa (iph
->ip_src
));
2929 zlog_debug (" dst [%s]", inet_ntoa (iph
->ip_dst
));
2931 if (IS_DEBUG_OSPF_PACKET (ospfh
->type
- 1, DETAIL
))
2932 zlog_debug ("-----------------------------------------------------");
2935 stream_forward_getp (ibuf
, OSPF_HEADER_SIZE
);
2937 /* Adjust size to message length. */
2938 length
= ntohs (ospfh
->length
) - OSPF_HEADER_SIZE
;
2940 /* Read rest of the packet and call each sort of packet routine. */
2941 switch (ospfh
->type
)
2943 case OSPF_MSG_HELLO
:
2944 ospf_hello (iph
, ospfh
, ibuf
, oi
, length
);
2946 case OSPF_MSG_DB_DESC
:
2947 ospf_db_desc (iph
, ospfh
, ibuf
, oi
, length
);
2949 case OSPF_MSG_LS_REQ
:
2950 ospf_ls_req (iph
, ospfh
, ibuf
, oi
, length
);
2952 case OSPF_MSG_LS_UPD
:
2953 ospf_ls_upd (iph
, ospfh
, ibuf
, oi
, length
);
2955 case OSPF_MSG_LS_ACK
:
2956 ospf_ls_ack (iph
, ospfh
, ibuf
, oi
, length
);
2959 zlog (NULL
, LOG_WARNING
,
2960 "interface %s: OSPF packet header type %d is illegal",
2961 IF_NAME (oi
), ospfh
->type
);
2968 /* Make OSPF header. */
2970 ospf_make_header (int type
, struct ospf_interface
*oi
, struct stream
*s
)
2972 struct ospf_header
*ospfh
;
2974 ospfh
= (struct ospf_header
*) STREAM_DATA (s
);
2976 ospfh
->version
= (u_char
) OSPF_VERSION
;
2977 ospfh
->type
= (u_char
) type
;
2979 ospfh
->router_id
= oi
->ospf
->router_id
;
2981 ospfh
->checksum
= 0;
2982 ospfh
->area_id
= oi
->area
->area_id
;
2983 ospfh
->auth_type
= htons (ospf_auth_type (oi
));
2985 memset (ospfh
->u
.auth_data
, 0, OSPF_AUTH_SIMPLE_SIZE
);
2987 stream_forward_endp (s
, OSPF_HEADER_SIZE
);
2990 /* Make Authentication Data. */
2992 ospf_make_auth (struct ospf_interface
*oi
, struct ospf_header
*ospfh
)
2994 struct crypt_key
*ck
;
2996 switch (ospf_auth_type (oi
))
2998 case OSPF_AUTH_NULL
:
2999 /* memset (ospfh->u.auth_data, 0, sizeof (ospfh->u.auth_data)); */
3001 case OSPF_AUTH_SIMPLE
:
3002 memcpy (ospfh
->u
.auth_data
, OSPF_IF_PARAM (oi
, auth_simple
),
3003 OSPF_AUTH_SIMPLE_SIZE
);
3005 case OSPF_AUTH_CRYPTOGRAPHIC
:
3006 /* If key is not set, then set 0. */
3007 if (list_isempty (OSPF_IF_PARAM (oi
, auth_crypt
)))
3009 ospfh
->u
.crypt
.zero
= 0;
3010 ospfh
->u
.crypt
.key_id
= 0;
3011 ospfh
->u
.crypt
.auth_data_len
= OSPF_AUTH_MD5_SIZE
;
3015 ck
= listgetdata (listtail(OSPF_IF_PARAM (oi
, auth_crypt
)));
3016 ospfh
->u
.crypt
.zero
= 0;
3017 ospfh
->u
.crypt
.key_id
= ck
->key_id
;
3018 ospfh
->u
.crypt
.auth_data_len
= OSPF_AUTH_MD5_SIZE
;
3020 /* note: the seq is done in ospf_make_md5_digest() */
3023 /* memset (ospfh->u.auth_data, 0, sizeof (ospfh->u.auth_data)); */
3030 /* Fill rest of OSPF header. */
3032 ospf_fill_header (struct ospf_interface
*oi
,
3033 struct stream
*s
, u_int16_t length
)
3035 struct ospf_header
*ospfh
;
3037 ospfh
= (struct ospf_header
*) STREAM_DATA (s
);
3040 ospfh
->length
= htons (length
);
3042 /* Calculate checksum. */
3043 if (ntohs (ospfh
->auth_type
) != OSPF_AUTH_CRYPTOGRAPHIC
)
3044 ospfh
->checksum
= in_cksum (ospfh
, length
);
3046 ospfh
->checksum
= 0;
3048 /* Add Authentication Data. */
3049 ospf_make_auth (oi
, ospfh
);
3053 ospf_make_hello (struct ospf_interface
*oi
, struct stream
*s
)
3055 struct ospf_neighbor
*nbr
;
3056 struct route_node
*rn
;
3057 u_int16_t length
= OSPF_HELLO_MIN_SIZE
;
3058 struct in_addr mask
;
3062 /* Set netmask of interface. */
3063 if (oi
->type
!= OSPF_IFTYPE_POINTOPOINT
&&
3064 oi
->type
!= OSPF_IFTYPE_VIRTUALLINK
)
3065 masklen2ip (oi
->address
->prefixlen
, &mask
);
3067 memset ((char *) &mask
, 0, sizeof (struct in_addr
));
3068 stream_put_ipv4 (s
, mask
.s_addr
);
3070 /* Set Hello Interval. */
3071 if (OSPF_IF_PARAM (oi
, fast_hello
) == 0)
3072 stream_putw (s
, OSPF_IF_PARAM (oi
, v_hello
));
3074 stream_putw (s
, 0); /* hello-interval of 0 for fast-hellos */
3076 if (IS_DEBUG_OSPF_EVENT
)
3077 zlog_debug ("make_hello: options: %x, int: %s",
3078 OPTIONS(oi
), IF_NAME (oi
));
3081 stream_putc (s
, OPTIONS (oi
));
3083 /* Set Router Priority. */
3084 stream_putc (s
, PRIORITY (oi
));
3086 /* Set Router Dead Interval. */
3087 stream_putl (s
, OSPF_IF_PARAM (oi
, v_wait
));
3089 /* Set Designated Router. */
3090 stream_put_ipv4 (s
, DR (oi
).s_addr
);
3092 p
= stream_get_endp (s
);
3094 /* Set Backup Designated Router. */
3095 stream_put_ipv4 (s
, BDR (oi
).s_addr
);
3097 /* Add neighbor seen. */
3098 for (rn
= route_top (oi
->nbrs
); rn
; rn
= route_next (rn
))
3099 if ((nbr
= rn
->info
))
3100 if (nbr
->router_id
.s_addr
!= 0) /* Ignore 0.0.0.0 node. */
3101 if (nbr
->state
!= NSM_Attempt
) /* Ignore Down neighbor. */
3102 if (nbr
->state
!= NSM_Down
) /* This is myself for DR election. */
3103 if (!IPV4_ADDR_SAME (&nbr
->router_id
, &oi
->ospf
->router_id
))
3105 /* Check neighbor is sane? */
3106 if (nbr
->d_router
.s_addr
!= 0
3107 && IPV4_ADDR_SAME (&nbr
->d_router
, &oi
->address
->u
.prefix4
)
3108 && IPV4_ADDR_SAME (&nbr
->bd_router
, &oi
->address
->u
.prefix4
))
3111 stream_put_ipv4 (s
, nbr
->router_id
.s_addr
);
3115 /* Let neighbor generate BackupSeen. */
3117 stream_putl_at (s
, p
, 0); /* ipv4 address, normally */
3123 ospf_make_db_desc (struct ospf_interface
*oi
, struct ospf_neighbor
*nbr
,
3126 struct ospf_lsa
*lsa
;
3127 u_int16_t length
= OSPF_DB_DESC_MIN_SIZE
;
3131 struct ospf_lsdb
*lsdb
;
3133 /* Set Interface MTU. */
3134 if (oi
->type
== OSPF_IFTYPE_VIRTUALLINK
)
3137 stream_putw (s
, oi
->ifp
->mtu
);
3140 options
= OPTIONS (oi
);
3141 #ifdef HAVE_OPAQUE_LSA
3142 if (CHECK_FLAG (oi
->ospf
->config
, OSPF_OPAQUE_CAPABLE
))
3144 if (IS_SET_DD_I (nbr
->dd_flags
)
3145 || CHECK_FLAG (nbr
->options
, OSPF_OPTION_O
))
3147 * Set O-bit in the outgoing DD packet for capablity negotiation,
3148 * if one of following case is applicable.
3150 * 1) WaitTimer expiration event triggered the neighbor state to
3151 * change to Exstart, but no (valid) DD packet has received
3152 * from the neighbor yet.
3154 * 2) At least one DD packet with O-bit on has received from the
3157 SET_FLAG (options
, OSPF_OPTION_O
);
3159 #endif /* HAVE_OPAQUE_LSA */
3160 stream_putc (s
, options
);
3163 pp
= stream_get_endp (s
);
3164 stream_putc (s
, nbr
->dd_flags
);
3166 /* Set DD Sequence Number. */
3167 stream_putl (s
, nbr
->dd_seqnum
);
3169 /* shortcut unneeded walk of (empty) summary LSDBs */
3170 if (ospf_db_summary_isempty (nbr
))
3173 /* Describe LSA Header from Database Summary List. */
3174 lsdb
= &nbr
->db_sum
;
3176 for (i
= OSPF_MIN_LSA
; i
< OSPF_MAX_LSA
; i
++)
3178 struct route_table
*table
= lsdb
->type
[i
].db
;
3179 struct route_node
*rn
;
3181 for (rn
= route_top (table
); rn
; rn
= route_next (rn
))
3182 if ((lsa
= rn
->info
) != NULL
)
3184 #ifdef HAVE_OPAQUE_LSA
3185 if (IS_OPAQUE_LSA (lsa
->data
->type
)
3186 && (! CHECK_FLAG (options
, OSPF_OPTION_O
)))
3188 /* Suppress advertising opaque-informations. */
3189 /* Remove LSA from DB summary list. */
3190 ospf_lsdb_delete (lsdb
, lsa
);
3193 #endif /* HAVE_OPAQUE_LSA */
3195 if (!CHECK_FLAG (lsa
->flags
, OSPF_LSA_DISCARD
))
3197 struct lsa_header
*lsah
;
3200 /* DD packet overflows interface MTU. */
3201 if (length
+ OSPF_LSA_HEADER_SIZE
> ospf_packet_max (oi
))
3204 /* Keep pointer to LS age. */
3205 lsah
= (struct lsa_header
*) (STREAM_DATA (s
) +
3206 stream_get_endp (s
));
3208 /* Proceed stream pointer. */
3209 stream_put (s
, lsa
->data
, OSPF_LSA_HEADER_SIZE
);
3210 length
+= OSPF_LSA_HEADER_SIZE
;
3213 ls_age
= LS_AGE (lsa
);
3214 lsah
->ls_age
= htons (ls_age
);
3218 /* Remove LSA from DB summary list. */
3219 ospf_lsdb_delete (lsdb
, lsa
);
3223 /* Update 'More' bit */
3224 if (ospf_db_summary_isempty (nbr
))
3227 if (nbr
->state
>= NSM_Exchange
)
3229 UNSET_FLAG (nbr
->dd_flags
, OSPF_DD_FLAG_M
);
3230 /* Rewrite DD flags */
3231 stream_putc_at (s
, pp
, nbr
->dd_flags
);
3235 assert (IS_SET_DD_M(nbr
->dd_flags
));
3242 ospf_make_ls_req_func (struct stream
*s
, u_int16_t
*length
,
3243 unsigned long delta
, struct ospf_neighbor
*nbr
,
3244 struct ospf_lsa
*lsa
)
3246 struct ospf_interface
*oi
;
3250 /* LS Request packet overflows interface MTU. */
3251 if (*length
+ delta
> ospf_packet_max(oi
))
3254 stream_putl (s
, lsa
->data
->type
);
3255 stream_put_ipv4 (s
, lsa
->data
->id
.s_addr
);
3256 stream_put_ipv4 (s
, lsa
->data
->adv_router
.s_addr
);
3258 ospf_lsa_unlock (&nbr
->ls_req_last
);
3259 nbr
->ls_req_last
= ospf_lsa_lock (lsa
);
3266 ospf_make_ls_req (struct ospf_neighbor
*nbr
, struct stream
*s
)
3268 struct ospf_lsa
*lsa
;
3269 u_int16_t length
= OSPF_LS_REQ_MIN_SIZE
;
3270 unsigned long delta
= stream_get_endp(s
)+12;
3271 struct route_table
*table
;
3272 struct route_node
*rn
;
3274 struct ospf_lsdb
*lsdb
;
3276 lsdb
= &nbr
->ls_req
;
3278 for (i
= OSPF_MIN_LSA
; i
< OSPF_MAX_LSA
; i
++)
3280 table
= lsdb
->type
[i
].db
;
3281 for (rn
= route_top (table
); rn
; rn
= route_next (rn
))
3282 if ((lsa
= (rn
->info
)) != NULL
)
3283 if (ospf_make_ls_req_func (s
, &length
, delta
, nbr
, lsa
) == 0)
3285 route_unlock_node (rn
);
3293 ls_age_increment (struct ospf_lsa
*lsa
, int delay
)
3297 age
= IS_LSA_MAXAGE (lsa
) ? OSPF_LSA_MAXAGE
: LS_AGE (lsa
) + delay
;
3299 return (age
> OSPF_LSA_MAXAGE
? OSPF_LSA_MAXAGE
: age
);
3303 ospf_make_ls_upd (struct ospf_interface
*oi
, struct list
*update
, struct stream
*s
)
3305 struct ospf_lsa
*lsa
;
3306 struct listnode
*node
;
3307 u_int16_t length
= 0;
3308 unsigned int size_noauth
;
3309 unsigned long delta
= stream_get_endp (s
);
3313 if (IS_DEBUG_OSPF_EVENT
)
3314 zlog_debug ("ospf_make_ls_upd: Start");
3316 pp
= stream_get_endp (s
);
3317 stream_forward_endp (s
, OSPF_LS_UPD_MIN_SIZE
);
3318 length
+= OSPF_LS_UPD_MIN_SIZE
;
3320 /* Calculate amount of packet usable for data. */
3321 size_noauth
= stream_get_size(s
) - ospf_packet_authspace(oi
);
3323 while ((node
= listhead (update
)) != NULL
)
3325 struct lsa_header
*lsah
;
3328 if (IS_DEBUG_OSPF_EVENT
)
3329 zlog_debug ("ospf_make_ls_upd: List Iteration");
3331 lsa
= listgetdata (node
);
3336 if (length
+ delta
+ ntohs (lsa
->data
->length
) > size_noauth
)
3339 /* Keep pointer to LS age. */
3340 lsah
= (struct lsa_header
*) (STREAM_DATA (s
) + stream_get_endp (s
));
3342 /* Put LSA to Link State Request. */
3343 stream_put (s
, lsa
->data
, ntohs (lsa
->data
->length
));
3346 /* each hop must increment an lsa_age by transmit_delay
3347 of OSPF interface */
3348 ls_age
= ls_age_increment (lsa
, OSPF_IF_PARAM (oi
, transmit_delay
));
3349 lsah
->ls_age
= htons (ls_age
);
3351 length
+= ntohs (lsa
->data
->length
);
3354 list_delete_node (update
, node
);
3355 ospf_lsa_unlock (&lsa
); /* oi->ls_upd_queue */
3358 /* Now set #LSAs. */
3359 stream_putl_at (s
, pp
, count
);
3361 if (IS_DEBUG_OSPF_EVENT
)
3362 zlog_debug ("ospf_make_ls_upd: Stop");
3367 ospf_make_ls_ack (struct ospf_interface
*oi
, struct list
*ack
, struct stream
*s
)
3369 struct listnode
*node
, *nnode
;
3370 u_int16_t length
= OSPF_LS_ACK_MIN_SIZE
;
3371 unsigned long delta
= stream_get_endp(s
) + 24;
3372 struct ospf_lsa
*lsa
;
3374 for (ALL_LIST_ELEMENTS (ack
, node
, nnode
, lsa
))
3378 if (length
+ delta
> ospf_packet_max (oi
))
3381 stream_put (s
, lsa
->data
, OSPF_LSA_HEADER_SIZE
);
3382 length
+= OSPF_LSA_HEADER_SIZE
;
3384 listnode_delete (ack
, lsa
);
3385 ospf_lsa_unlock (&lsa
); /* oi->ls_ack_direct.ls_ack */
3392 ospf_hello_send_sub (struct ospf_interface
*oi
, in_addr_t addr
)
3394 struct ospf_packet
*op
;
3395 u_int16_t length
= OSPF_HEADER_SIZE
;
3397 op
= ospf_packet_new (oi
->ifp
->mtu
);
3399 /* Prepare OSPF common header. */
3400 ospf_make_header (OSPF_MSG_HELLO
, oi
, op
->s
);
3402 /* Prepare OSPF Hello body. */
3403 length
+= ospf_make_hello (oi
, op
->s
);
3405 /* Fill OSPF header. */
3406 ospf_fill_header (oi
, op
->s
, length
);
3408 /* Set packet length. */
3409 op
->length
= length
;
3411 op
->dst
.s_addr
= addr
;
3413 /* Add packet to the top of the interface output queue, so that they
3414 * can't get delayed by things like long queues of LS Update packets
3416 ospf_packet_add_top (oi
, op
);
3418 /* Hook thread to write packet. */
3419 OSPF_ISM_WRITE_ON (oi
->ospf
);
3423 ospf_poll_send (struct ospf_nbr_nbma
*nbr_nbma
)
3425 struct ospf_interface
*oi
;
3430 /* If this is passive interface, do not send OSPF Hello. */
3431 if (OSPF_IF_PASSIVE_STATUS (oi
) == OSPF_IF_PASSIVE
)
3434 if (oi
->type
!= OSPF_IFTYPE_NBMA
)
3437 if (nbr_nbma
->nbr
!= NULL
&& nbr_nbma
->nbr
->state
!= NSM_Down
)
3440 if (PRIORITY(oi
) == 0)
3443 if (nbr_nbma
->priority
== 0
3444 && oi
->state
!= ISM_DR
&& oi
->state
!= ISM_Backup
)
3447 ospf_hello_send_sub (oi
, nbr_nbma
->addr
.s_addr
);
3451 ospf_poll_timer (struct thread
*thread
)
3453 struct ospf_nbr_nbma
*nbr_nbma
;
3455 nbr_nbma
= THREAD_ARG (thread
);
3456 nbr_nbma
->t_poll
= NULL
;
3458 if (IS_DEBUG_OSPF (nsm
, NSM_TIMERS
))
3459 zlog (NULL
, LOG_DEBUG
, "NSM[%s:%s]: Timer (Poll timer expire)",
3460 IF_NAME (nbr_nbma
->oi
), inet_ntoa (nbr_nbma
->addr
));
3462 ospf_poll_send (nbr_nbma
);
3464 if (nbr_nbma
->v_poll
> 0)
3465 OSPF_POLL_TIMER_ON (nbr_nbma
->t_poll
, ospf_poll_timer
,
3473 ospf_hello_reply_timer (struct thread
*thread
)
3475 struct ospf_neighbor
*nbr
;
3477 nbr
= THREAD_ARG (thread
);
3478 nbr
->t_hello_reply
= NULL
;
3482 if (IS_DEBUG_OSPF (nsm
, NSM_TIMERS
))
3483 zlog (NULL
, LOG_DEBUG
, "NSM[%s:%s]: Timer (hello-reply timer expire)",
3484 IF_NAME (nbr
->oi
), inet_ntoa (nbr
->router_id
));
3486 ospf_hello_send_sub (nbr
->oi
, nbr
->address
.u
.prefix4
.s_addr
);
3491 /* Send OSPF Hello. */
3493 ospf_hello_send (struct ospf_interface
*oi
)
3495 /* If this is passive interface, do not send OSPF Hello. */
3496 if (OSPF_IF_PASSIVE_STATUS (oi
) == OSPF_IF_PASSIVE
)
3499 if (oi
->type
== OSPF_IFTYPE_NBMA
)
3501 struct ospf_neighbor
*nbr
;
3502 struct route_node
*rn
;
3504 for (rn
= route_top (oi
->nbrs
); rn
; rn
= route_next (rn
))
3505 if ((nbr
= rn
->info
))
3506 if (nbr
!= oi
->nbr_self
)
3507 if (nbr
->state
!= NSM_Down
)
3509 /* RFC 2328 Section 9.5.1
3510 If the router is not eligible to become Designated Router,
3511 it must periodically send Hello Packets to both the
3512 Designated Router and the Backup Designated Router (if they
3514 if (PRIORITY(oi
) == 0 &&
3515 IPV4_ADDR_CMP(&DR(oi
), &nbr
->address
.u
.prefix4
) &&
3516 IPV4_ADDR_CMP(&BDR(oi
), &nbr
->address
.u
.prefix4
))
3519 /* If the router is eligible to become Designated Router, it
3520 must periodically send Hello Packets to all neighbors that
3521 are also eligible. In addition, if the router is itself the
3522 Designated Router or Backup Designated Router, it must also
3523 send periodic Hello Packets to all other neighbors. */
3525 if (nbr
->priority
== 0 && oi
->state
== ISM_DROther
)
3527 /* if oi->state == Waiting, send hello to all neighbors */
3528 ospf_hello_send_sub (oi
, nbr
->address
.u
.prefix4
.s_addr
);
3533 /* Decide destination address. */
3534 if (oi
->type
== OSPF_IFTYPE_VIRTUALLINK
)
3535 ospf_hello_send_sub (oi
, oi
->vl_data
->peer_addr
.s_addr
);
3537 ospf_hello_send_sub (oi
, htonl (OSPF_ALLSPFROUTERS
));
3541 /* Send OSPF Database Description. */
3543 ospf_db_desc_send (struct ospf_neighbor
*nbr
)
3545 struct ospf_interface
*oi
;
3546 struct ospf_packet
*op
;
3547 u_int16_t length
= OSPF_HEADER_SIZE
;
3550 op
= ospf_packet_new (oi
->ifp
->mtu
);
3552 /* Prepare OSPF common header. */
3553 ospf_make_header (OSPF_MSG_DB_DESC
, oi
, op
->s
);
3555 /* Prepare OSPF Database Description body. */
3556 length
+= ospf_make_db_desc (oi
, nbr
, op
->s
);
3558 /* Fill OSPF header. */
3559 ospf_fill_header (oi
, op
->s
, length
);
3561 /* Set packet length. */
3562 op
->length
= length
;
3564 /* Decide destination address. */
3565 if (oi
->type
== OSPF_IFTYPE_POINTOPOINT
)
3566 op
->dst
.s_addr
= htonl (OSPF_ALLSPFROUTERS
);
3568 op
->dst
= nbr
->address
.u
.prefix4
;
3570 /* Add packet to the interface output queue. */
3571 ospf_packet_add (oi
, op
);
3573 /* Hook thread to write packet. */
3574 OSPF_ISM_WRITE_ON (oi
->ospf
);
3576 /* Remove old DD packet, then copy new one and keep in neighbor structure. */
3578 ospf_packet_free (nbr
->last_send
);
3579 nbr
->last_send
= ospf_packet_dup (op
);
3580 quagga_gettime (QUAGGA_CLK_MONOTONIC
, &nbr
->last_send_ts
);
3583 /* Re-send Database Description. */
3585 ospf_db_desc_resend (struct ospf_neighbor
*nbr
)
3587 struct ospf_interface
*oi
;
3591 /* Add packet to the interface output queue. */
3592 ospf_packet_add (oi
, ospf_packet_dup (nbr
->last_send
));
3594 /* Hook thread to write packet. */
3595 OSPF_ISM_WRITE_ON (oi
->ospf
);
3598 /* Send Link State Request. */
3600 ospf_ls_req_send (struct ospf_neighbor
*nbr
)
3602 struct ospf_interface
*oi
;
3603 struct ospf_packet
*op
;
3604 u_int16_t length
= OSPF_HEADER_SIZE
;
3607 op
= ospf_packet_new (oi
->ifp
->mtu
);
3609 /* Prepare OSPF common header. */
3610 ospf_make_header (OSPF_MSG_LS_REQ
, oi
, op
->s
);
3612 /* Prepare OSPF Link State Request body. */
3613 length
+= ospf_make_ls_req (nbr
, op
->s
);
3614 if (length
== OSPF_HEADER_SIZE
)
3616 ospf_packet_free (op
);
3620 /* Fill OSPF header. */
3621 ospf_fill_header (oi
, op
->s
, length
);
3623 /* Set packet length. */
3624 op
->length
= length
;
3626 /* Decide destination address. */
3627 if (oi
->type
== OSPF_IFTYPE_POINTOPOINT
)
3628 op
->dst
.s_addr
= htonl (OSPF_ALLSPFROUTERS
);
3630 op
->dst
= nbr
->address
.u
.prefix4
;
3632 /* Add packet to the interface output queue. */
3633 ospf_packet_add (oi
, op
);
3635 /* Hook thread to write packet. */
3636 OSPF_ISM_WRITE_ON (oi
->ospf
);
3638 /* Add Link State Request Retransmission Timer. */
3639 OSPF_NSM_TIMER_ON (nbr
->t_ls_req
, ospf_ls_req_timer
, nbr
->v_ls_req
);
3642 /* Send Link State Update with an LSA. */
3644 ospf_ls_upd_send_lsa (struct ospf_neighbor
*nbr
, struct ospf_lsa
*lsa
,
3647 struct list
*update
;
3649 update
= list_new ();
3651 listnode_add (update
, lsa
);
3652 ospf_ls_upd_send (nbr
, update
, flag
);
3654 list_delete (update
);
3657 /* Determine size for packet. Must be at least big enough to accomodate next
3658 * LSA on list, which may be bigger than MTU size.
3660 * Return pointer to new ospf_packet
3661 * NULL if we can not allocate, eg because LSA is bigger than imposed limit
3662 * on packet sizes (in which case offending LSA is deleted from update list)
3664 static struct ospf_packet
*
3665 ospf_ls_upd_packet_new (struct list
*update
, struct ospf_interface
*oi
)
3667 struct ospf_lsa
*lsa
;
3668 struct listnode
*ln
;
3670 static char warned
= 0;
3672 lsa
= listgetdata((ln
= listhead (update
)));
3675 if ((OSPF_LS_UPD_MIN_SIZE
+ ntohs (lsa
->data
->length
))
3676 > ospf_packet_max (oi
))
3680 zlog_warn ("ospf_ls_upd_packet_new: oversized LSA encountered!"
3681 "will need to fragment. Not optimal. Try divide up"
3682 " your network with areas. Use 'debug ospf packet send'"
3683 " to see details, or look at 'show ip ospf database ..'");
3687 if (IS_DEBUG_OSPF_PACKET (0, SEND
))
3688 zlog_debug ("ospf_ls_upd_packet_new: oversized LSA id:%s,"
3689 " %d bytes originated by %s, will be fragmented!",
3690 inet_ntoa (lsa
->data
->id
),
3691 ntohs (lsa
->data
->length
),
3692 inet_ntoa (lsa
->data
->adv_router
));
3695 * Allocate just enough to fit this LSA only, to avoid including other
3696 * LSAs in fragmented LSA Updates.
3698 size
= ntohs (lsa
->data
->length
) + (oi
->ifp
->mtu
- ospf_packet_max (oi
))
3699 + OSPF_LS_UPD_MIN_SIZE
;
3702 size
= oi
->ifp
->mtu
;
3704 if (size
> OSPF_MAX_PACKET_SIZE
)
3706 zlog_warn ("ospf_ls_upd_packet_new: oversized LSA id:%s too big,"
3707 " %d bytes, packet size %ld, dropping it completely."
3708 " OSPF routing is broken!",
3709 inet_ntoa (lsa
->data
->id
), ntohs (lsa
->data
->length
),
3711 list_delete_node (update
, ln
);
3715 /* IP header is built up separately by ospf_write(). This means, that we must
3716 * reduce the "affordable" size just calculated by length of an IP header.
3717 * This makes sure, that even if we manage to fill the payload with LSA data
3718 * completely, the final packet (our data plus IP header) still fits into
3719 * outgoing interface MTU. This correction isn't really meaningful for an
3720 * oversized LSA, but for consistency the correction is done for both cases.
3722 * P.S. OSPF_MAX_PACKET_SIZE above already includes IP header size
3724 return ospf_packet_new (size
- sizeof (struct ip
));
3728 ospf_ls_upd_queue_send (struct ospf_interface
*oi
, struct list
*update
,
3729 struct in_addr addr
)
3731 struct ospf_packet
*op
;
3732 u_int16_t length
= OSPF_HEADER_SIZE
;
3734 if (IS_DEBUG_OSPF_EVENT
)
3735 zlog_debug ("listcount = %d, dst %s", listcount (update
), inet_ntoa(addr
));
3737 op
= ospf_ls_upd_packet_new (update
, oi
);
3739 /* Prepare OSPF common header. */
3740 ospf_make_header (OSPF_MSG_LS_UPD
, oi
, op
->s
);
3742 /* Prepare OSPF Link State Update body.
3743 * Includes Type-7 translation.
3745 length
+= ospf_make_ls_upd (oi
, update
, op
->s
);
3747 /* Fill OSPF header. */
3748 ospf_fill_header (oi
, op
->s
, length
);
3750 /* Set packet length. */
3751 op
->length
= length
;
3753 /* Decide destination address. */
3754 if (oi
->type
== OSPF_IFTYPE_POINTOPOINT
)
3755 op
->dst
.s_addr
= htonl (OSPF_ALLSPFROUTERS
);
3757 op
->dst
.s_addr
= addr
.s_addr
;
3759 /* Add packet to the interface output queue. */
3760 ospf_packet_add (oi
, op
);
3762 /* Hook thread to write packet. */
3763 OSPF_ISM_WRITE_ON (oi
->ospf
);
3767 ospf_ls_upd_send_queue_event (struct thread
*thread
)
3769 struct ospf_interface
*oi
= THREAD_ARG(thread
);
3770 struct route_node
*rn
;
3771 struct route_node
*rnext
;
3772 struct list
*update
;
3775 oi
->t_ls_upd_event
= NULL
;
3777 if (IS_DEBUG_OSPF_EVENT
)
3778 zlog_debug ("ospf_ls_upd_send_queue start");
3780 for (rn
= route_top (oi
->ls_upd_queue
); rn
; rn
= rnext
)
3782 rnext
= route_next (rn
);
3784 if (rn
->info
== NULL
)
3787 update
= (struct list
*)rn
->info
;
3789 ospf_ls_upd_queue_send (oi
, update
, rn
->p
.u
.prefix4
);
3791 /* list might not be empty. */
3792 if (listcount(update
) == 0)
3794 list_delete (rn
->info
);
3796 route_unlock_node (rn
);
3804 if (IS_DEBUG_OSPF_EVENT
)
3805 zlog_debug ("ospf_ls_upd_send_queue: update lists not cleared,"
3806 " %d nodes to try again, raising new event", again
);
3807 oi
->t_ls_upd_event
=
3808 thread_add_event (master
, ospf_ls_upd_send_queue_event
, oi
, 0);
3811 if (IS_DEBUG_OSPF_EVENT
)
3812 zlog_debug ("ospf_ls_upd_send_queue stop");
3818 ospf_ls_upd_send (struct ospf_neighbor
*nbr
, struct list
*update
, int flag
)
3820 struct ospf_interface
*oi
;
3821 struct ospf_lsa
*lsa
;
3822 struct prefix_ipv4 p
;
3823 struct route_node
*rn
;
3824 struct listnode
*node
;
3829 p
.prefixlen
= IPV4_MAX_BITLEN
;
3831 /* Decide destination address. */
3832 if (oi
->type
== OSPF_IFTYPE_VIRTUALLINK
)
3833 p
.prefix
= oi
->vl_data
->peer_addr
;
3834 else if (oi
->type
== OSPF_IFTYPE_POINTOPOINT
)
3835 p
.prefix
.s_addr
= htonl (OSPF_ALLSPFROUTERS
);
3836 else if (flag
== OSPF_SEND_PACKET_DIRECT
)
3837 p
.prefix
= nbr
->address
.u
.prefix4
;
3838 else if (oi
->state
== ISM_DR
|| oi
->state
== ISM_Backup
)
3839 p
.prefix
.s_addr
= htonl (OSPF_ALLSPFROUTERS
);
3840 else if (oi
->type
== OSPF_IFTYPE_POINTOMULTIPOINT
)
3841 p
.prefix
.s_addr
= htonl (OSPF_ALLSPFROUTERS
);
3843 p
.prefix
.s_addr
= htonl (OSPF_ALLDROUTERS
);
3845 if (oi
->type
== OSPF_IFTYPE_NBMA
)
3847 if (flag
== OSPF_SEND_PACKET_INDIRECT
)
3848 zlog_warn ("* LS-Update is directly sent on NBMA network.");
3849 if (IPV4_ADDR_SAME(&oi
->address
->u
.prefix4
, &p
.prefix
.s_addr
))
3850 zlog_warn ("* LS-Update is sent to myself.");
3853 rn
= route_node_get (oi
->ls_upd_queue
, (struct prefix
*) &p
);
3855 if (rn
->info
== NULL
)
3856 rn
->info
= list_new ();
3858 for (ALL_LIST_ELEMENTS_RO (update
, node
, lsa
))
3859 listnode_add (rn
->info
, ospf_lsa_lock (lsa
)); /* oi->ls_upd_queue */
3861 if (oi
->t_ls_upd_event
== NULL
)
3862 oi
->t_ls_upd_event
=
3863 thread_add_event (master
, ospf_ls_upd_send_queue_event
, oi
, 0);
3867 ospf_ls_ack_send_list (struct ospf_interface
*oi
, struct list
*ack
,
3870 struct ospf_packet
*op
;
3871 u_int16_t length
= OSPF_HEADER_SIZE
;
3873 op
= ospf_packet_new (oi
->ifp
->mtu
);
3875 /* Prepare OSPF common header. */
3876 ospf_make_header (OSPF_MSG_LS_ACK
, oi
, op
->s
);
3878 /* Prepare OSPF Link State Acknowledgment body. */
3879 length
+= ospf_make_ls_ack (oi
, ack
, op
->s
);
3881 /* Fill OSPF header. */
3882 ospf_fill_header (oi
, op
->s
, length
);
3884 /* Set packet length. */
3885 op
->length
= length
;
3887 /* Set destination IP address. */
3890 /* Add packet to the interface output queue. */
3891 ospf_packet_add (oi
, op
);
3893 /* Hook thread to write packet. */
3894 OSPF_ISM_WRITE_ON (oi
->ospf
);
3898 ospf_ls_ack_send_event (struct thread
*thread
)
3900 struct ospf_interface
*oi
= THREAD_ARG (thread
);
3902 oi
->t_ls_ack_direct
= NULL
;
3904 while (listcount (oi
->ls_ack_direct
.ls_ack
))
3905 ospf_ls_ack_send_list (oi
, oi
->ls_ack_direct
.ls_ack
,
3906 oi
->ls_ack_direct
.dst
);
3912 ospf_ls_ack_send (struct ospf_neighbor
*nbr
, struct ospf_lsa
*lsa
)
3914 struct ospf_interface
*oi
= nbr
->oi
;
3916 if (listcount (oi
->ls_ack_direct
.ls_ack
) == 0)
3917 oi
->ls_ack_direct
.dst
= nbr
->address
.u
.prefix4
;
3919 listnode_add (oi
->ls_ack_direct
.ls_ack
, ospf_lsa_lock (lsa
));
3921 if (oi
->t_ls_ack_direct
== NULL
)
3922 oi
->t_ls_ack_direct
=
3923 thread_add_event (master
, ospf_ls_ack_send_event
, oi
, 0);
3926 /* Send Link State Acknowledgment delayed. */
3928 ospf_ls_ack_send_delayed (struct ospf_interface
*oi
)
3932 /* Decide destination address. */
3933 /* RFC2328 Section 13.5 On non-broadcast
3934 networks, delayed Link State Acknowledgment packets must be
3935 unicast separately over each adjacency (i.e., neighbor whose
3936 state is >= Exchange). */
3937 if (oi
->type
== OSPF_IFTYPE_NBMA
)
3939 struct ospf_neighbor
*nbr
;
3940 struct route_node
*rn
;
3942 for (rn
= route_top (oi
->nbrs
); rn
; rn
= route_next (rn
))
3943 if ((nbr
= rn
->info
) != NULL
)
3944 if (nbr
!= oi
->nbr_self
&& nbr
->state
>= NSM_Exchange
)
3945 while (listcount (oi
->ls_ack
))
3946 ospf_ls_ack_send_list (oi
, oi
->ls_ack
, nbr
->address
.u
.prefix4
);
3949 if (oi
->type
== OSPF_IFTYPE_VIRTUALLINK
)
3950 dst
.s_addr
= oi
->vl_data
->peer_addr
.s_addr
;
3951 else if (oi
->state
== ISM_DR
|| oi
->state
== ISM_Backup
)
3952 dst
.s_addr
= htonl (OSPF_ALLSPFROUTERS
);
3953 else if (oi
->type
== OSPF_IFTYPE_POINTOPOINT
)
3954 dst
.s_addr
= htonl (OSPF_ALLSPFROUTERS
);
3955 else if (oi
->type
== OSPF_IFTYPE_POINTOMULTIPOINT
)
3956 dst
.s_addr
= htonl (OSPF_ALLSPFROUTERS
);
3958 dst
.s_addr
= htonl (OSPF_ALLDROUTERS
);
3960 while (listcount (oi
->ls_ack
))
3961 ospf_ls_ack_send_list (oi
, oi
->ls_ack
, dst
);