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
32 #include "sockunion.h"
40 #include "ospfd/ospfd.h"
41 #include "ospfd/ospf_network.h"
42 #include "ospfd/ospf_interface.h"
43 #include "ospfd/ospf_ism.h"
44 #include "ospfd/ospf_asbr.h"
45 #include "ospfd/ospf_lsa.h"
46 #include "ospfd/ospf_lsdb.h"
47 #include "ospfd/ospf_neighbor.h"
48 #include "ospfd/ospf_nsm.h"
49 #include "ospfd/ospf_packet.h"
50 #include "ospfd/ospf_spf.h"
51 #include "ospfd/ospf_flood.h"
52 #include "ospfd/ospf_dump.h"
55 * OSPF Fragmentation / fragmented writes
57 * ospfd can support writing fragmented packets, for cases where
58 * kernel will not fragment IP_HDRINCL and/or multicast destined
59 * packets (ie TTBOMK all kernels, BSD, SunOS, Linux). However,
60 * SunOS, probably BSD too, clobber the user supplied IP ID and IP
61 * flags fields, hence user-space fragmentation will not work.
62 * Only Linux is known to leave IP header unmolested.
63 * Further, fragmentation really should be done the kernel, which already
64 * supports it, and which avoids nasty IP ID state problems.
66 * Fragmentation of OSPF packets can be required on networks with router
67 * with many many interfaces active in one area, or on networks with links
71 #define WANT_OSPF_WRITE_FRAGMENT
74 /* Packet Type String. */
75 const struct message ospf_packet_type_str
[] = {
76 {OSPF_MSG_HELLO
, "Hello"},
77 {OSPF_MSG_DB_DESC
, "Database Description"},
78 {OSPF_MSG_LS_REQ
, "Link State Request"},
79 {OSPF_MSG_LS_UPD
, "Link State Update"},
80 {OSPF_MSG_LS_ACK
, "Link State Acknowledgment"},
83 /* Minimum (besides OSPF_HEADER_SIZE) lengths for OSPF packets of
84 particular types, offset is the "type" field of a packet. */
85 static const u_int16_t ospf_packet_minlen
[] = {
88 OSPF_DB_DESC_MIN_SIZE
,
94 /* Minimum (besides OSPF_LSA_HEADER_SIZE) lengths for LSAs of particular
95 types, offset is the "LSA type" field. */
96 static const u_int16_t ospf_lsa_minlen
[] = {
98 OSPF_ROUTER_LSA_MIN_SIZE
,
99 OSPF_NETWORK_LSA_MIN_SIZE
,
100 OSPF_SUMMARY_LSA_MIN_SIZE
,
101 OSPF_SUMMARY_LSA_MIN_SIZE
,
102 OSPF_AS_EXTERNAL_LSA_MIN_SIZE
,
104 OSPF_AS_EXTERNAL_LSA_MIN_SIZE
,
111 /* for ospf_check_auth() */
112 static int ospf_check_sum(struct ospf_header
*);
114 /* OSPF authentication checking function */
115 static int ospf_auth_type(struct ospf_interface
*oi
)
119 if (OSPF_IF_PARAM(oi
, auth_type
) == OSPF_AUTH_NOTSET
)
120 auth_type
= oi
->area
->auth_type
;
122 auth_type
= OSPF_IF_PARAM(oi
, auth_type
);
124 /* Handle case where MD5 key list is not configured aka Cisco */
125 if (auth_type
== OSPF_AUTH_CRYPTOGRAPHIC
126 && list_isempty(OSPF_IF_PARAM(oi
, auth_crypt
)))
127 return OSPF_AUTH_NULL
;
132 struct ospf_packet
*ospf_packet_new(size_t size
)
134 struct ospf_packet
*new;
136 new = XCALLOC(MTYPE_OSPF_PACKET
, sizeof(struct ospf_packet
));
137 new->s
= stream_new(size
);
142 void ospf_packet_free(struct ospf_packet
*op
)
147 XFREE(MTYPE_OSPF_PACKET
, op
);
152 struct ospf_fifo
*ospf_fifo_new()
154 struct ospf_fifo
*new;
156 new = XCALLOC(MTYPE_OSPF_FIFO
, sizeof(struct ospf_fifo
));
160 /* Add new packet to fifo. */
161 void ospf_fifo_push(struct ospf_fifo
*fifo
, struct ospf_packet
*op
)
164 fifo
->tail
->next
= op
;
173 /* Add new packet to head of fifo. */
174 static void ospf_fifo_push_head(struct ospf_fifo
*fifo
, struct ospf_packet
*op
)
176 op
->next
= fifo
->head
;
178 if (fifo
->tail
== NULL
)
186 /* Delete first packet from fifo. */
187 struct ospf_packet
*ospf_fifo_pop(struct ospf_fifo
*fifo
)
189 struct ospf_packet
*op
;
194 fifo
->head
= op
->next
;
196 if (fifo
->head
== NULL
)
205 /* Return first fifo entry. */
206 struct ospf_packet
*ospf_fifo_head(struct ospf_fifo
*fifo
)
211 /* Flush ospf packet fifo. */
212 void ospf_fifo_flush(struct ospf_fifo
*fifo
)
214 struct ospf_packet
*op
;
215 struct ospf_packet
*next
;
217 for (op
= fifo
->head
; op
; op
= next
) {
219 ospf_packet_free(op
);
221 fifo
->head
= fifo
->tail
= NULL
;
225 /* Free ospf packet fifo. */
226 void ospf_fifo_free(struct ospf_fifo
*fifo
)
228 ospf_fifo_flush(fifo
);
230 XFREE(MTYPE_OSPF_FIFO
, fifo
);
233 void ospf_packet_add(struct ospf_interface
*oi
, struct ospf_packet
*op
)
237 "ospf_packet_add(interface %s in state %d [%s], packet type %s, "
238 "destination %s) called with NULL obuf, ignoring "
239 "(please report this bug)!\n",
240 IF_NAME(oi
), oi
->state
,
241 lookup_msg(ospf_ism_state_msg
, oi
->state
, NULL
),
242 lookup_msg(ospf_packet_type_str
,
243 stream_getc_from(op
->s
, 1), NULL
),
248 /* Add packet to end of queue. */
249 ospf_fifo_push(oi
->obuf
, op
);
251 /* Debug of packet fifo*/
252 /* ospf_fifo_debug (oi->obuf); */
255 static void ospf_packet_add_top(struct ospf_interface
*oi
,
256 struct ospf_packet
*op
)
260 "ospf_packet_add(interface %s in state %d [%s], packet type %s, "
261 "destination %s) called with NULL obuf, ignoring "
262 "(please report this bug)!\n",
263 IF_NAME(oi
), oi
->state
,
264 lookup_msg(ospf_ism_state_msg
, oi
->state
, NULL
),
265 lookup_msg(ospf_packet_type_str
,
266 stream_getc_from(op
->s
, 1), NULL
),
271 /* Add packet to head of queue. */
272 ospf_fifo_push_head(oi
->obuf
, op
);
274 /* Debug of packet fifo*/
275 /* ospf_fifo_debug (oi->obuf); */
278 void ospf_packet_delete(struct ospf_interface
*oi
)
280 struct ospf_packet
*op
;
282 op
= ospf_fifo_pop(oi
->obuf
);
285 ospf_packet_free(op
);
288 struct ospf_packet
*ospf_packet_dup(struct ospf_packet
*op
)
290 struct ospf_packet
*new;
292 if (stream_get_endp(op
->s
) != op
->length
)
295 "ospf_packet_dup stream %lu ospf_packet %u size mismatch",
296 (u_long
)STREAM_SIZE(op
->s
), op
->length
);
298 /* Reserve space for MD5 authentication that may be added later. */
299 new = ospf_packet_new(stream_get_endp(op
->s
) + OSPF_AUTH_MD5_SIZE
);
300 stream_copy(new->s
, op
->s
);
303 new->length
= op
->length
;
309 static unsigned int ospf_packet_authspace(struct ospf_interface
*oi
)
313 if (ospf_auth_type(oi
) == OSPF_AUTH_CRYPTOGRAPHIC
)
314 auth
= OSPF_AUTH_MD5_SIZE
;
319 static unsigned int ospf_packet_max(struct ospf_interface
*oi
)
323 max
= oi
->ifp
->mtu
- ospf_packet_authspace(oi
);
325 max
-= (OSPF_HEADER_SIZE
+ sizeof(struct ip
));
331 static int ospf_check_md5_digest(struct ospf_interface
*oi
,
332 struct ospf_header
*ospfh
)
335 unsigned char digest
[OSPF_AUTH_MD5_SIZE
];
336 struct crypt_key
*ck
;
337 struct ospf_neighbor
*nbr
;
338 u_int16_t length
= ntohs(ospfh
->length
);
340 /* Get secret key. */
341 ck
= ospf_crypt_key_lookup(OSPF_IF_PARAM(oi
, auth_crypt
),
342 ospfh
->u
.crypt
.key_id
);
344 zlog_warn("interface %s: ospf_check_md5 no key %d", IF_NAME(oi
),
345 ospfh
->u
.crypt
.key_id
);
349 /* check crypto seqnum. */
350 nbr
= ospf_nbr_lookup_by_routerid(oi
->nbrs
, &ospfh
->router_id
);
353 && ntohl(nbr
->crypt_seqnum
) > ntohl(ospfh
->u
.crypt
.crypt_seqnum
)) {
355 "interface %s: ospf_check_md5 bad sequence %d (expect %d)",
356 IF_NAME(oi
), ntohl(ospfh
->u
.crypt
.crypt_seqnum
),
357 ntohl(nbr
->crypt_seqnum
));
361 /* Generate a digest for the ospf packet - their digest + our digest. */
362 memset(&ctx
, 0, sizeof(ctx
));
364 MD5Update(&ctx
, ospfh
, length
);
365 MD5Update(&ctx
, ck
->auth_key
, OSPF_AUTH_MD5_SIZE
);
366 MD5Final(digest
, &ctx
);
368 /* compare the two */
369 if (memcmp((caddr_t
)ospfh
+ length
, digest
, OSPF_AUTH_MD5_SIZE
)) {
370 zlog_warn("interface %s: ospf_check_md5 checksum mismatch",
375 /* save neighbor's crypt_seqnum */
377 nbr
->crypt_seqnum
= ospfh
->u
.crypt
.crypt_seqnum
;
381 /* This function is called from ospf_write(), it will detect the
382 authentication scheme and if it is MD5, it will change the sequence
383 and update the MD5 digest. */
384 static int ospf_make_md5_digest(struct ospf_interface
*oi
,
385 struct ospf_packet
*op
)
387 struct ospf_header
*ospfh
;
388 unsigned char digest
[OSPF_AUTH_MD5_SIZE
] = {0};
392 struct crypt_key
*ck
;
393 const u_int8_t
*auth_key
;
395 ibuf
= STREAM_DATA(op
->s
);
396 ospfh
= (struct ospf_header
*)ibuf
;
398 if (ntohs(ospfh
->auth_type
) != OSPF_AUTH_CRYPTOGRAPHIC
)
401 /* We do this here so when we dup a packet, we don't have to
402 waste CPU rewriting other headers.
404 Note that quagga_time /deliberately/ is not used here */
405 t
= (time(NULL
) & 0xFFFFFFFF);
406 if (t
> oi
->crypt_seqnum
)
407 oi
->crypt_seqnum
= t
;
411 ospfh
->u
.crypt
.crypt_seqnum
= htonl(oi
->crypt_seqnum
);
413 /* Get MD5 Authentication key from auth_key list. */
414 if (list_isempty(OSPF_IF_PARAM(oi
, auth_crypt
)))
415 auth_key
= (const u_int8_t
*)digest
;
417 ck
= listgetdata(listtail(OSPF_IF_PARAM(oi
, auth_crypt
)));
418 auth_key
= ck
->auth_key
;
421 /* Generate a digest for the entire packet + our secret key. */
422 memset(&ctx
, 0, sizeof(ctx
));
424 MD5Update(&ctx
, ibuf
, ntohs(ospfh
->length
));
425 MD5Update(&ctx
, auth_key
, OSPF_AUTH_MD5_SIZE
);
426 MD5Final(digest
, &ctx
);
428 /* Append md5 digest to the end of the stream. */
429 stream_put(op
->s
, digest
, OSPF_AUTH_MD5_SIZE
);
431 /* We do *NOT* increment the OSPF header length. */
432 op
->length
= ntohs(ospfh
->length
) + OSPF_AUTH_MD5_SIZE
;
434 if (stream_get_endp(op
->s
) != op
->length
)
437 "ospf_make_md5_digest: length mismatch stream %lu ospf_packet %u",
438 (u_long
)stream_get_endp(op
->s
), op
->length
);
440 return OSPF_AUTH_MD5_SIZE
;
444 static int ospf_ls_req_timer(struct thread
*thread
)
446 struct ospf_neighbor
*nbr
;
448 nbr
= THREAD_ARG(thread
);
449 nbr
->t_ls_req
= NULL
;
451 /* Send Link State Request. */
452 if (ospf_ls_request_count(nbr
))
453 ospf_ls_req_send(nbr
);
455 /* Set Link State Request retransmission timer. */
456 OSPF_NSM_TIMER_ON(nbr
->t_ls_req
, ospf_ls_req_timer
, nbr
->v_ls_req
);
461 void ospf_ls_req_event(struct ospf_neighbor
*nbr
)
464 thread_cancel(nbr
->t_ls_req
);
465 nbr
->t_ls_req
= NULL
;
467 nbr
->t_ls_req
= thread_add_event(master
, ospf_ls_req_timer
, nbr
, 0);
470 /* Cyclic timer function. Fist registered in ospf_nbr_new () in
472 int ospf_ls_upd_timer(struct thread
*thread
)
474 struct ospf_neighbor
*nbr
;
476 nbr
= THREAD_ARG(thread
);
477 nbr
->t_ls_upd
= NULL
;
479 /* Send Link State Update. */
480 if (ospf_ls_retransmit_count(nbr
) > 0) {
482 struct ospf_lsdb
*lsdb
;
484 int retransmit_interval
;
486 retransmit_interval
=
487 OSPF_IF_PARAM(nbr
->oi
, retransmit_interval
);
489 lsdb
= &nbr
->ls_rxmt
;
492 for (i
= OSPF_MIN_LSA
; i
< OSPF_MAX_LSA
; i
++) {
493 struct route_table
*table
= lsdb
->type
[i
].db
;
494 struct route_node
*rn
;
496 for (rn
= route_top(table
); rn
; rn
= route_next(rn
)) {
497 struct ospf_lsa
*lsa
;
499 if ((lsa
= rn
->info
) != NULL
) {
500 /* Don't retransmit an LSA if we
502 the last RxmtInterval seconds - this
504 neighbour a chance to acknowledge the
506 have ben just received before the
508 fired. This is a small tweak to what
510 but it will cut out out a lot of
513 if (monotime_since(&lsa
->tv_recv
, NULL
)
514 >= retransmit_interval
* 1000000LL)
515 listnode_add(update
, rn
->info
);
520 if (listcount(update
) > 0)
521 ospf_ls_upd_send(nbr
, update
, OSPF_SEND_PACKET_DIRECT
);
525 /* Set LS Update retransmission timer. */
526 OSPF_NSM_TIMER_ON(nbr
->t_ls_upd
, ospf_ls_upd_timer
, nbr
->v_ls_upd
);
531 int ospf_ls_ack_timer(struct thread
*thread
)
533 struct ospf_interface
*oi
;
535 oi
= THREAD_ARG(thread
);
538 /* Send Link State Acknowledgment. */
539 if (listcount(oi
->ls_ack
) > 0)
540 ospf_ls_ack_send_delayed(oi
);
542 /* Set LS Ack timer. */
543 OSPF_ISM_TIMER_ON(oi
->t_ls_ack
, ospf_ls_ack_timer
, oi
->v_ls_ack
);
548 #ifdef WANT_OSPF_WRITE_FRAGMENT
549 static void ospf_write_frags(int fd
, struct ospf_packet
*op
, struct ip
*iph
,
550 struct msghdr
*msg
, unsigned int maxdatasize
,
551 unsigned int mtu
, int flags
, u_char type
)
553 #define OSPF_WRITE_FRAG_SHIFT 3
558 assert(op
->length
== stream_get_endp(op
->s
));
559 assert(msg
->msg_iovlen
== 2);
563 * SunOS, BSD and BSD derived kernels likely will clear ip_id, as
564 * well as the IP_MF flag, making this all quite pointless.
566 * However, for a system on which IP_MF is left alone, and ip_id left
567 * alone or else which sets same ip_id for each fragment this might
570 * XXX-TODO: It would be much nicer to have the kernel's use their
571 * existing fragmentation support to do this for us. Bugs/RFEs need to
572 * be raised against the various kernels.
576 iph
->ip_off
|= IP_MF
;
578 /* ip frag offset is expressed in units of 8byte words */
579 offset
= maxdatasize
>> OSPF_WRITE_FRAG_SHIFT
;
581 iovp
= &msg
->msg_iov
[1];
583 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
);
598 "*** ospf_write_frags: sendmsg failed to %s,"
599 " id %d, off %d, len %d, mtu %u failed with %s",
600 inet_ntoa(iph
->ip_dst
), iph
->ip_id
, iph
->ip_off
,
601 iph
->ip_len
, mtu
, safe_strerror(errno
));
603 if (IS_DEBUG_OSPF_PACKET(type
- 1, SEND
)) {
605 "ospf_write_frags: sent id %d, off %d, len %d to %s\n",
606 iph
->ip_id
, iph
->ip_off
, iph
->ip_len
,
607 inet_ntoa(iph
->ip_dst
));
608 if (IS_DEBUG_OSPF_PACKET(type
- 1, DETAIL
)) {
610 "-----------------IP Header Dump----------------------");
611 ospf_ip_header_dump(iph
);
613 "-----------------------------------------------------");
617 iph
->ip_off
+= offset
;
618 stream_forward_getp(op
->s
, iovp
->iov_len
);
619 iovp
->iov_base
= STREAM_PNT(op
->s
);
622 /* setup for final fragment */
623 iovp
->iov_len
= stream_get_endp(op
->s
) - stream_get_getp(op
->s
);
624 iph
->ip_len
= iovp
->iov_len
+ sizeof(struct ip
);
625 iph
->ip_off
&= (~IP_MF
);
627 #endif /* WANT_OSPF_WRITE_FRAGMENT */
629 static int ospf_write(struct thread
*thread
)
631 struct ospf
*ospf
= THREAD_ARG(thread
);
632 struct ospf_interface
*oi
;
633 struct ospf_interface
*last_serviced_oi
= NULL
;
634 struct ospf_packet
*op
;
635 struct sockaddr_in sa_dst
;
642 struct listnode
*node
;
643 #ifdef WANT_OSPF_WRITE_FRAGMENT
644 static u_int16_t ipid
= 0;
645 u_int16_t maxdatasize
;
646 #endif /* WANT_OSPF_WRITE_FRAGMENT */
648 /* clang-format off */
649 #define OSPF_WRITE_IPHL_SHIFT 2
652 ospf
->t_write
= NULL
;
654 node
= listhead(ospf
->oi_write_q
);
656 oi
= listgetdata(node
);
659 #ifdef WANT_OSPF_WRITE_FRAGMENT
660 /* seed ipid static with low order bits of time */
662 ipid
= (time(NULL
) & 0xffff);
663 #endif /* WANT_OSPF_WRITE_FRAGMENT */
665 while ((pkt_count
< ospf
->write_oi_count
) && oi
666 && (last_serviced_oi
!= oi
)) {
667 /* If there is only packet in the queue, the oi is removed from
668 write-q, so fix up the last interface that was serviced */
669 if (last_serviced_oi
== NULL
) {
670 last_serviced_oi
= oi
;
673 #ifdef WANT_OSPF_WRITE_FRAGMENT
674 /* convenience - max OSPF data per packet */
675 maxdatasize
= oi
->ifp
->mtu
- sizeof(struct ip
);
676 #endif /* WANT_OSPF_WRITE_FRAGMENT */
677 /* Get one packet from queue. */
678 op
= ospf_fifo_head(oi
->obuf
);
680 assert(op
->length
>= OSPF_HEADER_SIZE
);
682 if (op
->dst
.s_addr
== htonl(OSPF_ALLSPFROUTERS
)
683 || op
->dst
.s_addr
== htonl(OSPF_ALLDROUTERS
))
684 ospf_if_ipmulticast(ospf
, oi
->address
,
687 /* Rewrite the md5 signature & update the seq */
688 ospf_make_md5_digest(oi
, op
);
690 /* Retrieve OSPF packet type. */
691 stream_set_getp(op
->s
, 1);
692 type
= stream_getc(op
->s
);
694 /* reset get pointer */
695 stream_set_getp(op
->s
, 0);
697 memset(&iph
, 0, sizeof(struct ip
));
698 memset(&sa_dst
, 0, sizeof(sa_dst
));
700 sa_dst
.sin_family
= AF_INET
;
701 #ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
702 sa_dst
.sin_len
= sizeof(sa_dst
);
703 #endif /* HAVE_STRUCT_SOCKADDR_IN_SIN_LEN */
704 sa_dst
.sin_addr
= op
->dst
;
705 sa_dst
.sin_port
= htons(0);
707 /* Set DONTROUTE flag if dst is unicast. */
708 if (oi
->type
!= OSPF_IFTYPE_VIRTUALLINK
)
709 if (!IN_MULTICAST(htonl(op
->dst
.s_addr
)))
710 flags
= MSG_DONTROUTE
;
712 iph
.ip_hl
= sizeof(struct ip
) >> OSPF_WRITE_IPHL_SHIFT
;
713 /* it'd be very strange for header to not be 4byte-word aligned
715 if (sizeof(struct ip
)
716 > (unsigned int)(iph
.ip_hl
<< OSPF_WRITE_IPHL_SHIFT
))
717 iph
.ip_hl
++; /* we presume sizeof struct ip cant
720 iph
.ip_v
= IPVERSION
;
721 iph
.ip_tos
= IPTOS_PREC_INTERNETCONTROL
;
722 iph
.ip_len
= (iph
.ip_hl
<< OSPF_WRITE_IPHL_SHIFT
) + op
->length
;
724 #if defined(__DragonFly__)
726 * DragonFly's raw socket expects ip_len/ip_off in network byte
729 iph
.ip_len
= htons(iph
.ip_len
);
732 #ifdef WANT_OSPF_WRITE_FRAGMENT
733 /* XXX-MT: not thread-safe at all..
734 * XXX: this presumes this is only programme sending OSPF
736 * otherwise, no guarantee ipid will be unique
739 #endif /* WANT_OSPF_WRITE_FRAGMENT */
742 if (oi
->type
== OSPF_IFTYPE_VIRTUALLINK
)
743 iph
.ip_ttl
= OSPF_VL_IP_TTL
;
745 iph
.ip_ttl
= OSPF_IP_TTL
;
746 iph
.ip_p
= IPPROTO_OSPFIGP
;
748 iph
.ip_src
.s_addr
= oi
->address
->u
.prefix4
.s_addr
;
749 iph
.ip_dst
.s_addr
= op
->dst
.s_addr
;
751 memset(&msg
, 0, sizeof(msg
));
752 msg
.msg_name
= (caddr_t
)&sa_dst
;
753 msg
.msg_namelen
= sizeof(sa_dst
);
756 iov
[0].iov_base
= (char *)&iph
;
757 iov
[0].iov_len
= iph
.ip_hl
<< OSPF_WRITE_IPHL_SHIFT
;
758 iov
[1].iov_base
= STREAM_PNT(op
->s
);
759 iov
[1].iov_len
= op
->length
;
761 /* Sadly we can not rely on kernels to fragment packets because of either
762 * IP_HDRINCL and/or multicast destination being set.
764 #ifdef WANT_OSPF_WRITE_FRAGMENT
765 if (op
->length
> maxdatasize
)
766 ospf_write_frags(ospf
->fd
, op
, &iph
, &msg
, maxdatasize
,
767 oi
->ifp
->mtu
, flags
, type
);
768 #endif /* WANT_OSPF_WRITE_FRAGMENT */
770 /* send final fragment (could be first) */
771 sockopt_iphdrincl_swab_htosys(&iph
);
772 ret
= sendmsg(ospf
->fd
, &msg
, flags
);
773 sockopt_iphdrincl_swab_systoh(&iph
);
774 if (IS_DEBUG_OSPF_EVENT
)
777 "id %d, off %d, len %d, interface %s, mtu %u:",
778 inet_ntoa(iph
.ip_dst
), iph
.ip_id
, iph
.ip_off
,
779 iph
.ip_len
, oi
->ifp
->name
, oi
->ifp
->mtu
);
783 "*** sendmsg in ospf_write failed to %s, "
784 "id %d, off %d, len %d, interface %s, mtu %u: %s",
785 inet_ntoa(iph
.ip_dst
), iph
.ip_id
, iph
.ip_off
,
786 iph
.ip_len
, oi
->ifp
->name
, oi
->ifp
->mtu
,
787 safe_strerror(errno
));
789 /* Show debug sending packet. */
790 if (IS_DEBUG_OSPF_PACKET(type
- 1, SEND
)) {
791 if (IS_DEBUG_OSPF_PACKET(type
- 1, DETAIL
)) {
793 "-----------------------------------------------------");
794 ospf_ip_header_dump(&iph
);
795 stream_set_getp(op
->s
, 0);
796 ospf_packet_dump(op
->s
);
799 zlog_debug("%s sent to [%s] via [%s].",
800 lookup_msg(ospf_packet_type_str
, type
, NULL
),
801 inet_ntoa(op
->dst
), IF_NAME(oi
));
803 if (IS_DEBUG_OSPF_PACKET(type
- 1, DETAIL
))
805 "-----------------------------------------------------");
808 /* Now delete packet from queue. */
809 ospf_packet_delete(oi
);
811 /* Move this interface to the tail of write_q to
812 serve everyone in a round robin fashion */
813 list_delete_node(ospf
->oi_write_q
, node
);
814 if (ospf_fifo_head(oi
->obuf
) == NULL
) {
816 last_serviced_oi
= NULL
;
819 listnode_add(ospf
->oi_write_q
, oi
);
822 /* Setup to service from the head of the queue again */
823 if (!list_isempty(ospf
->oi_write_q
)) {
824 node
= listhead(ospf
->oi_write_q
);
826 oi
= listgetdata(node
);
831 /* If packets still remain in queue, call write thread. */
832 if (!list_isempty(ospf
->oi_write_q
))
834 thread_add_write(master
, ospf_write
, ospf
, ospf
->fd
);
839 /* OSPF Hello message read -- RFC2328 Section 10.5. */
840 static void ospf_hello(struct ip
*iph
, struct ospf_header
*ospfh
,
841 struct stream
*s
, struct ospf_interface
*oi
, int size
)
843 struct ospf_hello
*hello
;
844 struct ospf_neighbor
*nbr
;
848 /* increment statistics. */
851 hello
= (struct ospf_hello
*)STREAM_PNT(s
);
853 /* If Hello is myself, silently discard. */
854 if (IPV4_ADDR_SAME(&ospfh
->router_id
, &oi
->ospf
->router_id
)) {
855 if (IS_DEBUG_OSPF_PACKET(ospfh
->type
- 1, RECV
)) {
857 "ospf_header[%s/%s]: selforiginated, "
859 lookup_msg(ospf_packet_type_str
, ospfh
->type
,
861 inet_ntoa(iph
->ip_src
));
866 /* get neighbor prefix. */
868 p
.prefixlen
= ip_masklen(hello
->network_mask
);
869 p
.u
.prefix4
= iph
->ip_src
;
871 /* Compare network mask. */
872 /* Checking is ignored for Point-to-Point and Virtual link. */
873 if (oi
->type
!= OSPF_IFTYPE_POINTOPOINT
874 && oi
->type
!= OSPF_IFTYPE_VIRTUALLINK
)
875 if (oi
->address
->prefixlen
!= p
.prefixlen
) {
877 "Packet %s [Hello:RECV]: NetworkMask mismatch on %s (configured prefix length is %d, but hello packet indicates %d).",
878 inet_ntoa(ospfh
->router_id
), IF_NAME(oi
),
879 (int)oi
->address
->prefixlen
, (int)p
.prefixlen
);
883 /* Compare Router Dead Interval. */
884 if (OSPF_IF_PARAM(oi
, v_wait
) != ntohl(hello
->dead_interval
)) {
886 "Packet %s [Hello:RECV]: RouterDeadInterval mismatch "
887 "(expected %u, but received %u).",
888 inet_ntoa(ospfh
->router_id
), OSPF_IF_PARAM(oi
, v_wait
),
889 ntohl(hello
->dead_interval
));
893 /* Compare Hello Interval - ignored if fast-hellos are set. */
894 if (OSPF_IF_PARAM(oi
, fast_hello
) == 0) {
895 if (OSPF_IF_PARAM(oi
, v_hello
)
896 != ntohs(hello
->hello_interval
)) {
898 "Packet %s [Hello:RECV]: HelloInterval mismatch "
899 "(expected %u, but received %u).",
900 inet_ntoa(ospfh
->router_id
),
901 OSPF_IF_PARAM(oi
, v_hello
),
902 ntohs(hello
->hello_interval
));
907 if (IS_DEBUG_OSPF_EVENT
)
908 zlog_debug("Packet %s [Hello:RECV]: Options %s",
909 inet_ntoa(ospfh
->router_id
),
910 ospf_options_dump(hello
->options
));
912 /* Compare options. */
913 #define REJECT_IF_TBIT_ON 1 /* XXX */
914 #ifdef REJECT_IF_TBIT_ON
915 if (CHECK_FLAG(hello
->options
, OSPF_OPTION_MT
)) {
917 * This router does not support non-zero TOS.
918 * Drop this Hello packet not to establish neighbor
921 zlog_warn("Packet %s [Hello:RECV]: T-bit on, drop it.",
922 inet_ntoa(ospfh
->router_id
));
925 #endif /* REJECT_IF_TBIT_ON */
927 if (CHECK_FLAG(oi
->ospf
->config
, OSPF_OPAQUE_CAPABLE
)
928 && CHECK_FLAG(hello
->options
, OSPF_OPTION_O
)) {
930 * This router does know the correct usage of O-bit
931 * the bit should be set in DD packet only.
933 zlog_warn("Packet %s [Hello:RECV]: O-bit abuse?",
934 inet_ntoa(ospfh
->router_id
));
935 #ifdef STRICT_OBIT_USAGE_CHECK
936 return; /* Reject this packet. */
937 #else /* STRICT_OBIT_USAGE_CHECK */
938 UNSET_FLAG(hello
->options
, OSPF_OPTION_O
); /* Ignore O-bit. */
939 #endif /* STRICT_OBIT_USAGE_CHECK */
942 /* new for NSSA is to ensure that NP is on and E is off */
944 if (oi
->area
->external_routing
== OSPF_AREA_NSSA
) {
945 if (!(CHECK_FLAG(OPTIONS(oi
), OSPF_OPTION_NP
)
946 && CHECK_FLAG(hello
->options
, OSPF_OPTION_NP
)
947 && !CHECK_FLAG(OPTIONS(oi
), OSPF_OPTION_E
)
948 && !CHECK_FLAG(hello
->options
, OSPF_OPTION_E
))) {
950 "NSSA-Packet-%s[Hello:RECV]: my options: %x, his options %x",
951 inet_ntoa(ospfh
->router_id
), OPTIONS(oi
),
955 if (IS_DEBUG_OSPF_NSSA
)
956 zlog_debug("NSSA-Hello:RECV:Packet from %s:",
957 inet_ntoa(ospfh
->router_id
));
959 /* The setting of the E-bit found in the Hello Packet's Options
960 field must match this area's ExternalRoutingCapability A
961 mismatch causes processing to stop and the packet to be
962 dropped. The setting of the rest of the bits in the Hello
963 Packet's Options field should be ignored. */
964 if (CHECK_FLAG(OPTIONS(oi
), OSPF_OPTION_E
)
965 != CHECK_FLAG(hello
->options
, OSPF_OPTION_E
)) {
967 "Packet %s [Hello:RECV]: my options: %x, his options %x",
968 inet_ntoa(ospfh
->router_id
), OPTIONS(oi
),
973 /* get neighbour struct */
974 nbr
= ospf_nbr_get(oi
, ospfh
, iph
, &p
);
976 /* neighbour must be valid, ospf_nbr_get creates if none existed */
979 old_state
= nbr
->state
;
981 /* Add event to thread. */
982 OSPF_NSM_EVENT_SCHEDULE(nbr
, NSM_PacketReceived
);
984 /* RFC2328 Section 9.5.1
985 If the router is not eligible to become Designated Router,
986 (snip) It must also send an Hello Packet in reply to an
987 Hello Packet received from any eligible neighbor (other than
988 the current Designated Router and Backup Designated Router). */
989 if (oi
->type
== OSPF_IFTYPE_NBMA
)
990 if (PRIORITY(oi
) == 0 && hello
->priority
> 0
991 && IPV4_ADDR_CMP(&DR(oi
), &iph
->ip_src
)
992 && IPV4_ADDR_CMP(&BDR(oi
), &iph
->ip_src
))
993 OSPF_NSM_TIMER_ON(nbr
->t_hello_reply
,
994 ospf_hello_reply_timer
,
995 OSPF_HELLO_REPLY_DELAY
);
997 /* on NBMA network type, it happens to receive bidirectional Hello
999 without advance 1-Way Received event.
1000 To avoid incorrect DR-seletion, raise 1-Way Received event.*/
1001 if (oi
->type
== OSPF_IFTYPE_NBMA
1002 && (old_state
== NSM_Down
|| old_state
== NSM_Attempt
)) {
1003 OSPF_NSM_EVENT_SCHEDULE(nbr
, NSM_OneWayReceived
);
1004 nbr
->priority
= hello
->priority
;
1005 nbr
->d_router
= hello
->d_router
;
1006 nbr
->bd_router
= hello
->bd_router
;
1010 if (ospf_nbr_bidirectional(&oi
->ospf
->router_id
, hello
->neighbors
,
1011 size
- OSPF_HELLO_MIN_SIZE
)) {
1012 OSPF_NSM_EVENT_SCHEDULE(nbr
, NSM_TwoWayReceived
);
1013 nbr
->options
|= hello
->options
;
1015 OSPF_NSM_EVENT_SCHEDULE(nbr
, NSM_OneWayReceived
);
1016 /* Set neighbor information. */
1017 nbr
->priority
= hello
->priority
;
1018 nbr
->d_router
= hello
->d_router
;
1019 nbr
->bd_router
= hello
->bd_router
;
1023 /* If neighbor itself declares DR and no BDR exists,
1024 cause event BackupSeen */
1025 if (IPV4_ADDR_SAME(&nbr
->address
.u
.prefix4
, &hello
->d_router
))
1026 if (hello
->bd_router
.s_addr
== 0 && oi
->state
== ISM_Waiting
)
1027 OSPF_ISM_EVENT_SCHEDULE(oi
, ISM_BackupSeen
);
1029 /* neighbor itself declares BDR. */
1030 if (oi
->state
== ISM_Waiting
1031 && IPV4_ADDR_SAME(&nbr
->address
.u
.prefix4
, &hello
->bd_router
))
1032 OSPF_ISM_EVENT_SCHEDULE(oi
, ISM_BackupSeen
);
1034 /* had not previously. */
1035 if ((IPV4_ADDR_SAME(&nbr
->address
.u
.prefix4
, &hello
->d_router
)
1036 && IPV4_ADDR_CMP(&nbr
->address
.u
.prefix4
, &nbr
->d_router
))
1037 || (IPV4_ADDR_CMP(&nbr
->address
.u
.prefix4
, &hello
->d_router
)
1038 && IPV4_ADDR_SAME(&nbr
->address
.u
.prefix4
, &nbr
->d_router
)))
1039 OSPF_ISM_EVENT_SCHEDULE(oi
, ISM_NeighborChange
);
1041 /* had not previously. */
1042 if ((IPV4_ADDR_SAME(&nbr
->address
.u
.prefix4
, &hello
->bd_router
)
1043 && IPV4_ADDR_CMP(&nbr
->address
.u
.prefix4
, &nbr
->bd_router
))
1044 || (IPV4_ADDR_CMP(&nbr
->address
.u
.prefix4
, &hello
->bd_router
)
1045 && IPV4_ADDR_SAME(&nbr
->address
.u
.prefix4
, &nbr
->bd_router
)))
1046 OSPF_ISM_EVENT_SCHEDULE(oi
, ISM_NeighborChange
);
1048 /* Neighbor priority check. */
1049 if (nbr
->priority
>= 0 && nbr
->priority
!= hello
->priority
)
1050 OSPF_ISM_EVENT_SCHEDULE(oi
, ISM_NeighborChange
);
1052 /* Set neighbor information. */
1053 nbr
->priority
= hello
->priority
;
1054 nbr
->d_router
= hello
->d_router
;
1055 nbr
->bd_router
= hello
->bd_router
;
1058 /* Save DD flags/options/Seqnum received. */
1059 static void ospf_db_desc_save_current(struct ospf_neighbor
*nbr
,
1060 struct ospf_db_desc
*dd
)
1062 nbr
->last_recv
.flags
= dd
->flags
;
1063 nbr
->last_recv
.options
= dd
->options
;
1064 nbr
->last_recv
.dd_seqnum
= ntohl(dd
->dd_seqnum
);
1067 /* Process rest of DD packet. */
1068 static void ospf_db_desc_proc(struct stream
*s
, struct ospf_interface
*oi
,
1069 struct ospf_neighbor
*nbr
,
1070 struct ospf_db_desc
*dd
, u_int16_t size
)
1072 struct ospf_lsa
*new, *find
;
1073 struct lsa_header
*lsah
;
1075 stream_forward_getp(s
, OSPF_DB_DESC_MIN_SIZE
);
1076 for (size
-= OSPF_DB_DESC_MIN_SIZE
; size
>= OSPF_LSA_HEADER_SIZE
;
1077 size
-= OSPF_LSA_HEADER_SIZE
) {
1078 lsah
= (struct lsa_header
*)STREAM_PNT(s
);
1079 stream_forward_getp(s
, OSPF_LSA_HEADER_SIZE
);
1081 /* Unknown LS type. */
1082 if (lsah
->type
< OSPF_MIN_LSA
|| lsah
->type
>= OSPF_MAX_LSA
) {
1083 zlog_warn("Packet [DD:RECV]: Unknown LS type %d.",
1085 OSPF_NSM_EVENT_SCHEDULE(nbr
, NSM_SeqNumberMismatch
);
1089 if (IS_OPAQUE_LSA(lsah
->type
)
1090 && !CHECK_FLAG(nbr
->options
, OSPF_OPTION_O
)) {
1091 zlog_warn("LSA[Type%d:%s]: Opaque capability mismatch?",
1092 lsah
->type
, inet_ntoa(lsah
->id
));
1093 OSPF_NSM_EVENT_SCHEDULE(nbr
, NSM_SeqNumberMismatch
);
1097 switch (lsah
->type
) {
1098 case OSPF_AS_EXTERNAL_LSA
:
1099 case OSPF_OPAQUE_AS_LSA
:
1100 /* Check for stub area. Reject if AS-External from stub
1102 allow if from NSSA. */
1103 if (oi
->area
->external_routing
== OSPF_AREA_STUB
) {
1105 "Packet [DD:RECV]: LSA[Type%d:%s] from %s area.",
1106 lsah
->type
, inet_ntoa(lsah
->id
),
1107 (oi
->area
->external_routing
1111 OSPF_NSM_EVENT_SCHEDULE(nbr
,
1112 NSM_SeqNumberMismatch
);
1120 /* Create LS-request object. */
1121 new = ospf_ls_request_new(lsah
);
1123 /* Lookup received LSA, then add LS request list. */
1124 find
= ospf_lsa_lookup_by_header(oi
->area
, lsah
);
1126 /* ospf_lsa_more_recent is fine with NULL pointers */
1127 switch (ospf_lsa_more_recent(find
, new)) {
1129 /* Neighbour has a more recent LSA, we must request it
1131 ospf_ls_request_add(nbr
, new);
1133 /* If we have a copy of this LSA, it's either less
1135 * and we're requesting it from neighbour (the case
1137 * it's as recent and we both have same copy (this
1140 * In neither of these two cases is there any point in
1141 * describing our copy of the LSA to the neighbour in a
1142 * DB-Summary packet, if we're still intending to do so.
1144 * See: draft-ogier-ospf-dbex-opt-00.txt, describing the
1145 * backward compatible optimisation to OSPF DB Exchange
1147 * DB Description process implemented here.
1150 ospf_lsdb_delete(&nbr
->db_sum
, find
);
1151 ospf_lsa_discard(new);
1154 /* We have the more recent copy, nothing specific to do:
1155 * - no need to request neighbours stale copy
1156 * - must leave DB summary list copy alone
1158 if (IS_DEBUG_OSPF_EVENT
)
1160 "Packet [DD:RECV]: LSA received Type %d, "
1161 "ID %s is not recent.",
1162 lsah
->type
, inet_ntoa(lsah
->id
));
1163 ospf_lsa_discard(new);
1168 if (IS_SET_DD_MS(nbr
->dd_flags
)) {
1171 /* Both sides have no More, then we're done with Exchange */
1172 if (!IS_SET_DD_M(dd
->flags
) && !IS_SET_DD_M(nbr
->dd_flags
))
1173 OSPF_NSM_EVENT_SCHEDULE(nbr
, NSM_ExchangeDone
);
1175 ospf_db_desc_send(nbr
);
1179 nbr
->dd_seqnum
= ntohl(dd
->dd_seqnum
);
1181 /* Send DD packet in reply.
1183 * Must be done to acknowledge the Master's DD, regardless of
1184 * whether we have more LSAs ourselves to describe.
1186 * This function will clear the 'More' bit, if after this DD
1187 * we have no more LSAs to describe to the master..
1189 ospf_db_desc_send(nbr
);
1191 /* Slave can raise ExchangeDone now, if master is also done */
1192 if (!IS_SET_DD_M(dd
->flags
) && !IS_SET_DD_M(nbr
->dd_flags
))
1193 OSPF_NSM_EVENT_SCHEDULE(nbr
, NSM_ExchangeDone
);
1196 /* Save received neighbor values from DD. */
1197 ospf_db_desc_save_current(nbr
, dd
);
1200 ospf_ls_req_send(nbr
);
1203 static int ospf_db_desc_is_dup(struct ospf_db_desc
*dd
,
1204 struct ospf_neighbor
*nbr
)
1206 /* Is DD duplicated? */
1207 if (dd
->options
== nbr
->last_recv
.options
1208 && dd
->flags
== nbr
->last_recv
.flags
1209 && dd
->dd_seqnum
== htonl(nbr
->last_recv
.dd_seqnum
))
1215 /* OSPF Database Description message read -- RFC2328 Section 10.6. */
1216 static void ospf_db_desc(struct ip
*iph
, struct ospf_header
*ospfh
,
1217 struct stream
*s
, struct ospf_interface
*oi
,
1220 struct ospf_db_desc
*dd
;
1221 struct ospf_neighbor
*nbr
;
1223 /* Increment statistics. */
1226 dd
= (struct ospf_db_desc
*)STREAM_PNT(s
);
1228 nbr
= ospf_nbr_lookup(oi
, iph
, ospfh
);
1230 zlog_warn("Packet[DD]: Unknown Neighbor %s",
1231 inet_ntoa(ospfh
->router_id
));
1236 if ((OSPF_IF_PARAM(oi
, mtu_ignore
) == 0)
1237 && (ntohs(dd
->mtu
) > oi
->ifp
->mtu
)) {
1239 "Packet[DD]: Neighbor %s MTU %u is larger than [%s]'s MTU %u",
1240 inet_ntoa(nbr
->router_id
), ntohs(dd
->mtu
), IF_NAME(oi
),
1246 * XXX HACK by Hasso Tepper. Setting N/P bit in NSSA area DD packets is
1248 * required. In fact at least JunOS sends DD packets with P bit clear.
1249 * Until proper solution is developped, this hack should help.
1251 * Update: According to the RFCs, N bit is specified /only/ for Hello
1252 * options, unfortunately its use in DD options is not specified. Hence
1254 * implementations follow E-bit semantics and set it in DD options, and
1256 * treat it as unspecified and hence follow the directive "default for
1257 * options is clear", ie unset.
1259 * Reset the flag, as ospfd follows E-bit semantics.
1261 if ((oi
->area
->external_routing
== OSPF_AREA_NSSA
)
1262 && (CHECK_FLAG(nbr
->options
, OSPF_OPTION_NP
))
1263 && (!CHECK_FLAG(dd
->options
, OSPF_OPTION_NP
))) {
1264 if (IS_DEBUG_OSPF_EVENT
)
1266 "Packet[DD]: Neighbour %s: Has NSSA capability, sends with N bit clear in DD options",
1267 inet_ntoa(nbr
->router_id
));
1268 SET_FLAG(dd
->options
, OSPF_OPTION_NP
);
1271 #ifdef REJECT_IF_TBIT_ON
1272 if (CHECK_FLAG(dd
->options
, OSPF_OPTION_MT
)) {
1274 * In Hello protocol, optional capability must have checked
1275 * to prevent this T-bit enabled router be my neighbor.
1277 zlog_warn("Packet[DD]: Neighbor %s: T-bit on?",
1278 inet_ntoa(nbr
->router_id
));
1281 #endif /* REJECT_IF_TBIT_ON */
1283 if (CHECK_FLAG(dd
->options
, OSPF_OPTION_O
)
1284 && !CHECK_FLAG(oi
->ospf
->config
, OSPF_OPAQUE_CAPABLE
)) {
1286 * This node is not configured to handle O-bit, for now.
1287 * Clear it to ignore unsupported capability proposed by
1290 UNSET_FLAG(dd
->options
, OSPF_OPTION_O
);
1293 /* Add event to thread. */
1294 OSPF_NSM_EVENT_SCHEDULE(nbr
, NSM_PacketReceived
);
1296 /* Process DD packet by neighbor status. */
1297 switch (nbr
->state
) {
1302 "Packet[DD]: Neighbor %s state is %s, packet discarded.",
1303 inet_ntoa(nbr
->router_id
),
1304 lookup_msg(ospf_nsm_state_msg
, nbr
->state
, NULL
));
1307 OSPF_NSM_EVENT_EXECUTE(nbr
, NSM_TwoWayReceived
);
1308 /* If the new state is ExStart, the processing of the current
1309 packet should then continue in this new state by falling
1310 through to case ExStart below. */
1311 if (nbr
->state
!= NSM_ExStart
)
1315 if ((IS_SET_DD_ALL(dd
->flags
) == OSPF_DD_FLAG_ALL
)
1316 && (size
== OSPF_DB_DESC_MIN_SIZE
)) {
1317 if (IPV4_ADDR_CMP(&nbr
->router_id
, &oi
->ospf
->router_id
)
1319 /* We're Slave---obey */
1321 "Packet[DD]: Neighbor %s Negotiation done (Slave).",
1322 inet_ntoa(nbr
->router_id
));
1323 nbr
->dd_seqnum
= ntohl(dd
->dd_seqnum
);
1326 UNSET_FLAG(nbr
->dd_flags
,
1327 (OSPF_DD_FLAG_MS
| OSPF_DD_FLAG_I
));
1329 /* We're Master, ignore the initial DBD from
1332 "Packet[DD]: Neighbor %s: Initial DBD from Slave, "
1334 inet_ntoa(nbr
->router_id
));
1338 /* Ack from the Slave */
1339 else if (!IS_SET_DD_MS(dd
->flags
) && !IS_SET_DD_I(dd
->flags
)
1340 && ntohl(dd
->dd_seqnum
) == nbr
->dd_seqnum
1341 && IPV4_ADDR_CMP(&nbr
->router_id
, &oi
->ospf
->router_id
)
1344 "Packet[DD]: Neighbor %s Negotiation done (Master).",
1345 inet_ntoa(nbr
->router_id
));
1346 /* Reset I, leaving MS */
1347 UNSET_FLAG(nbr
->dd_flags
, OSPF_DD_FLAG_I
);
1349 zlog_warn("Packet[DD]: Neighbor %s Negotiation fails.",
1350 inet_ntoa(nbr
->router_id
));
1354 /* This is where the real Options are saved */
1355 nbr
->options
= dd
->options
;
1357 if (CHECK_FLAG(oi
->ospf
->config
, OSPF_OPAQUE_CAPABLE
)) {
1358 if (IS_DEBUG_OSPF_EVENT
)
1360 "Neighbor[%s] is %sOpaque-capable.",
1361 inet_ntoa(nbr
->router_id
),
1362 CHECK_FLAG(nbr
->options
, OSPF_OPTION_O
)
1366 if (!CHECK_FLAG(nbr
->options
, OSPF_OPTION_O
)
1367 && IPV4_ADDR_SAME(&DR(oi
),
1368 &nbr
->address
.u
.prefix4
)) {
1370 "DR-neighbor[%s] is NOT opaque-capable; "
1371 "Opaque-LSAs cannot be reliably advertised "
1373 inet_ntoa(nbr
->router_id
));
1374 /* This situation is undesirable, but not a real
1379 OSPF_NSM_EVENT_EXECUTE(nbr
, NSM_NegotiationDone
);
1381 /* continue processing rest of packet. */
1382 ospf_db_desc_proc(s
, oi
, nbr
, dd
, size
);
1385 if (ospf_db_desc_is_dup(dd
, nbr
)) {
1386 if (IS_SET_DD_MS(nbr
->dd_flags
))
1387 /* Master: discard duplicated DD packet. */
1389 "Packet[DD] (Master): Neighbor %s packet duplicated.",
1390 inet_ntoa(nbr
->router_id
));
1392 /* Slave: cause to retransmit the last Database
1396 "Packet[DD] [Slave]: Neighbor %s packet duplicated.",
1397 inet_ntoa(nbr
->router_id
));
1398 ospf_db_desc_resend(nbr
);
1403 /* Otherwise DD packet should be checked. */
1404 /* Check Master/Slave bit mismatch */
1405 if (IS_SET_DD_MS(dd
->flags
)
1406 != IS_SET_DD_MS(nbr
->last_recv
.flags
)) {
1407 zlog_warn("Packet[DD]: Neighbor %s MS-bit mismatch.",
1408 inet_ntoa(nbr
->router_id
));
1409 OSPF_NSM_EVENT_SCHEDULE(nbr
, NSM_SeqNumberMismatch
);
1410 if (IS_DEBUG_OSPF_EVENT
)
1412 "Packet[DD]: dd->flags=%d, nbr->dd_flags=%d",
1413 dd
->flags
, nbr
->dd_flags
);
1417 /* Check initialize bit is set. */
1418 if (IS_SET_DD_I(dd
->flags
)) {
1419 zlog_info("Packet[DD]: Neighbor %s I-bit set.",
1420 inet_ntoa(nbr
->router_id
));
1421 OSPF_NSM_EVENT_SCHEDULE(nbr
, NSM_SeqNumberMismatch
);
1425 /* Check DD Options. */
1426 if (dd
->options
!= nbr
->options
) {
1427 #ifdef ORIGINAL_CODING
1428 /* Save the new options for debugging */
1429 nbr
->options
= dd
->options
;
1430 #endif /* ORIGINAL_CODING */
1431 zlog_warn("Packet[DD]: Neighbor %s options mismatch.",
1432 inet_ntoa(nbr
->router_id
));
1433 OSPF_NSM_EVENT_SCHEDULE(nbr
, NSM_SeqNumberMismatch
);
1437 /* Check DD sequence number. */
1438 if ((IS_SET_DD_MS(nbr
->dd_flags
)
1439 && ntohl(dd
->dd_seqnum
) != nbr
->dd_seqnum
)
1440 || (!IS_SET_DD_MS(nbr
->dd_flags
)
1441 && ntohl(dd
->dd_seqnum
) != nbr
->dd_seqnum
+ 1)) {
1443 "Packet[DD]: Neighbor %s sequence number mismatch.",
1444 inet_ntoa(nbr
->router_id
));
1445 OSPF_NSM_EVENT_SCHEDULE(nbr
, NSM_SeqNumberMismatch
);
1449 /* Continue processing rest of packet. */
1450 ospf_db_desc_proc(s
, oi
, nbr
, dd
, size
);
1454 if (ospf_db_desc_is_dup(dd
, nbr
)) {
1455 if (IS_SET_DD_MS(nbr
->dd_flags
)) {
1456 /* Master should discard duplicate DD packet. */
1458 "Packet[DD]: Neighbor %s duplicated, "
1459 "packet discarded.",
1460 inet_ntoa(nbr
->router_id
));
1463 if (monotime_since(&nbr
->last_send_ts
, NULL
)
1464 < nbr
->v_inactivity
* 1000000LL) {
1465 /* In states Loading and Full the slave
1467 its last Database Description packet
1469 duplicate Database Description
1471 from the master. For this reason the
1473 wait RouterDeadInterval seconds
1475 last Database Description packet.
1477 Database Description packet from the
1479 this interval will generate a
1481 neighbor event. RFC2328 Section 10.8
1483 ospf_db_desc_resend(nbr
);
1489 OSPF_NSM_EVENT_SCHEDULE(nbr
, NSM_SeqNumberMismatch
);
1492 zlog_warn("Packet[DD]: Neighbor %s NSM illegal status %u.",
1493 inet_ntoa(nbr
->router_id
), nbr
->state
);
1498 #define OSPF_LSA_KEY_SIZE 12 /* type(4) + id(4) + ar(4) */
1500 /* OSPF Link State Request Read -- RFC2328 Section 10.7. */
1501 static void ospf_ls_req(struct ip
*iph
, struct ospf_header
*ospfh
,
1502 struct stream
*s
, struct ospf_interface
*oi
,
1505 struct ospf_neighbor
*nbr
;
1507 struct in_addr ls_id
;
1508 struct in_addr adv_router
;
1509 struct ospf_lsa
*find
;
1510 struct list
*ls_upd
;
1511 unsigned int length
;
1513 /* Increment statistics. */
1516 nbr
= ospf_nbr_lookup(oi
, iph
, ospfh
);
1518 zlog_warn("Link State Request: Unknown Neighbor %s.",
1519 inet_ntoa(ospfh
->router_id
));
1523 /* Add event to thread. */
1524 OSPF_NSM_EVENT_SCHEDULE(nbr
, NSM_PacketReceived
);
1526 /* Neighbor State should be Exchange or later. */
1527 if (nbr
->state
!= NSM_Exchange
&& nbr
->state
!= NSM_Loading
1528 && nbr
->state
!= NSM_Full
) {
1530 "Link State Request received from %s: "
1531 "Neighbor state is %s, packet discarded.",
1532 inet_ntoa(ospfh
->router_id
),
1533 lookup_msg(ospf_nsm_state_msg
, nbr
->state
, NULL
));
1537 /* Send Link State Update for ALL requested LSAs. */
1538 ls_upd
= list_new();
1539 length
= OSPF_HEADER_SIZE
+ OSPF_LS_UPD_MIN_SIZE
;
1541 while (size
>= OSPF_LSA_KEY_SIZE
) {
1542 /* Get one slice of Link State Request. */
1543 ls_type
= stream_getl(s
);
1544 ls_id
.s_addr
= stream_get_ipv4(s
);
1545 adv_router
.s_addr
= stream_get_ipv4(s
);
1547 /* Verify LSA type. */
1548 if (ls_type
< OSPF_MIN_LSA
|| ls_type
>= OSPF_MAX_LSA
) {
1549 OSPF_NSM_EVENT_SCHEDULE(nbr
, NSM_BadLSReq
);
1550 list_delete(ls_upd
);
1554 /* Search proper LSA in LSDB. */
1555 find
= ospf_lsa_lookup(oi
->area
, ls_type
, ls_id
, adv_router
);
1557 OSPF_NSM_EVENT_SCHEDULE(nbr
, NSM_BadLSReq
);
1558 list_delete(ls_upd
);
1562 /* Packet overflows MTU size, send immediately. */
1563 if (length
+ ntohs(find
->data
->length
) > ospf_packet_max(oi
)) {
1564 if (oi
->type
== OSPF_IFTYPE_NBMA
)
1565 ospf_ls_upd_send(nbr
, ls_upd
,
1566 OSPF_SEND_PACKET_DIRECT
);
1568 ospf_ls_upd_send(nbr
, ls_upd
,
1569 OSPF_SEND_PACKET_INDIRECT
);
1571 /* Only remove list contents. Keep ls_upd. */
1572 list_delete_all_node(ls_upd
);
1574 length
= OSPF_HEADER_SIZE
+ OSPF_LS_UPD_MIN_SIZE
;
1577 /* Append LSA to update list. */
1578 listnode_add(ls_upd
, find
);
1579 length
+= ntohs(find
->data
->length
);
1581 size
-= OSPF_LSA_KEY_SIZE
;
1584 /* Send rest of Link State Update. */
1585 if (listcount(ls_upd
) > 0) {
1586 if (oi
->type
== OSPF_IFTYPE_NBMA
)
1587 ospf_ls_upd_send(nbr
, ls_upd
, OSPF_SEND_PACKET_DIRECT
);
1589 ospf_ls_upd_send(nbr
, ls_upd
,
1590 OSPF_SEND_PACKET_INDIRECT
);
1592 list_delete(ls_upd
);
1597 /* Get the list of LSAs from Link State Update packet.
1598 And process some validation -- RFC2328 Section 13. (1)-(2). */
1599 static struct list
*ospf_ls_upd_list_lsa(struct ospf_neighbor
*nbr
,
1601 struct ospf_interface
*oi
, size_t size
)
1603 u_int16_t count
, sum
;
1605 struct lsa_header
*lsah
;
1606 struct ospf_lsa
*lsa
;
1611 count
= stream_getl(s
);
1612 size
-= OSPF_LS_UPD_MIN_SIZE
; /* # LSAs */
1614 for (; size
>= OSPF_LSA_HEADER_SIZE
&& count
> 0;
1615 size
-= length
, stream_forward_getp(s
, length
), count
--) {
1616 lsah
= (struct lsa_header
*)STREAM_PNT(s
);
1617 length
= ntohs(lsah
->length
);
1619 if (length
> size
) {
1621 "Link State Update: LSA length exceeds packet size.");
1625 /* Validate the LSA's LS checksum. */
1626 sum
= lsah
->checksum
;
1627 if (!ospf_lsa_checksum_valid(lsah
)) {
1628 /* (bug #685) more details in a one-line message make it
1630 * to identify problem source on the one hand and to
1632 * chance to compress repeated messages in syslog on the
1635 "Link State Update: LSA checksum error %x/%x, ID=%s from: nbr %s, router ID %s, adv router %s",
1636 sum
, lsah
->checksum
, inet_ntoa(lsah
->id
),
1637 inet_ntoa(nbr
->src
), inet_ntoa(nbr
->router_id
),
1638 inet_ntoa(lsah
->adv_router
));
1642 /* Examine the LSA's LS type. */
1643 if (lsah
->type
< OSPF_MIN_LSA
|| lsah
->type
>= OSPF_MAX_LSA
) {
1644 zlog_warn("Link State Update: Unknown LS type %d",
1650 * What if the received LSA's age is greater than MaxAge?
1651 * Treat it as a MaxAge case -- endo.
1653 if (ntohs(lsah
->ls_age
) > OSPF_LSA_MAXAGE
)
1654 lsah
->ls_age
= htons(OSPF_LSA_MAXAGE
);
1656 if (CHECK_FLAG(nbr
->options
, OSPF_OPTION_O
)) {
1657 #ifdef STRICT_OBIT_USAGE_CHECK
1658 if ((IS_OPAQUE_LSA(lsah
->type
)
1659 && !CHECK_FLAG(lsah
->options
, OSPF_OPTION_O
))
1660 || (!IS_OPAQUE_LSA(lsah
->type
)
1661 && CHECK_FLAG(lsah
->options
, OSPF_OPTION_O
))) {
1663 * This neighbor must know the exact usage of
1665 * the bit will be set in Type-9,10,11 LSAs
1668 zlog_warn("LSA[Type%d:%s]: O-bit abuse?",
1669 lsah
->type
, inet_ntoa(lsah
->id
));
1672 #endif /* STRICT_OBIT_USAGE_CHECK */
1674 /* Do not take in AS External Opaque-LSAs if we are a
1676 if (lsah
->type
== OSPF_OPAQUE_AS_LSA
1677 && nbr
->oi
->area
->external_routing
1678 != OSPF_AREA_DEFAULT
) {
1679 if (IS_DEBUG_OSPF_EVENT
)
1681 "LSA[Type%d:%s]: We are a stub, don't take this LSA.",
1683 inet_ntoa(lsah
->id
));
1686 } else if (IS_OPAQUE_LSA(lsah
->type
)) {
1687 zlog_warn("LSA[Type%d:%s]: Opaque capability mismatch?",
1688 lsah
->type
, inet_ntoa(lsah
->id
));
1692 /* Create OSPF LSA instance. */
1693 lsa
= ospf_lsa_new();
1695 /* We may wish to put some error checking if type NSSA comes in
1696 and area not in NSSA mode */
1697 switch (lsah
->type
) {
1698 case OSPF_AS_EXTERNAL_LSA
:
1699 case OSPF_OPAQUE_AS_LSA
:
1702 case OSPF_OPAQUE_LINK_LSA
:
1703 lsa
->oi
= oi
; /* Remember incoming interface for
1704 flooding control. */
1707 lsa
->area
= oi
->area
;
1711 lsa
->data
= ospf_lsa_data_new(length
);
1712 memcpy(lsa
->data
, lsah
, length
);
1714 if (IS_DEBUG_OSPF_EVENT
)
1716 "LSA[Type%d:%s]: %p new LSA created with Link State Update",
1717 lsa
->data
->type
, inet_ntoa(lsa
->data
->id
),
1719 listnode_add(lsas
, lsa
);
1725 /* Cleanup Update list. */
1726 static void ospf_upd_list_clean(struct list
*lsas
)
1728 struct listnode
*node
, *nnode
;
1729 struct ospf_lsa
*lsa
;
1731 for (ALL_LIST_ELEMENTS(lsas
, node
, nnode
, lsa
))
1732 ospf_lsa_discard(lsa
);
1737 /* OSPF Link State Update message read -- RFC2328 Section 13. */
1738 static void ospf_ls_upd(struct ospf
*ospf
, struct ip
*iph
,
1739 struct ospf_header
*ospfh
, struct stream
*s
,
1740 struct ospf_interface
*oi
, u_int16_t size
)
1742 struct ospf_neighbor
*nbr
;
1744 struct listnode
*node
, *nnode
;
1745 struct ospf_lsa
*lsa
= NULL
;
1746 /* unsigned long ls_req_found = 0; */
1748 /* Dis-assemble the stream, update each entry, re-encapsulate for
1751 /* Increment statistics. */
1754 /* Check neighbor. */
1755 nbr
= ospf_nbr_lookup(oi
, iph
, ospfh
);
1757 zlog_warn("Link State Update: Unknown Neighbor %s on int: %s",
1758 inet_ntoa(ospfh
->router_id
), IF_NAME(oi
));
1762 /* Add event to thread. */
1763 OSPF_NSM_EVENT_SCHEDULE(nbr
, NSM_PacketReceived
);
1765 /* Check neighbor state. */
1766 if (nbr
->state
< NSM_Exchange
) {
1767 if (IS_DEBUG_OSPF(nsm
, NSM_EVENTS
))
1769 "Link State Update: "
1770 "Neighbor[%s] state %s is less than Exchange",
1771 inet_ntoa(ospfh
->router_id
),
1772 lookup_msg(ospf_nsm_state_msg
, nbr
->state
,
1777 /* Get list of LSAs from Link State Update packet. - Also perorms Stages
1778 * 1 (validate LSA checksum) and 2 (check for LSA consistent type)
1781 lsas
= ospf_ls_upd_list_lsa(nbr
, s
, oi
, size
);
1783 #define DISCARD_LSA(L, N) \
1785 if (IS_DEBUG_OSPF_EVENT) \
1787 "ospf_lsa_discard() in ospf_ls_upd() point %d: lsa %p" \
1789 N, (void *)lsa, (int)lsa->data->type); \
1790 ospf_lsa_discard(L); \
1794 /* Process each LSA received in the one packet.
1796 * Numbers in parentheses, e.g. (1), (2), etc., and the corresponding
1797 * text below are from the steps in RFC 2328, Section 13.
1799 for (ALL_LIST_ELEMENTS(lsas
, node
, nnode
, lsa
)) {
1800 struct ospf_lsa
*ls_ret
, *current
;
1803 if (IS_DEBUG_OSPF_NSSA
) {
1804 char buf1
[INET_ADDRSTRLEN
];
1805 char buf2
[INET_ADDRSTRLEN
];
1806 char buf3
[INET_ADDRSTRLEN
];
1808 zlog_debug("LSA Type-%d from %s, ID: %s, ADV: %s",
1810 inet_ntop(AF_INET
, &ospfh
->router_id
, buf1
,
1812 inet_ntop(AF_INET
, &lsa
->data
->id
, buf2
,
1814 inet_ntop(AF_INET
, &lsa
->data
->adv_router
,
1815 buf3
, INET_ADDRSTRLEN
));
1818 listnode_delete(lsas
,
1819 lsa
); /* We don't need it in list anymore */
1821 /* (1) Validate Checksum - Done above by ospf_ls_upd_list_lsa()
1824 /* (2) LSA Type - Done above by ospf_ls_upd_list_lsa() */
1826 /* (3) Do not take in AS External LSAs if we are a stub or NSSA.
1829 /* Do not take in AS NSSA if this neighbor and we are not NSSA
1832 /* Do take in Type-7's if we are an NSSA */
1834 /* If we are also an ABR, later translate them to a Type-5
1837 /* Later, an NSSA Re-fresh can Re-fresh Type-7's and an ABR will
1838 translate them to a separate Type-5 packet. */
1840 if (lsa
->data
->type
== OSPF_AS_EXTERNAL_LSA
)
1841 /* Reject from STUB or NSSA */
1842 if (nbr
->oi
->area
->external_routing
1843 != OSPF_AREA_DEFAULT
) {
1844 if (IS_DEBUG_OSPF_NSSA
)
1846 "Incoming External LSA Discarded: We are NSSA/STUB Area");
1847 DISCARD_LSA(lsa
, 1);
1850 if (lsa
->data
->type
== OSPF_AS_NSSA_LSA
)
1851 if (nbr
->oi
->area
->external_routing
!= OSPF_AREA_NSSA
) {
1852 if (IS_DEBUG_OSPF_NSSA
)
1854 "Incoming NSSA LSA Discarded: Not NSSA Area");
1855 DISCARD_LSA(lsa
, 2);
1858 /* VU229804: Router-LSA Adv-ID must be equal to LS-ID */
1859 if (lsa
->data
->type
== OSPF_ROUTER_LSA
)
1860 if (!IPV4_ADDR_SAME(&lsa
->data
->id
,
1861 &lsa
->data
->adv_router
)) {
1862 char buf1
[INET_ADDRSTRLEN
];
1863 char buf2
[INET_ADDRSTRLEN
];
1864 char buf3
[INET_ADDRSTRLEN
];
1867 "Incoming Router-LSA from %s with "
1868 "Adv-ID[%s] != LS-ID[%s]",
1869 inet_ntop(AF_INET
, &ospfh
->router_id
,
1870 buf1
, INET_ADDRSTRLEN
),
1871 inet_ntop(AF_INET
, &lsa
->data
->id
, buf2
,
1874 &lsa
->data
->adv_router
, buf3
,
1877 "OSPF domain compromised by attack or corruption. "
1878 "Verify correct operation of -ALL- OSPF routers.");
1879 DISCARD_LSA(lsa
, 0);
1882 /* Find the LSA in the current database. */
1884 current
= ospf_lsa_lookup_by_header(oi
->area
, lsa
->data
);
1886 /* (4) If the LSA's LS age is equal to MaxAge, and there is
1888 no instance of the LSA in the router's link state database,
1889 and none of router's neighbors are in states Exchange or
1891 then take the following actions: */
1893 if (IS_LSA_MAXAGE(lsa
) && !current
1894 && ospf_check_nbr_status(oi
->ospf
)) {
1895 /* (4a) Response Link State Acknowledgment. */
1896 ospf_ls_ack_send(nbr
, lsa
);
1898 /* (4b) Discard LSA. */
1899 if (IS_DEBUG_OSPF(lsa
, LSA
)) {
1901 "Link State Update[%s]: LS age is equal to MaxAge.",
1904 DISCARD_LSA(lsa
, 3);
1907 if (IS_OPAQUE_LSA(lsa
->data
->type
)
1908 && IPV4_ADDR_SAME(&lsa
->data
->adv_router
,
1909 &oi
->ospf
->router_id
)) {
1911 * Even if initial flushing seems to be completed, there
1913 * be a case that self-originated LSA with MaxAge still
1915 * in the routing domain.
1916 * Just send an LSAck message to cease retransmission.
1918 if (IS_LSA_MAXAGE(lsa
)) {
1919 zlog_warn("LSA[%s]: Boomerang effect?",
1921 ospf_ls_ack_send(nbr
, lsa
);
1922 ospf_lsa_discard(lsa
);
1924 if (current
!= NULL
&& !IS_LSA_MAXAGE(current
))
1925 ospf_opaque_lsa_refresh_schedule(
1931 * If an instance of self-originated Opaque-LSA is not
1933 * in the LSDB, there are some possible cases here.
1935 * 1) This node lost opaque-capability after restart.
1936 * 2) Else, a part of opaque-type is no more supported.
1937 * 3) Else, a part of opaque-id is no more supported.
1939 * Anyway, it is still this node's responsibility to
1941 * Otherwise, the LSA instance remains in the routing
1943 * until its age reaches to MaxAge.
1945 /* XXX: We should deal with this for *ALL* LSAs, not
1947 if (current
== NULL
) {
1948 if (IS_DEBUG_OSPF_EVENT
)
1950 "LSA[%s]: Previously originated Opaque-LSA,"
1951 "not found in the LSDB.",
1954 SET_FLAG(lsa
->flags
, OSPF_LSA_SELF
);
1956 ospf_opaque_self_originated_lsa_received(nbr
,
1958 ospf_ls_ack_send(nbr
, lsa
);
1964 /* It might be happen that received LSA is self-originated
1966 * router ID is changed. So, we should check if LSA is a
1968 * Link State ID is one of the router's own IP interface
1969 * addresses but whose
1970 * Advertising Router is not equal to the router's own Router ID
1971 * According to RFC 2328 12.4.2 and 13.4 this LSA should be
1975 if (lsa
->data
->type
== OSPF_NETWORK_LSA
) {
1976 struct listnode
*oinode
, *oinnode
;
1977 struct ospf_interface
*out_if
;
1980 for (ALL_LIST_ELEMENTS(oi
->ospf
->oiflist
, oinode
,
1985 if ((IPV4_ADDR_SAME(&out_if
->address
->u
.prefix4
,
1987 && (!(IPV4_ADDR_SAME(
1988 &oi
->ospf
->router_id
,
1989 &lsa
->data
->adv_router
)))) {
1990 if (out_if
->network_lsa_self
) {
1991 ospf_lsa_flush_area(
1993 if (IS_DEBUG_OSPF_EVENT
)
1995 "ospf_lsa_discard() in ospf_ls_upd() point 9: lsa %p Type-%d",
1999 ospf_lsa_discard(lsa
);
2009 /* (5) Find the instance of this LSA that is currently contained
2010 in the router's link state database. If there is no
2011 database copy, or the received LSA is more recent than
2012 the database copy the following steps must be performed.
2013 (The sub steps from RFC 2328 section 13 step (5) will be
2018 || (ret
= ospf_lsa_more_recent(current
, lsa
)) < 0) {
2019 /* Actual flooding procedure. */
2020 if (ospf_flood(oi
->ospf
, nbr
, current
, lsa
)
2021 < 0) /* Trap NSSA later. */
2022 DISCARD_LSA(lsa
, 4);
2026 /* (6) Else, If there is an instance of the LSA on the sending
2027 neighbor's Link state request list, an error has occurred in
2028 the Database Exchange process. In this case, restart the
2029 Database Exchange process by generating the neighbor event
2030 BadLSReq for the sending neighbor and stop processing the
2031 Link State Update packet. */
2033 if (ospf_ls_request_lookup(nbr
, lsa
)) {
2034 OSPF_NSM_EVENT_SCHEDULE(nbr
, NSM_BadLSReq
);
2036 "LSA[%s] instance exists on Link state request list",
2039 /* Clean list of LSAs. */
2040 ospf_upd_list_clean(lsas
);
2041 /* this lsa is not on lsas list already. */
2042 ospf_lsa_discard(lsa
);
2046 /* If the received LSA is the same instance as the database copy
2047 (i.e., neither one is more recent) the following two steps
2048 should be performed: */
2051 /* If the LSA is listed in the Link state retransmission
2053 for the receiving adjacency, the router itself is
2055 an acknowledgment for this LSA. The router should
2057 received LSA as an acknowledgment by removing the LSA
2059 the Link state retransmission list. This is termed
2061 "implied acknowledgment". */
2063 ls_ret
= ospf_ls_retransmit_lookup(nbr
, lsa
);
2065 if (ls_ret
!= NULL
) {
2066 ospf_ls_retransmit_delete(nbr
, ls_ret
);
2068 /* Delayed acknowledgment sent if advertisement
2070 from Designated Router, otherwise do nothing.
2072 if (oi
->state
== ISM_Backup
)
2076 ospf_lsa_lock(lsa
));
2078 DISCARD_LSA(lsa
, 5);
2080 /* Acknowledge the receipt of the LSA by sending a
2081 Link State Acknowledgment packet back out the
2085 ospf_ls_ack_send(nbr
, lsa
);
2086 DISCARD_LSA(lsa
, 6);
2090 /* The database copy is more recent. If the database copy
2091 has LS age equal to MaxAge and LS sequence number equal to
2092 MaxSequenceNumber, simply discard the received LSA without
2093 acknowledging it. (In this case, the LSA's LS sequence number
2095 wrapping, and the MaxSequenceNumber LSA must be completely
2096 flushed before any new LSA instance can be introduced). */
2098 else if (ret
> 0) /* Database copy is more recent */
2100 if (IS_LSA_MAXAGE(current
)
2101 && current
->data
->ls_seqnum
2102 == htonl(OSPF_MAX_SEQUENCE_NUMBER
)) {
2103 DISCARD_LSA(lsa
, 7);
2105 /* Otherwise, as long as the database copy has not been
2107 Link State Update within the last MinLSArrival
2109 database copy back to the sending neighbor,
2111 a Link State Update Packet. The Link State Update
2113 be sent directly to the neighbor. In so doing, do not
2115 database copy of the LSA on the neighbor's link state
2116 retransmission list, and do not acknowledge the
2118 recent) LSA instance. */
2120 if (monotime_since(¤t
->tv_orig
, NULL
)
2121 >= ospf
->min_ls_arrival
* 1000LL)
2122 /* Trap NSSA type later.*/
2123 ospf_ls_upd_send_lsa(
2125 OSPF_SEND_PACKET_DIRECT
);
2126 DISCARD_LSA(lsa
, 8);
2132 assert(listcount(lsas
) == 0);
2136 /* OSPF Link State Acknowledgment message read -- RFC2328 Section 13.7. */
2137 static void ospf_ls_ack(struct ip
*iph
, struct ospf_header
*ospfh
,
2138 struct stream
*s
, struct ospf_interface
*oi
,
2141 struct ospf_neighbor
*nbr
;
2143 /* increment statistics. */
2146 nbr
= ospf_nbr_lookup(oi
, iph
, ospfh
);
2148 zlog_warn("Link State Acknowledgment: Unknown Neighbor %s.",
2149 inet_ntoa(ospfh
->router_id
));
2153 /* Add event to thread. */
2154 OSPF_NSM_EVENT_SCHEDULE(nbr
, NSM_PacketReceived
);
2156 if (nbr
->state
< NSM_Exchange
) {
2157 if (IS_DEBUG_OSPF(nsm
, NSM_EVENTS
))
2159 "Link State Acknowledgment: "
2160 "Neighbor[%s] state %s is less than Exchange",
2161 inet_ntoa(ospfh
->router_id
),
2162 lookup_msg(ospf_nsm_state_msg
, nbr
->state
,
2167 while (size
>= OSPF_LSA_HEADER_SIZE
) {
2168 struct ospf_lsa
*lsa
, *lsr
;
2170 lsa
= ospf_lsa_new();
2171 lsa
->data
= (struct lsa_header
*)STREAM_PNT(s
);
2173 /* lsah = (struct lsa_header *) STREAM_PNT (s); */
2174 size
-= OSPF_LSA_HEADER_SIZE
;
2175 stream_forward_getp(s
, OSPF_LSA_HEADER_SIZE
);
2177 if (lsa
->data
->type
< OSPF_MIN_LSA
2178 || lsa
->data
->type
>= OSPF_MAX_LSA
) {
2180 ospf_lsa_discard(lsa
);
2184 lsr
= ospf_ls_retransmit_lookup(nbr
, lsa
);
2186 if (lsr
!= NULL
&& ospf_lsa_more_recent(lsr
, lsa
) == 0)
2187 ospf_ls_retransmit_delete(nbr
, lsr
);
2190 ospf_lsa_discard(lsa
);
2196 static struct stream
*ospf_recv_packet(int fd
, struct interface
**ifp
,
2197 struct stream
*ibuf
)
2202 ifindex_t ifindex
= 0;
2204 /* Header and data both require alignment. */
2205 char buff
[CMSG_SPACE(SOPT_SIZE_CMSG_IFINDEX_IPV4())];
2208 memset(&msgh
, 0, sizeof(struct msghdr
));
2209 msgh
.msg_iov
= &iov
;
2210 msgh
.msg_iovlen
= 1;
2211 msgh
.msg_control
= (caddr_t
)buff
;
2212 msgh
.msg_controllen
= sizeof(buff
);
2214 ret
= stream_recvmsg(ibuf
, fd
, &msgh
, 0, OSPF_MAX_PACKET_SIZE
+ 1);
2216 zlog_warn("stream_recvmsg failed: %s", safe_strerror(errno
));
2219 if ((unsigned int)ret
< sizeof(iph
)) /* ret must be > 0 now */
2222 "ospf_recv_packet: discarding runt packet of length %d "
2223 "(ip header size is %u)",
2224 ret
, (u_int
)sizeof(iph
));
2228 /* Note that there should not be alignment problems with this assignment
2229 because this is at the beginning of the stream data buffer. */
2230 iph
= (struct ip
*)STREAM_DATA(ibuf
);
2231 sockopt_iphdrincl_swab_systoh(iph
);
2233 ip_len
= iph
->ip_len
;
2235 #if !defined(GNU_LINUX) && (OpenBSD < 200311) && (__FreeBSD_version < 1000000)
2237 * Kernel network code touches incoming IP header parameters,
2238 * before protocol specific processing.
2240 * 1) Convert byteorder to host representation.
2241 * --> ip_len, ip_id, ip_off
2243 * 2) Adjust ip_len to strip IP header size!
2244 * --> If user process receives entire IP packet via RAW
2245 * socket, it must consider adding IP header size to
2246 * the "ip_len" field of "ip" structure.
2248 * For more details, see <netinet/ip_input.c>.
2250 ip_len
= ip_len
+ (iph
->ip_hl
<< 2);
2253 #if defined(__DragonFly__)
2255 * in DragonFly's raw socket, ip_len/ip_off are read
2256 * in network byte order.
2257 * As OpenBSD < 200311 adjust ip_len to strip IP header size!
2259 ip_len
= ntohs(iph
->ip_len
) + (iph
->ip_hl
<< 2);
2262 ifindex
= getsockopt_ifindex(AF_INET
, &msgh
);
2264 *ifp
= if_lookup_by_index(ifindex
, VRF_DEFAULT
);
2266 if (ret
!= ip_len
) {
2268 "ospf_recv_packet read length mismatch: ip_len is %d, "
2269 "but recvmsg returned %d",
2277 static struct ospf_interface
*
2278 ospf_associate_packet_vl(struct ospf
*ospf
, struct interface
*ifp
,
2279 struct ip
*iph
, struct ospf_header
*ospfh
)
2281 struct ospf_interface
*rcv_oi
;
2282 struct ospf_vl_data
*vl_data
;
2283 struct ospf_area
*vl_area
;
2284 struct listnode
*node
;
2286 if (IN_MULTICAST(ntohl(iph
->ip_dst
.s_addr
))
2287 || !OSPF_IS_AREA_BACKBONE(ospfh
))
2290 /* look for local OSPF interface matching the destination
2291 * to determine Area ID. We presume therefore the destination address
2292 * is unique, or at least (for "unnumbered" links), not used in other
2295 if ((rcv_oi
= ospf_if_lookup_by_local_addr(ospf
, NULL
, iph
->ip_dst
))
2299 for (ALL_LIST_ELEMENTS_RO(ospf
->vlinks
, node
, vl_data
)) {
2301 ospf_area_lookup_by_area_id(ospf
, vl_data
->vl_area_id
);
2305 if (OSPF_AREA_SAME(&vl_area
, &rcv_oi
->area
)
2306 && IPV4_ADDR_SAME(&vl_data
->vl_peer
, &ospfh
->router_id
)) {
2307 if (IS_DEBUG_OSPF_EVENT
)
2308 zlog_debug("associating packet with %s",
2309 IF_NAME(vl_data
->vl_oi
));
2310 if (!CHECK_FLAG(vl_data
->vl_oi
->ifp
->flags
, IFF_UP
)) {
2311 if (IS_DEBUG_OSPF_EVENT
)
2313 "This VL is not up yet, sorry");
2317 return vl_data
->vl_oi
;
2321 if (IS_DEBUG_OSPF_EVENT
)
2322 zlog_debug("couldn't find any VL to associate the packet with");
2327 static int ospf_check_area_id(struct ospf_interface
*oi
,
2328 struct ospf_header
*ospfh
)
2330 /* Check match the Area ID of the receiving interface. */
2331 if (OSPF_AREA_SAME(&oi
->area
, &ospfh
))
2337 /* Unbound socket will accept any Raw IP packets if proto is matched.
2338 To prevent it, compare src IP address and i/f address with masking
2339 i/f network mask. */
2340 static int ospf_check_network_mask(struct ospf_interface
*oi
,
2341 struct in_addr ip_src
)
2343 struct in_addr mask
, me
, him
;
2345 if (oi
->type
== OSPF_IFTYPE_POINTOPOINT
2346 || oi
->type
== OSPF_IFTYPE_VIRTUALLINK
)
2349 masklen2ip(oi
->address
->prefixlen
, &mask
);
2351 me
.s_addr
= oi
->address
->u
.prefix4
.s_addr
& mask
.s_addr
;
2352 him
.s_addr
= ip_src
.s_addr
& mask
.s_addr
;
2354 if (IPV4_ADDR_SAME(&me
, &him
))
2360 /* Return 1, if the packet is properly authenticated and checksummed,
2361 0 otherwise. In particular, check that AuType header field is valid and
2362 matches the locally configured AuType, and that D.5 requirements are met. */
2363 static int ospf_check_auth(struct ospf_interface
*oi
, struct ospf_header
*ospfh
)
2365 struct crypt_key
*ck
;
2366 u_int16_t iface_auth_type
;
2367 u_int16_t pkt_auth_type
= ntohs(ospfh
->auth_type
);
2369 switch (pkt_auth_type
) {
2370 case OSPF_AUTH_NULL
: /* RFC2328 D.5.1 */
2371 if (OSPF_AUTH_NULL
!= (iface_auth_type
= ospf_auth_type(oi
))) {
2372 if (IS_DEBUG_OSPF_PACKET(ospfh
->type
- 1, RECV
))
2374 "interface %s: auth-type mismatch, local %s, rcvd Null",
2376 lookup_msg(ospf_auth_type_str
,
2377 iface_auth_type
, NULL
));
2380 if (!ospf_check_sum(ospfh
)) {
2381 if (IS_DEBUG_OSPF_PACKET(ospfh
->type
- 1, RECV
))
2383 "interface %s: Null auth OK, but checksum error, Router-ID %s",
2385 inet_ntoa(ospfh
->router_id
));
2389 case OSPF_AUTH_SIMPLE
: /* RFC2328 D.5.2 */
2390 if (OSPF_AUTH_SIMPLE
2391 != (iface_auth_type
= ospf_auth_type(oi
))) {
2392 if (IS_DEBUG_OSPF_PACKET(ospfh
->type
- 1, RECV
))
2394 "interface %s: auth-type mismatch, local %s, rcvd Simple",
2396 lookup_msg(ospf_auth_type_str
,
2397 iface_auth_type
, NULL
));
2400 if (memcmp(OSPF_IF_PARAM(oi
, auth_simple
), ospfh
->u
.auth_data
,
2401 OSPF_AUTH_SIMPLE_SIZE
)) {
2402 if (IS_DEBUG_OSPF_PACKET(ospfh
->type
- 1, RECV
))
2403 zlog_warn("interface %s: Simple auth failed",
2407 if (!ospf_check_sum(ospfh
)) {
2408 if (IS_DEBUG_OSPF_PACKET(ospfh
->type
- 1, RECV
))
2410 "interface %s: Simple auth OK, checksum error, Router-ID %s",
2412 inet_ntoa(ospfh
->router_id
));
2416 case OSPF_AUTH_CRYPTOGRAPHIC
: /* RFC2328 D.5.3 */
2417 if (OSPF_AUTH_CRYPTOGRAPHIC
2418 != (iface_auth_type
= ospf_auth_type(oi
))) {
2419 if (IS_DEBUG_OSPF_PACKET(ospfh
->type
- 1, RECV
))
2421 "interface %s: auth-type mismatch, local %s, rcvd Cryptographic",
2423 lookup_msg(ospf_auth_type_str
,
2424 iface_auth_type
, NULL
));
2427 if (ospfh
->checksum
) {
2428 if (IS_DEBUG_OSPF_PACKET(ospfh
->type
- 1, RECV
))
2430 "interface %s: OSPF header checksum is not 0",
2434 /* only MD5 crypto method can pass ospf_packet_examin() */
2436 NULL
== (ck
= listgetdata(listtail(
2437 OSPF_IF_PARAM(oi
, auth_crypt
))))
2438 || ospfh
->u
.crypt
.key_id
!= ck
->key_id
||
2439 /* Condition above uses the last key ID on the list,
2441 different from what ospf_crypt_key_lookup() does. A
2443 !ospf_check_md5_digest(oi
, ospfh
)) {
2444 if (IS_DEBUG_OSPF_PACKET(ospfh
->type
- 1, RECV
))
2445 zlog_warn("interface %s: MD5 auth failed",
2451 if (IS_DEBUG_OSPF_PACKET(ospfh
->type
- 1, RECV
))
2453 "interface %s: invalid packet auth-type (%02x)",
2454 IF_NAME(oi
), pkt_auth_type
);
2459 static int ospf_check_sum(struct ospf_header
*ospfh
)
2464 /* clear auth_data for checksum. */
2465 memset(ospfh
->u
.auth_data
, 0, OSPF_AUTH_SIMPLE_SIZE
);
2467 /* keep checksum and clear. */
2468 sum
= ospfh
->checksum
;
2469 memset(&ospfh
->checksum
, 0, sizeof(u_int16_t
));
2471 /* calculate checksum. */
2472 ret
= in_cksum(ospfh
, ntohs(ospfh
->length
));
2475 zlog_info("ospf_check_sum(): checksum mismatch, my %X, his %X",
2483 /* Verify, that given link/TOS records are properly sized/aligned and match
2484 Router-LSA "# links" and "# TOS" fields as specified in RFC2328 A.4.2. */
2485 static unsigned ospf_router_lsa_links_examin(struct router_lsa_link
*link
,
2486 u_int16_t linkbytes
,
2487 const u_int16_t num_links
)
2489 unsigned counted_links
= 0, thislinklen
;
2493 OSPF_ROUTER_LSA_LINK_SIZE
+ 4 * link
->m
[0].tos_count
;
2494 if (thislinklen
> linkbytes
) {
2495 if (IS_DEBUG_OSPF_PACKET(0, RECV
))
2496 zlog_debug("%s: length error in link block #%u",
2497 __func__
, counted_links
);
2500 link
= (struct router_lsa_link
*)((caddr_t
)link
+ thislinklen
);
2501 linkbytes
-= thislinklen
;
2504 if (counted_links
!= num_links
) {
2505 if (IS_DEBUG_OSPF_PACKET(0, RECV
))
2506 zlog_debug("%s: %u link blocks declared, %u present",
2507 __func__
, num_links
, counted_links
);
2513 /* Verify, that the given LSA is properly sized/aligned (including type-specific
2514 minimum length constraint). */
2515 static unsigned ospf_lsa_examin(struct lsa_header
*lsah
, const u_int16_t lsalen
,
2516 const u_char headeronly
)
2519 struct router_lsa
*rlsa
;
2520 if (lsah
->type
< OSPF_MAX_LSA
&& ospf_lsa_minlen
[lsah
->type
]
2521 && lsalen
< OSPF_LSA_HEADER_SIZE
+ ospf_lsa_minlen
[lsah
->type
]) {
2522 if (IS_DEBUG_OSPF_PACKET(0, RECV
))
2523 zlog_debug("%s: undersized (%u B) %s", __func__
, lsalen
,
2524 lookup_msg(ospf_lsa_type_msg
, lsah
->type
,
2528 switch (lsah
->type
) {
2529 case OSPF_ROUTER_LSA
:
2530 /* RFC2328 A.4.2, LSA header + 4 bytes followed by N>=1
2531 * (12+)-byte link blocks */
2533 ret
= (lsalen
- OSPF_LSA_HEADER_SIZE
2534 - OSPF_ROUTER_LSA_MIN_SIZE
)
2540 rlsa
= (struct router_lsa
*)lsah
;
2541 ret
= ospf_router_lsa_links_examin(
2542 (struct router_lsa_link
*)rlsa
->link
,
2543 lsalen
- OSPF_LSA_HEADER_SIZE
- 4, /* skip: basic
2546 ntohs(rlsa
->links
) /* 16 bits */
2549 case OSPF_AS_EXTERNAL_LSA
:
2550 /* RFC2328 A.4.5, LSA header + 4 bytes followed by N>=1 12-bytes long
2552 case OSPF_AS_NSSA_LSA
:
2553 /* RFC3101 C, idem */
2554 ret
= (lsalen
- OSPF_LSA_HEADER_SIZE
2555 - OSPF_AS_EXTERNAL_LSA_MIN_SIZE
)
2560 /* Following LSA types are considered OK length-wise as soon as their
2562 * length constraint is met and length of the whole LSA is a multiple of
2564 * (basic LSA header size is already a multiple of 4). */
2565 case OSPF_NETWORK_LSA
:
2566 /* RFC2328 A.4.3, LSA header + 4 bytes followed by N>=1 router-IDs */
2567 case OSPF_SUMMARY_LSA
:
2568 case OSPF_ASBR_SUMMARY_LSA
:
2569 /* RFC2328 A.4.4, LSA header + 4 bytes followed by N>=1 4-bytes TOS
2571 case OSPF_OPAQUE_LINK_LSA
:
2572 case OSPF_OPAQUE_AREA_LSA
:
2573 case OSPF_OPAQUE_AS_LSA
:
2574 /* RFC5250 A.2, "some number of octets (of application-specific
2575 * data) padded to 32-bit alignment." This is considered
2577 * to 4-byte alignment of all other LSA types, see
2578 * OSPF-ALIGNMENT.txt
2579 * file for the detailed analysis of this passage. */
2580 ret
= lsalen
% 4 ? MSG_NG
: MSG_OK
;
2583 if (IS_DEBUG_OSPF_PACKET(0, RECV
))
2584 zlog_debug("%s: unsupported LSA type 0x%02x", __func__
,
2588 if (ret
!= MSG_OK
&& IS_DEBUG_OSPF_PACKET(0, RECV
))
2589 zlog_debug("%s: alignment error in %s", __func__
,
2590 lookup_msg(ospf_lsa_type_msg
, lsah
->type
, NULL
));
2594 /* Verify if the provided input buffer is a valid sequence of LSAs. This
2595 includes verification of LSA blocks length/alignment and dispatching
2596 of deeper-level checks. */
2598 ospf_lsaseq_examin(struct lsa_header
*lsah
, /* start of buffered data */
2599 size_t length
, const u_char headeronly
,
2600 /* When declared_num_lsas is not 0, compare it to the real
2602 and treat the difference as an error. */
2603 const u_int32_t declared_num_lsas
)
2605 u_int32_t counted_lsas
= 0;
2609 if (length
< OSPF_LSA_HEADER_SIZE
) {
2610 if (IS_DEBUG_OSPF_PACKET(0, RECV
))
2612 "%s: undersized (%zu B) trailing (#%u) LSA header",
2613 __func__
, length
, counted_lsas
);
2616 /* save on ntohs() calls here and in the LSA validator */
2617 lsalen
= ntohs(lsah
->length
);
2618 if (lsalen
< OSPF_LSA_HEADER_SIZE
) {
2619 if (IS_DEBUG_OSPF_PACKET(0, RECV
))
2621 "%s: malformed LSA header #%u, declared length is %u B",
2622 __func__
, counted_lsas
, lsalen
);
2626 /* less checks here and in ospf_lsa_examin() */
2627 if (MSG_OK
!= ospf_lsa_examin(lsah
, lsalen
, 1)) {
2628 if (IS_DEBUG_OSPF_PACKET(0, RECV
))
2630 "%s: malformed header-only LSA #%u",
2631 __func__
, counted_lsas
);
2634 lsah
= (struct lsa_header
*)((caddr_t
)lsah
2635 + OSPF_LSA_HEADER_SIZE
);
2636 length
-= OSPF_LSA_HEADER_SIZE
;
2638 /* make sure the input buffer is deep enough before
2640 if (lsalen
> length
) {
2641 if (IS_DEBUG_OSPF_PACKET(0, RECV
))
2643 "%s: anomaly in LSA #%u: declared length is %u B, buffered length is %zu B",
2644 __func__
, counted_lsas
, lsalen
,
2648 if (MSG_OK
!= ospf_lsa_examin(lsah
, lsalen
, 0)) {
2649 if (IS_DEBUG_OSPF_PACKET(0, RECV
))
2650 zlog_debug("%s: malformed LSA #%u",
2651 __func__
, counted_lsas
);
2654 lsah
= (struct lsa_header
*)((caddr_t
)lsah
+ lsalen
);
2660 if (declared_num_lsas
&& counted_lsas
!= declared_num_lsas
) {
2661 if (IS_DEBUG_OSPF_PACKET(0, RECV
))
2663 "%s: #LSAs declared (%u) does not match actual (%u)",
2664 __func__
, declared_num_lsas
, counted_lsas
);
2670 /* Verify a complete OSPF packet for proper sizing/alignment. */
2671 static unsigned ospf_packet_examin(struct ospf_header
*oh
,
2672 const unsigned bytesonwire
)
2674 u_int16_t bytesdeclared
, bytesauth
;
2676 struct ospf_ls_update
*lsupd
;
2678 /* Length, 1st approximation. */
2679 if (bytesonwire
< OSPF_HEADER_SIZE
) {
2680 if (IS_DEBUG_OSPF_PACKET(0, RECV
))
2681 zlog_debug("%s: undersized (%u B) packet", __func__
,
2685 /* Now it is safe to access header fields. Performing length check,
2687 * for possible extra bytes of crypto auth/padding, which are not
2689 * in the OSPF header "length" field. */
2690 if (oh
->version
!= OSPF_VERSION
) {
2691 if (IS_DEBUG_OSPF_PACKET(0, RECV
))
2692 zlog_debug("%s: invalid (%u) protocol version",
2693 __func__
, oh
->version
);
2696 bytesdeclared
= ntohs(oh
->length
);
2697 if (ntohs(oh
->auth_type
) != OSPF_AUTH_CRYPTOGRAPHIC
)
2700 if (oh
->u
.crypt
.auth_data_len
!= OSPF_AUTH_MD5_SIZE
) {
2701 if (IS_DEBUG_OSPF_PACKET(0, RECV
))
2703 "%s: unsupported crypto auth length (%u B)",
2704 __func__
, oh
->u
.crypt
.auth_data_len
);
2707 bytesauth
= OSPF_AUTH_MD5_SIZE
;
2709 if (bytesdeclared
+ bytesauth
> bytesonwire
) {
2710 if (IS_DEBUG_OSPF_PACKET(0, RECV
))
2712 "%s: packet length error (%u real, %u+%u declared)",
2713 __func__
, bytesonwire
, bytesdeclared
,
2717 /* Length, 2nd approximation. The type-specific constraint is checked
2718 against declared length, not amount of bytes on wire. */
2719 if (oh
->type
>= OSPF_MSG_HELLO
&& oh
->type
<= OSPF_MSG_LS_ACK
2721 < OSPF_HEADER_SIZE
+ ospf_packet_minlen
[oh
->type
]) {
2722 if (IS_DEBUG_OSPF_PACKET(0, RECV
))
2723 zlog_debug("%s: undersized (%u B) %s packet", __func__
,
2725 lookup_msg(ospf_packet_type_str
, oh
->type
,
2730 case OSPF_MSG_HELLO
:
2731 /* RFC2328 A.3.2, packet header + OSPF_HELLO_MIN_SIZE bytes
2733 by N>=0 router-IDs. */
2734 ret
= (bytesdeclared
- OSPF_HEADER_SIZE
- OSPF_HELLO_MIN_SIZE
)
2739 case OSPF_MSG_DB_DESC
:
2740 /* RFC2328 A.3.3, packet header + OSPF_DB_DESC_MIN_SIZE bytes
2742 by N>=0 header-only LSAs. */
2743 ret
= ospf_lsaseq_examin(
2744 (struct lsa_header
*)((caddr_t
)oh
+ OSPF_HEADER_SIZE
2745 + OSPF_DB_DESC_MIN_SIZE
),
2746 bytesdeclared
- OSPF_HEADER_SIZE
2747 - OSPF_DB_DESC_MIN_SIZE
,
2748 1, /* header-only LSAs */
2751 case OSPF_MSG_LS_REQ
:
2752 /* RFC2328 A.3.4, packet header followed by N>=0 12-bytes
2753 * request blocks. */
2754 ret
= (bytesdeclared
- OSPF_HEADER_SIZE
- OSPF_LS_REQ_MIN_SIZE
)
2759 case OSPF_MSG_LS_UPD
:
2760 /* RFC2328 A.3.5, packet header + OSPF_LS_UPD_MIN_SIZE bytes
2762 by N>=0 full LSAs (with N declared beforehand). */
2763 lsupd
= (struct ospf_ls_update
*)((caddr_t
)oh
2764 + OSPF_HEADER_SIZE
);
2765 ret
= ospf_lsaseq_examin(
2766 (struct lsa_header
*)((caddr_t
)lsupd
2767 + OSPF_LS_UPD_MIN_SIZE
),
2768 bytesdeclared
- OSPF_HEADER_SIZE
- OSPF_LS_UPD_MIN_SIZE
,
2770 ntohl(lsupd
->num_lsas
) /* 32 bits */
2773 case OSPF_MSG_LS_ACK
:
2774 /* RFC2328 A.3.6, packet header followed by N>=0 header-only
2776 ret
= ospf_lsaseq_examin(
2777 (struct lsa_header
*)((caddr_t
)oh
+ OSPF_HEADER_SIZE
2778 + OSPF_LS_ACK_MIN_SIZE
),
2779 bytesdeclared
- OSPF_HEADER_SIZE
- OSPF_LS_ACK_MIN_SIZE
,
2780 1, /* header-only LSAs */
2784 if (IS_DEBUG_OSPF_PACKET(0, RECV
))
2785 zlog_debug("%s: invalid packet type 0x%02x", __func__
,
2789 if (ret
!= MSG_OK
&& IS_DEBUG_OSPF_PACKET(0, RECV
))
2790 zlog_debug("%s: malformed %s packet", __func__
,
2791 lookup_msg(ospf_packet_type_str
, oh
->type
, NULL
));
2795 /* OSPF Header verification. */
2796 static int ospf_verify_header(struct stream
*ibuf
, struct ospf_interface
*oi
,
2797 struct ip
*iph
, struct ospf_header
*ospfh
)
2799 /* Check Area ID. */
2800 if (!ospf_check_area_id(oi
, ospfh
)) {
2801 zlog_warn("interface %s: ospf_read invalid Area ID %s.",
2802 IF_NAME(oi
), inet_ntoa(ospfh
->area_id
));
2806 /* Check network mask, Silently discarded. */
2807 if (!ospf_check_network_mask(oi
, iph
->ip_src
)) {
2809 "interface %s: ospf_read network address is not same [%s]",
2810 IF_NAME(oi
), inet_ntoa(iph
->ip_src
));
2814 /* Check authentication. The function handles logging actions, where
2816 if (!ospf_check_auth(oi
, ospfh
))
2822 /* Starting point of packet process function. */
2823 int ospf_read(struct thread
*thread
)
2826 struct stream
*ibuf
;
2828 struct ospf_interface
*oi
;
2830 struct ospf_header
*ospfh
;
2832 struct interface
*ifp
;
2833 struct connected
*c
;
2835 /* first of all get interface pointer. */
2836 ospf
= THREAD_ARG(thread
);
2838 /* prepare for next packet. */
2839 ospf
->t_read
= thread_add_read(master
, ospf_read
, ospf
, ospf
->fd
);
2841 stream_reset(ospf
->ibuf
);
2842 if (!(ibuf
= ospf_recv_packet(ospf
->fd
, &ifp
, ospf
->ibuf
)))
2844 /* This raw packet is known to be at least as big as its IP header. */
2846 /* Note that there should not be alignment problems with this assignment
2847 because this is at the beginning of the stream data buffer. */
2848 iph
= (struct ip
*)STREAM_DATA(ibuf
);
2849 /* Note that sockopt_iphdrincl_swab_systoh was called in
2850 * ospf_recv_packet. */
2853 /* Handle cases where the platform does not support retrieving
2855 and also platforms (such as Solaris 8) that claim to support
2857 retrieval but do not. */
2858 c
= if_lookup_address((void *)&iph
->ip_src
, AF_INET
,
2866 /* IP Header dump. */
2867 if (IS_DEBUG_OSPF_PACKET(0, RECV
))
2868 ospf_ip_header_dump(iph
);
2870 /* Self-originated packet should be discarded silently. */
2871 if (ospf_if_lookup_by_local_addr(ospf
, NULL
, iph
->ip_src
)) {
2872 if (IS_DEBUG_OSPF_PACKET(0, RECV
)) {
2874 "ospf_read[%s]: Dropping self-originated packet",
2875 inet_ntoa(iph
->ip_src
));
2880 /* Advance from IP header to OSPF header (iph->ip_hl has been verified
2881 by ospf_recv_packet() to be correct). */
2882 stream_forward_getp(ibuf
, iph
->ip_hl
* 4);
2884 ospfh
= (struct ospf_header
*)STREAM_PNT(ibuf
);
2886 != ospf_packet_examin(
2887 ospfh
, stream_get_endp(ibuf
) - stream_get_getp(ibuf
)))
2889 /* Now it is safe to access all fields of OSPF packet header. */
2891 /* associate packet with ospf interface */
2892 oi
= ospf_if_lookup_recv_if(ospf
, iph
->ip_src
, ifp
);
2894 /* ospf_verify_header() relies on a valid "oi" and thus can be called
2896 after the passive/backbone/other checks below are passed. These
2898 in turn access the fields of unverified "ospfh" structure for their
2900 purposes and must remain very accurate in doing this. */
2902 /* If incoming interface is passive one, ignore it. */
2903 if (oi
&& OSPF_IF_PASSIVE_STATUS(oi
) == OSPF_IF_PASSIVE
) {
2904 char buf
[3][INET_ADDRSTRLEN
];
2906 if (IS_DEBUG_OSPF_EVENT
)
2908 "ignoring packet from router %s sent to %s, "
2909 "received on a passive interface, %s",
2910 inet_ntop(AF_INET
, &ospfh
->router_id
, buf
[0],
2912 inet_ntop(AF_INET
, &iph
->ip_dst
, buf
[1],
2914 inet_ntop(AF_INET
, &oi
->address
->u
.prefix4
,
2915 buf
[2], sizeof(buf
[2])));
2917 if (iph
->ip_dst
.s_addr
== htonl(OSPF_ALLSPFROUTERS
)) {
2918 /* Try to fix multicast membership.
2919 * Some OS:es may have problems in this area,
2920 * make sure it is removed.
2922 OI_MEMBER_JOINED(oi
, MEMBER_ALLROUTERS
);
2923 ospf_if_set_multicast(oi
);
2929 /* if no local ospf_interface,
2930 * or header area is backbone but ospf_interface is not
2931 * check for VLINK interface
2933 if ((oi
== NULL
) || (OSPF_IS_AREA_ID_BACKBONE(ospfh
->area_id
)
2934 && !OSPF_IS_AREA_ID_BACKBONE(oi
->area
->area_id
))) {
2935 if ((oi
= ospf_associate_packet_vl(ospf
, ifp
, iph
, ospfh
))
2937 if (!ospf
->instance
&& IS_DEBUG_OSPF_EVENT
)
2939 "Packet from [%s] received on link %s"
2940 " but no ospf_interface",
2941 inet_ntoa(iph
->ip_src
), ifp
->name
);
2946 /* else it must be a local ospf interface, check it was received on
2949 else if (oi
->ifp
!= ifp
) {
2950 if (IS_DEBUG_OSPF_EVENT
)
2951 zlog_warn("Packet from [%s] received on wrong link %s",
2952 inet_ntoa(iph
->ip_src
), ifp
->name
);
2954 } else if (oi
->state
== ISM_Down
) {
2955 char buf
[2][INET_ADDRSTRLEN
];
2957 "Ignoring packet from %s to %s received on interface that is "
2958 "down [%s]; interface flags are %s",
2959 inet_ntop(AF_INET
, &iph
->ip_src
, buf
[0],
2961 inet_ntop(AF_INET
, &iph
->ip_dst
, buf
[1],
2963 ifp
->name
, if_flag_dump(ifp
->flags
));
2964 /* Fix multicast memberships? */
2965 if (iph
->ip_dst
.s_addr
== htonl(OSPF_ALLSPFROUTERS
))
2966 OI_MEMBER_JOINED(oi
, MEMBER_ALLROUTERS
);
2967 else if (iph
->ip_dst
.s_addr
== htonl(OSPF_ALLDROUTERS
))
2968 OI_MEMBER_JOINED(oi
, MEMBER_DROUTERS
);
2969 if (oi
->multicast_memberships
)
2970 ospf_if_set_multicast(oi
);
2975 * If the received packet is destined for AllDRouters, the packet
2976 * should be accepted only if the received ospf interface state is
2977 * either DR or Backup -- endo.
2979 if (iph
->ip_dst
.s_addr
== htonl(OSPF_ALLDROUTERS
)
2980 && (oi
->state
!= ISM_DR
&& oi
->state
!= ISM_Backup
)) {
2982 "Dropping packet for AllDRouters from [%s] via [%s] (ISM: %s)",
2983 inet_ntoa(iph
->ip_src
), IF_NAME(oi
),
2984 lookup_msg(ospf_ism_state_msg
, oi
->state
, NULL
));
2985 /* Try to fix multicast membership. */
2986 SET_FLAG(oi
->multicast_memberships
, MEMBER_DROUTERS
);
2987 ospf_if_set_multicast(oi
);
2991 /* Verify more OSPF header fields. */
2992 ret
= ospf_verify_header(ibuf
, oi
, iph
, ospfh
);
2994 if (IS_DEBUG_OSPF_PACKET(0, RECV
))
2996 "ospf_read[%s]: Header check failed, "
2998 inet_ntoa(iph
->ip_src
));
3002 /* Show debug receiving packet. */
3003 if (IS_DEBUG_OSPF_PACKET(ospfh
->type
- 1, RECV
)) {
3004 if (IS_DEBUG_OSPF_PACKET(ospfh
->type
- 1, DETAIL
)) {
3006 "-----------------------------------------------------");
3007 ospf_packet_dump(ibuf
);
3010 zlog_debug("%s received from [%s] via [%s]",
3011 lookup_msg(ospf_packet_type_str
, ospfh
->type
, NULL
),
3012 inet_ntoa(ospfh
->router_id
), IF_NAME(oi
));
3013 zlog_debug(" src [%s],", inet_ntoa(iph
->ip_src
));
3014 zlog_debug(" dst [%s]", inet_ntoa(iph
->ip_dst
));
3016 if (IS_DEBUG_OSPF_PACKET(ospfh
->type
- 1, DETAIL
))
3018 "-----------------------------------------------------");
3021 stream_forward_getp(ibuf
, OSPF_HEADER_SIZE
);
3023 /* Adjust size to message length. */
3024 length
= ntohs(ospfh
->length
) - OSPF_HEADER_SIZE
;
3026 /* Read rest of the packet and call each sort of packet routine. */
3027 switch (ospfh
->type
) {
3028 case OSPF_MSG_HELLO
:
3029 ospf_hello(iph
, ospfh
, ibuf
, oi
, length
);
3031 case OSPF_MSG_DB_DESC
:
3032 ospf_db_desc(iph
, ospfh
, ibuf
, oi
, length
);
3034 case OSPF_MSG_LS_REQ
:
3035 ospf_ls_req(iph
, ospfh
, ibuf
, oi
, length
);
3037 case OSPF_MSG_LS_UPD
:
3038 ospf_ls_upd(ospf
, iph
, ospfh
, ibuf
, oi
, length
);
3040 case OSPF_MSG_LS_ACK
:
3041 ospf_ls_ack(iph
, ospfh
, ibuf
, oi
, length
);
3044 zlog_warn("interface %s: OSPF packet header type %d is illegal",
3045 IF_NAME(oi
), ospfh
->type
);
3052 /* Make OSPF header. */
3053 static void ospf_make_header(int type
, struct ospf_interface
*oi
,
3056 struct ospf_header
*ospfh
;
3058 ospfh
= (struct ospf_header
*)STREAM_DATA(s
);
3060 ospfh
->version
= (u_char
)OSPF_VERSION
;
3061 ospfh
->type
= (u_char
)type
;
3063 ospfh
->router_id
= oi
->ospf
->router_id
;
3065 ospfh
->checksum
= 0;
3066 ospfh
->area_id
= oi
->area
->area_id
;
3067 ospfh
->auth_type
= htons(ospf_auth_type(oi
));
3069 memset(ospfh
->u
.auth_data
, 0, OSPF_AUTH_SIMPLE_SIZE
);
3071 stream_forward_endp(s
, OSPF_HEADER_SIZE
);
3074 /* Make Authentication Data. */
3075 static int ospf_make_auth(struct ospf_interface
*oi
, struct ospf_header
*ospfh
)
3077 struct crypt_key
*ck
;
3079 switch (ospf_auth_type(oi
)) {
3080 case OSPF_AUTH_NULL
:
3081 /* memset (ospfh->u.auth_data, 0, sizeof (ospfh->u.auth_data));
3084 case OSPF_AUTH_SIMPLE
:
3085 memcpy(ospfh
->u
.auth_data
, OSPF_IF_PARAM(oi
, auth_simple
),
3086 OSPF_AUTH_SIMPLE_SIZE
);
3088 case OSPF_AUTH_CRYPTOGRAPHIC
:
3089 /* If key is not set, then set 0. */
3090 if (list_isempty(OSPF_IF_PARAM(oi
, auth_crypt
))) {
3091 ospfh
->u
.crypt
.zero
= 0;
3092 ospfh
->u
.crypt
.key_id
= 0;
3093 ospfh
->u
.crypt
.auth_data_len
= OSPF_AUTH_MD5_SIZE
;
3096 listtail(OSPF_IF_PARAM(oi
, auth_crypt
)));
3097 ospfh
->u
.crypt
.zero
= 0;
3098 ospfh
->u
.crypt
.key_id
= ck
->key_id
;
3099 ospfh
->u
.crypt
.auth_data_len
= OSPF_AUTH_MD5_SIZE
;
3101 /* note: the seq is done in ospf_make_md5_digest() */
3104 /* memset (ospfh->u.auth_data, 0, sizeof (ospfh->u.auth_data));
3112 /* Fill rest of OSPF header. */
3113 static void ospf_fill_header(struct ospf_interface
*oi
, struct stream
*s
,
3116 struct ospf_header
*ospfh
;
3118 ospfh
= (struct ospf_header
*)STREAM_DATA(s
);
3121 ospfh
->length
= htons(length
);
3123 /* Calculate checksum. */
3124 if (ntohs(ospfh
->auth_type
) != OSPF_AUTH_CRYPTOGRAPHIC
)
3125 ospfh
->checksum
= in_cksum(ospfh
, length
);
3127 ospfh
->checksum
= 0;
3129 /* Add Authentication Data. */
3130 ospf_make_auth(oi
, ospfh
);
3133 static int ospf_make_hello(struct ospf_interface
*oi
, struct stream
*s
)
3135 struct ospf_neighbor
*nbr
;
3136 struct route_node
*rn
;
3137 u_int16_t length
= OSPF_HELLO_MIN_SIZE
;
3138 struct in_addr mask
;
3142 /* Set netmask of interface. */
3143 if (!(CHECK_FLAG(oi
->connected
->flags
, ZEBRA_IFA_UNNUMBERED
)
3144 && oi
->type
== OSPF_IFTYPE_POINTOPOINT
)
3145 && oi
->type
!= OSPF_IFTYPE_VIRTUALLINK
)
3146 masklen2ip(oi
->address
->prefixlen
, &mask
);
3148 memset((char *)&mask
, 0, sizeof(struct in_addr
));
3149 stream_put_ipv4(s
, mask
.s_addr
);
3151 /* Set Hello Interval. */
3152 if (OSPF_IF_PARAM(oi
, fast_hello
) == 0)
3153 stream_putw(s
, OSPF_IF_PARAM(oi
, v_hello
));
3155 stream_putw(s
, 0); /* hello-interval of 0 for fast-hellos */
3157 if (IS_DEBUG_OSPF_EVENT
)
3158 zlog_debug("make_hello: options: %x, int: %s", OPTIONS(oi
),
3162 stream_putc(s
, OPTIONS(oi
));
3164 /* Set Router Priority. */
3165 stream_putc(s
, PRIORITY(oi
));
3167 /* Set Router Dead Interval. */
3168 stream_putl(s
, OSPF_IF_PARAM(oi
, v_wait
));
3170 /* Set Designated Router. */
3171 stream_put_ipv4(s
, DR(oi
).s_addr
);
3173 p
= stream_get_endp(s
);
3175 /* Set Backup Designated Router. */
3176 stream_put_ipv4(s
, BDR(oi
).s_addr
);
3178 /* Add neighbor seen. */
3179 for (rn
= route_top(oi
->nbrs
); rn
; rn
= route_next(rn
))
3180 if ((nbr
= rn
->info
))
3181 if (nbr
->router_id
.s_addr
3182 != 0) /* Ignore 0.0.0.0 node. */
3184 != NSM_Attempt
) /* Ignore Down neighbor. */
3186 != NSM_Down
) /* This is myself for
3188 if (!IPV4_ADDR_SAME(
3190 &oi
->ospf
->router_id
)) {
3191 /* Check neighbor is
3193 if (nbr
->d_router
.s_addr
3214 /* Let neighbor generate BackupSeen. */
3216 stream_putl_at(s
, p
, 0); /* ipv4 address, normally */
3221 static int ospf_make_db_desc(struct ospf_interface
*oi
,
3222 struct ospf_neighbor
*nbr
, struct stream
*s
)
3224 struct ospf_lsa
*lsa
;
3225 u_int16_t length
= OSPF_DB_DESC_MIN_SIZE
;
3229 struct ospf_lsdb
*lsdb
;
3231 /* Set Interface MTU. */
3232 if (oi
->type
== OSPF_IFTYPE_VIRTUALLINK
)
3235 stream_putw(s
, oi
->ifp
->mtu
);
3238 options
= OPTIONS(oi
);
3239 if (CHECK_FLAG(oi
->ospf
->config
, OSPF_OPAQUE_CAPABLE
))
3240 SET_FLAG(options
, OSPF_OPTION_O
);
3241 stream_putc(s
, options
);
3244 pp
= stream_get_endp(s
);
3245 stream_putc(s
, nbr
->dd_flags
);
3247 /* Set DD Sequence Number. */
3248 stream_putl(s
, nbr
->dd_seqnum
);
3250 /* shortcut unneeded walk of (empty) summary LSDBs */
3251 if (ospf_db_summary_isempty(nbr
))
3254 /* Describe LSA Header from Database Summary List. */
3255 lsdb
= &nbr
->db_sum
;
3257 for (i
= OSPF_MIN_LSA
; i
< OSPF_MAX_LSA
; i
++) {
3258 struct route_table
*table
= lsdb
->type
[i
].db
;
3259 struct route_node
*rn
;
3261 for (rn
= route_top(table
); rn
; rn
= route_next(rn
))
3262 if ((lsa
= rn
->info
) != NULL
) {
3263 if (IS_OPAQUE_LSA(lsa
->data
->type
)
3264 && (!CHECK_FLAG(options
, OSPF_OPTION_O
))) {
3265 /* Suppress advertising
3266 * opaque-informations. */
3267 /* Remove LSA from DB summary list. */
3268 ospf_lsdb_delete(lsdb
, lsa
);
3272 if (!CHECK_FLAG(lsa
->flags
, OSPF_LSA_DISCARD
)) {
3273 struct lsa_header
*lsah
;
3276 /* DD packet overflows interface MTU. */
3277 if (length
+ OSPF_LSA_HEADER_SIZE
3278 > ospf_packet_max(oi
))
3281 /* Keep pointer to LS age. */
3282 lsah
= (struct lsa_header
3287 /* Proceed stream pointer. */
3288 stream_put(s
, lsa
->data
,
3289 OSPF_LSA_HEADER_SIZE
);
3290 length
+= OSPF_LSA_HEADER_SIZE
;
3293 ls_age
= LS_AGE(lsa
);
3294 lsah
->ls_age
= htons(ls_age
);
3297 /* Remove LSA from DB summary list. */
3298 ospf_lsdb_delete(lsdb
, lsa
);
3302 /* Update 'More' bit */
3303 if (ospf_db_summary_isempty(nbr
)) {
3305 if (nbr
->state
>= NSM_Exchange
) {
3306 UNSET_FLAG(nbr
->dd_flags
, OSPF_DD_FLAG_M
);
3307 /* Rewrite DD flags */
3308 stream_putc_at(s
, pp
, nbr
->dd_flags
);
3310 assert(IS_SET_DD_M(nbr
->dd_flags
));
3316 static int ospf_make_ls_req_func(struct stream
*s
, u_int16_t
*length
,
3317 unsigned long delta
, struct ospf_neighbor
*nbr
,
3318 struct ospf_lsa
*lsa
)
3320 struct ospf_interface
*oi
;
3324 /* LS Request packet overflows interface MTU. */
3325 if (*length
+ delta
> ospf_packet_max(oi
))
3328 stream_putl(s
, lsa
->data
->type
);
3329 stream_put_ipv4(s
, lsa
->data
->id
.s_addr
);
3330 stream_put_ipv4(s
, lsa
->data
->adv_router
.s_addr
);
3332 ospf_lsa_unlock(&nbr
->ls_req_last
);
3333 nbr
->ls_req_last
= ospf_lsa_lock(lsa
);
3339 static int ospf_make_ls_req(struct ospf_neighbor
*nbr
, struct stream
*s
)
3341 struct ospf_lsa
*lsa
;
3342 u_int16_t length
= OSPF_LS_REQ_MIN_SIZE
;
3343 unsigned long delta
= stream_get_endp(s
) + 12;
3344 struct route_table
*table
;
3345 struct route_node
*rn
;
3347 struct ospf_lsdb
*lsdb
;
3349 lsdb
= &nbr
->ls_req
;
3351 for (i
= OSPF_MIN_LSA
; i
< OSPF_MAX_LSA
; i
++) {
3352 table
= lsdb
->type
[i
].db
;
3353 for (rn
= route_top(table
); rn
; rn
= route_next(rn
))
3354 if ((lsa
= (rn
->info
)) != NULL
)
3355 if (ospf_make_ls_req_func(s
, &length
, delta
,
3358 route_unlock_node(rn
);
3365 static int ls_age_increment(struct ospf_lsa
*lsa
, int delay
)
3369 age
= IS_LSA_MAXAGE(lsa
) ? OSPF_LSA_MAXAGE
: LS_AGE(lsa
) + delay
;
3371 return (age
> OSPF_LSA_MAXAGE
? OSPF_LSA_MAXAGE
: age
);
3374 static int ospf_make_ls_upd(struct ospf_interface
*oi
, struct list
*update
,
3377 struct ospf_lsa
*lsa
;
3378 struct listnode
*node
;
3379 u_int16_t length
= 0;
3380 unsigned int size_noauth
;
3381 unsigned long delta
= stream_get_endp(s
);
3385 if (IS_DEBUG_OSPF_EVENT
)
3386 zlog_debug("ospf_make_ls_upd: Start");
3388 pp
= stream_get_endp(s
);
3389 stream_forward_endp(s
, OSPF_LS_UPD_MIN_SIZE
);
3390 length
+= OSPF_LS_UPD_MIN_SIZE
;
3392 /* Calculate amount of packet usable for data. */
3393 size_noauth
= stream_get_size(s
) - ospf_packet_authspace(oi
);
3395 while ((node
= listhead(update
)) != NULL
) {
3396 struct lsa_header
*lsah
;
3399 if (IS_DEBUG_OSPF_EVENT
)
3400 zlog_debug("ospf_make_ls_upd: List Iteration %d",
3403 lsa
= listgetdata(node
);
3408 if (length
+ delta
+ ntohs(lsa
->data
->length
) > size_noauth
)
3411 /* Keep pointer to LS age. */
3412 lsah
= (struct lsa_header
*)(STREAM_DATA(s
)
3413 + stream_get_endp(s
));
3415 /* Put LSA to Link State Request. */
3416 stream_put(s
, lsa
->data
, ntohs(lsa
->data
->length
));
3419 /* each hop must increment an lsa_age by transmit_delay
3420 of OSPF interface */
3421 ls_age
= ls_age_increment(lsa
,
3422 OSPF_IF_PARAM(oi
, transmit_delay
));
3423 lsah
->ls_age
= htons(ls_age
);
3425 length
+= ntohs(lsa
->data
->length
);
3428 list_delete_node(update
, node
);
3429 ospf_lsa_unlock(&lsa
); /* oi->ls_upd_queue */
3432 /* Now set #LSAs. */
3433 stream_putl_at(s
, pp
, count
);
3435 if (IS_DEBUG_OSPF_EVENT
)
3436 zlog_debug("ospf_make_ls_upd: Stop");
3440 static int ospf_make_ls_ack(struct ospf_interface
*oi
, struct list
*ack
,
3443 struct listnode
*node
, *nnode
;
3444 u_int16_t length
= OSPF_LS_ACK_MIN_SIZE
;
3445 unsigned long delta
= stream_get_endp(s
) + 24;
3446 struct ospf_lsa
*lsa
;
3448 for (ALL_LIST_ELEMENTS(ack
, node
, nnode
, lsa
)) {
3451 if (length
+ delta
> ospf_packet_max(oi
))
3454 stream_put(s
, lsa
->data
, OSPF_LSA_HEADER_SIZE
);
3455 length
+= OSPF_LSA_HEADER_SIZE
;
3457 listnode_delete(ack
, lsa
);
3458 ospf_lsa_unlock(&lsa
); /* oi->ls_ack_direct.ls_ack */
3464 static void ospf_hello_send_sub(struct ospf_interface
*oi
, in_addr_t addr
)
3466 struct ospf_packet
*op
;
3467 u_int16_t length
= OSPF_HEADER_SIZE
;
3469 op
= ospf_packet_new(oi
->ifp
->mtu
);
3471 /* Prepare OSPF common header. */
3472 ospf_make_header(OSPF_MSG_HELLO
, oi
, op
->s
);
3474 /* Prepare OSPF Hello body. */
3475 length
+= ospf_make_hello(oi
, op
->s
);
3477 /* Fill OSPF header. */
3478 ospf_fill_header(oi
, op
->s
, length
);
3480 /* Set packet length. */
3481 op
->length
= length
;
3483 op
->dst
.s_addr
= addr
;
3485 /* Add packet to the top of the interface output queue, so that they
3486 * can't get delayed by things like long queues of LS Update packets
3488 ospf_packet_add_top(oi
, op
);
3490 /* Hook thread to write packet. */
3491 OSPF_ISM_WRITE_ON(oi
->ospf
);
3494 static void ospf_poll_send(struct ospf_nbr_nbma
*nbr_nbma
)
3496 struct ospf_interface
*oi
;
3501 /* If this is passive interface, do not send OSPF Hello. */
3502 if (OSPF_IF_PASSIVE_STATUS(oi
) == OSPF_IF_PASSIVE
)
3505 if (oi
->type
!= OSPF_IFTYPE_NBMA
)
3508 if (nbr_nbma
->nbr
!= NULL
&& nbr_nbma
->nbr
->state
!= NSM_Down
)
3511 if (PRIORITY(oi
) == 0)
3514 if (nbr_nbma
->priority
== 0 && oi
->state
!= ISM_DR
3515 && oi
->state
!= ISM_Backup
)
3518 ospf_hello_send_sub(oi
, nbr_nbma
->addr
.s_addr
);
3521 int ospf_poll_timer(struct thread
*thread
)
3523 struct ospf_nbr_nbma
*nbr_nbma
;
3525 nbr_nbma
= THREAD_ARG(thread
);
3526 nbr_nbma
->t_poll
= NULL
;
3528 if (IS_DEBUG_OSPF(nsm
, NSM_TIMERS
))
3529 zlog_debug("NSM[%s:%s]: Timer (Poll timer expire)",
3530 IF_NAME(nbr_nbma
->oi
), inet_ntoa(nbr_nbma
->addr
));
3532 ospf_poll_send(nbr_nbma
);
3534 if (nbr_nbma
->v_poll
> 0)
3535 OSPF_POLL_TIMER_ON(nbr_nbma
->t_poll
, ospf_poll_timer
,
3542 int ospf_hello_reply_timer(struct thread
*thread
)
3544 struct ospf_neighbor
*nbr
;
3546 nbr
= THREAD_ARG(thread
);
3547 nbr
->t_hello_reply
= NULL
;
3551 if (IS_DEBUG_OSPF(nsm
, NSM_TIMERS
))
3552 zlog_debug("NSM[%s:%s]: Timer (hello-reply timer expire)",
3553 IF_NAME(nbr
->oi
), inet_ntoa(nbr
->router_id
));
3555 ospf_hello_send_sub(nbr
->oi
, nbr
->address
.u
.prefix4
.s_addr
);
3560 /* Send OSPF Hello. */
3561 void ospf_hello_send(struct ospf_interface
*oi
)
3563 /* If this is passive interface, do not send OSPF Hello. */
3564 if (OSPF_IF_PASSIVE_STATUS(oi
) == OSPF_IF_PASSIVE
)
3567 if (oi
->type
== OSPF_IFTYPE_NBMA
) {
3568 struct ospf_neighbor
*nbr
;
3569 struct route_node
*rn
;
3571 for (rn
= route_top(oi
->nbrs
); rn
; rn
= route_next(rn
))
3572 if ((nbr
= rn
->info
))
3573 if (nbr
!= oi
->nbr_self
)
3574 if (nbr
->state
!= NSM_Down
) {
3575 /* RFC 2328 Section 9.5.1
3576 If the router is not
3577 eligible to become Designated
3579 it must periodically send
3580 Hello Packets to both the
3581 Designated Router and the
3582 Backup Designated Router (if
3585 if (PRIORITY(oi
) == 0
3596 /* If the router is eligible to
3597 become Designated Router, it
3598 must periodically send Hello
3599 Packets to all neighbors that
3600 are also eligible. In
3601 addition, if the router is
3603 Designated Router or Backup
3604 Designated Router, it must
3606 send periodic Hello Packets
3607 to all other neighbors. */
3609 if (nbr
->priority
== 0
3610 && oi
->state
== ISM_DROther
)
3612 /* if oi->state == Waiting, send
3613 * hello to all neighbors */
3614 ospf_hello_send_sub(
3616 nbr
->address
.u
.prefix4
3620 /* Decide destination address. */
3621 if (oi
->type
== OSPF_IFTYPE_VIRTUALLINK
)
3622 ospf_hello_send_sub(oi
, oi
->vl_data
->peer_addr
.s_addr
);
3624 ospf_hello_send_sub(oi
, htonl(OSPF_ALLSPFROUTERS
));
3628 /* Send OSPF Database Description. */
3629 void ospf_db_desc_send(struct ospf_neighbor
*nbr
)
3631 struct ospf_interface
*oi
;
3632 struct ospf_packet
*op
;
3633 u_int16_t length
= OSPF_HEADER_SIZE
;
3636 op
= ospf_packet_new(oi
->ifp
->mtu
);
3638 /* Prepare OSPF common header. */
3639 ospf_make_header(OSPF_MSG_DB_DESC
, oi
, op
->s
);
3641 /* Prepare OSPF Database Description body. */
3642 length
+= ospf_make_db_desc(oi
, nbr
, op
->s
);
3644 /* Fill OSPF header. */
3645 ospf_fill_header(oi
, op
->s
, length
);
3647 /* Set packet length. */
3648 op
->length
= length
;
3650 /* Decide destination address. */
3651 if (oi
->type
== OSPF_IFTYPE_POINTOPOINT
)
3652 op
->dst
.s_addr
= htonl(OSPF_ALLSPFROUTERS
);
3654 op
->dst
= nbr
->address
.u
.prefix4
;
3656 /* Add packet to the interface output queue. */
3657 ospf_packet_add(oi
, op
);
3659 /* Hook thread to write packet. */
3660 OSPF_ISM_WRITE_ON(oi
->ospf
);
3662 /* Remove old DD packet, then copy new one and keep in neighbor
3665 ospf_packet_free(nbr
->last_send
);
3666 nbr
->last_send
= ospf_packet_dup(op
);
3667 monotime(&nbr
->last_send_ts
);
3670 /* Re-send Database Description. */
3671 void ospf_db_desc_resend(struct ospf_neighbor
*nbr
)
3673 struct ospf_interface
*oi
;
3677 /* Add packet to the interface output queue. */
3678 ospf_packet_add(oi
, ospf_packet_dup(nbr
->last_send
));
3680 /* Hook thread to write packet. */
3681 OSPF_ISM_WRITE_ON(oi
->ospf
);
3684 /* Send Link State Request. */
3685 void ospf_ls_req_send(struct ospf_neighbor
*nbr
)
3687 struct ospf_interface
*oi
;
3688 struct ospf_packet
*op
;
3689 u_int16_t length
= OSPF_HEADER_SIZE
;
3692 op
= ospf_packet_new(oi
->ifp
->mtu
);
3694 /* Prepare OSPF common header. */
3695 ospf_make_header(OSPF_MSG_LS_REQ
, oi
, op
->s
);
3697 /* Prepare OSPF Link State Request body. */
3698 length
+= ospf_make_ls_req(nbr
, op
->s
);
3699 if (length
== OSPF_HEADER_SIZE
) {
3700 ospf_packet_free(op
);
3704 /* Fill OSPF header. */
3705 ospf_fill_header(oi
, op
->s
, length
);
3707 /* Set packet length. */
3708 op
->length
= length
;
3710 /* Decide destination address. */
3711 if (oi
->type
== OSPF_IFTYPE_POINTOPOINT
)
3712 op
->dst
.s_addr
= htonl(OSPF_ALLSPFROUTERS
);
3714 op
->dst
= nbr
->address
.u
.prefix4
;
3716 /* Add packet to the interface output queue. */
3717 ospf_packet_add(oi
, op
);
3719 /* Hook thread to write packet. */
3720 OSPF_ISM_WRITE_ON(oi
->ospf
);
3722 /* Add Link State Request Retransmission Timer. */
3723 OSPF_NSM_TIMER_ON(nbr
->t_ls_req
, ospf_ls_req_timer
, nbr
->v_ls_req
);
3726 /* Send Link State Update with an LSA. */
3727 void ospf_ls_upd_send_lsa(struct ospf_neighbor
*nbr
, struct ospf_lsa
*lsa
,
3730 struct list
*update
;
3732 update
= list_new();
3734 listnode_add(update
, lsa
);
3735 ospf_ls_upd_send(nbr
, update
, flag
);
3737 list_delete(update
);
3740 /* Determine size for packet. Must be at least big enough to accomodate next
3741 * LSA on list, which may be bigger than MTU size.
3743 * Return pointer to new ospf_packet
3744 * NULL if we can not allocate, eg because LSA is bigger than imposed limit
3745 * on packet sizes (in which case offending LSA is deleted from update list)
3747 static struct ospf_packet
*ospf_ls_upd_packet_new(struct list
*update
,
3748 struct ospf_interface
*oi
)
3750 struct ospf_lsa
*lsa
;
3751 struct listnode
*ln
;
3753 static char warned
= 0;
3755 lsa
= listgetdata((ln
= listhead(update
)));
3758 if ((OSPF_LS_UPD_MIN_SIZE
+ ntohs(lsa
->data
->length
))
3759 > ospf_packet_max(oi
)) {
3762 "ospf_ls_upd_packet_new: oversized LSA encountered!"
3763 "will need to fragment. Not optimal. Try divide up"
3764 " your network with areas. Use 'debug ospf packet send'"
3765 " to see details, or look at 'show ip ospf database ..'");
3769 if (IS_DEBUG_OSPF_PACKET(0, SEND
))
3771 "ospf_ls_upd_packet_new: oversized LSA id:%s,"
3772 " %d bytes originated by %s, will be fragmented!",
3773 inet_ntoa(lsa
->data
->id
),
3774 ntohs(lsa
->data
->length
),
3775 inet_ntoa(lsa
->data
->adv_router
));
3778 * Allocate just enough to fit this LSA only, to avoid including
3780 * LSAs in fragmented LSA Updates.
3782 size
= ntohs(lsa
->data
->length
)
3783 + (oi
->ifp
->mtu
- ospf_packet_max(oi
))
3784 + OSPF_LS_UPD_MIN_SIZE
;
3786 size
= oi
->ifp
->mtu
;
3788 if (size
> OSPF_MAX_PACKET_SIZE
) {
3790 "ospf_ls_upd_packet_new: oversized LSA id:%s too big,"
3791 " %d bytes, packet size %ld, dropping it completely."
3792 " OSPF routing is broken!",
3793 inet_ntoa(lsa
->data
->id
), ntohs(lsa
->data
->length
),
3795 list_delete_node(update
, ln
);
3799 /* IP header is built up separately by ospf_write(). This means, that we
3801 * reduce the "affordable" size just calculated by length of an IP
3803 * This makes sure, that even if we manage to fill the payload with LSA
3805 * completely, the final packet (our data plus IP header) still fits
3807 * outgoing interface MTU. This correction isn't really meaningful for
3809 * oversized LSA, but for consistency the correction is done for both
3812 * P.S. OSPF_MAX_PACKET_SIZE above already includes IP header size
3814 return ospf_packet_new(size
- sizeof(struct ip
));
3817 static void ospf_ls_upd_queue_send(struct ospf_interface
*oi
,
3818 struct list
*update
, struct in_addr addr
)
3820 struct ospf_packet
*op
;
3821 u_int16_t length
= OSPF_HEADER_SIZE
;
3823 if (IS_DEBUG_OSPF_EVENT
)
3824 zlog_debug("listcount = %d, [%s]dst %s", listcount(update
),
3825 IF_NAME(oi
), inet_ntoa(addr
));
3827 op
= ospf_ls_upd_packet_new(update
, oi
);
3829 /* Prepare OSPF common header. */
3830 ospf_make_header(OSPF_MSG_LS_UPD
, oi
, op
->s
);
3832 /* Prepare OSPF Link State Update body.
3833 * Includes Type-7 translation.
3835 length
+= ospf_make_ls_upd(oi
, update
, op
->s
);
3837 /* Fill OSPF header. */
3838 ospf_fill_header(oi
, op
->s
, length
);
3840 /* Set packet length. */
3841 op
->length
= length
;
3843 /* Decide destination address. */
3844 if (oi
->type
== OSPF_IFTYPE_POINTOPOINT
)
3845 op
->dst
.s_addr
= htonl(OSPF_ALLSPFROUTERS
);
3847 op
->dst
.s_addr
= addr
.s_addr
;
3849 /* Add packet to the interface output queue. */
3850 ospf_packet_add(oi
, op
);
3852 /* Hook thread to write packet. */
3853 OSPF_ISM_WRITE_ON(oi
->ospf
);
3856 static int ospf_ls_upd_send_queue_event(struct thread
*thread
)
3858 struct ospf_interface
*oi
= THREAD_ARG(thread
);
3859 struct route_node
*rn
;
3860 struct route_node
*rnext
;
3861 struct list
*update
;
3864 oi
->t_ls_upd_event
= NULL
;
3866 if (IS_DEBUG_OSPF_EVENT
)
3867 zlog_debug("ospf_ls_upd_send_queue start");
3869 for (rn
= route_top(oi
->ls_upd_queue
); rn
; rn
= rnext
) {
3870 rnext
= route_next(rn
);
3872 if (rn
->info
== NULL
)
3875 update
= (struct list
*)rn
->info
;
3877 ospf_ls_upd_queue_send(oi
, update
, rn
->p
.u
.prefix4
);
3879 /* list might not be empty. */
3880 if (listcount(update
) == 0) {
3881 list_delete(rn
->info
);
3883 route_unlock_node(rn
);
3889 if (IS_DEBUG_OSPF_EVENT
)
3891 "ospf_ls_upd_send_queue: update lists not cleared,"
3892 " %d nodes to try again, raising new event",
3894 oi
->t_ls_upd_event
= thread_add_event(
3895 master
, ospf_ls_upd_send_queue_event
, oi
, 0);
3898 if (IS_DEBUG_OSPF_EVENT
)
3899 zlog_debug("ospf_ls_upd_send_queue stop");
3904 void ospf_ls_upd_send(struct ospf_neighbor
*nbr
, struct list
*update
, int flag
)
3906 struct ospf_interface
*oi
;
3907 struct ospf_lsa
*lsa
;
3908 struct prefix_ipv4 p
;
3909 struct route_node
*rn
;
3910 struct listnode
*node
;
3915 p
.prefixlen
= IPV4_MAX_BITLEN
;
3917 /* Decide destination address. */
3918 if (oi
->type
== OSPF_IFTYPE_VIRTUALLINK
)
3919 p
.prefix
= oi
->vl_data
->peer_addr
;
3920 else if (oi
->type
== OSPF_IFTYPE_POINTOPOINT
)
3921 p
.prefix
.s_addr
= htonl(OSPF_ALLSPFROUTERS
);
3922 else if (flag
== OSPF_SEND_PACKET_DIRECT
)
3923 p
.prefix
= nbr
->address
.u
.prefix4
;
3924 else if (oi
->state
== ISM_DR
|| oi
->state
== ISM_Backup
)
3925 p
.prefix
.s_addr
= htonl(OSPF_ALLSPFROUTERS
);
3926 else if (oi
->type
== OSPF_IFTYPE_POINTOMULTIPOINT
)
3927 p
.prefix
.s_addr
= htonl(OSPF_ALLSPFROUTERS
);
3929 p
.prefix
.s_addr
= htonl(OSPF_ALLDROUTERS
);
3931 if (oi
->type
== OSPF_IFTYPE_NBMA
) {
3932 if (flag
== OSPF_SEND_PACKET_INDIRECT
)
3934 "* LS-Update is directly sent on NBMA network.");
3935 if (IPV4_ADDR_SAME(&oi
->address
->u
.prefix4
, &p
.prefix
.s_addr
))
3936 zlog_warn("* LS-Update is sent to myself.");
3939 rn
= route_node_get(oi
->ls_upd_queue
, (struct prefix
*)&p
);
3941 if (rn
->info
== NULL
)
3942 rn
->info
= list_new();
3944 route_unlock_node(rn
);
3946 for (ALL_LIST_ELEMENTS_RO(update
, node
, lsa
))
3947 listnode_add(rn
->info
,
3948 ospf_lsa_lock(lsa
)); /* oi->ls_upd_queue */
3950 if (oi
->t_ls_upd_event
== NULL
)
3951 oi
->t_ls_upd_event
= thread_add_event(
3952 master
, ospf_ls_upd_send_queue_event
, oi
, 0);
3955 static void ospf_ls_ack_send_list(struct ospf_interface
*oi
, struct list
*ack
,
3958 struct ospf_packet
*op
;
3959 u_int16_t length
= OSPF_HEADER_SIZE
;
3961 op
= ospf_packet_new(oi
->ifp
->mtu
);
3963 /* Prepare OSPF common header. */
3964 ospf_make_header(OSPF_MSG_LS_ACK
, oi
, op
->s
);
3966 /* Prepare OSPF Link State Acknowledgment body. */
3967 length
+= ospf_make_ls_ack(oi
, ack
, op
->s
);
3969 /* Fill OSPF header. */
3970 ospf_fill_header(oi
, op
->s
, length
);
3972 /* Set packet length. */
3973 op
->length
= length
;
3975 /* Decide destination address. */
3976 if (oi
->type
== OSPF_IFTYPE_POINTOPOINT
)
3977 op
->dst
.s_addr
= htonl(OSPF_ALLSPFROUTERS
);
3979 op
->dst
.s_addr
= dst
.s_addr
;
3981 /* Add packet to the interface output queue. */
3982 ospf_packet_add(oi
, op
);
3984 /* Hook thread to write packet. */
3985 OSPF_ISM_WRITE_ON(oi
->ospf
);
3988 static int ospf_ls_ack_send_event(struct thread
*thread
)
3990 struct ospf_interface
*oi
= THREAD_ARG(thread
);
3992 oi
->t_ls_ack_direct
= NULL
;
3994 while (listcount(oi
->ls_ack_direct
.ls_ack
))
3995 ospf_ls_ack_send_list(oi
, oi
->ls_ack_direct
.ls_ack
,
3996 oi
->ls_ack_direct
.dst
);
4001 void ospf_ls_ack_send(struct ospf_neighbor
*nbr
, struct ospf_lsa
*lsa
)
4003 struct ospf_interface
*oi
= nbr
->oi
;
4005 if (listcount(oi
->ls_ack_direct
.ls_ack
) == 0)
4006 oi
->ls_ack_direct
.dst
= nbr
->address
.u
.prefix4
;
4008 listnode_add(oi
->ls_ack_direct
.ls_ack
, ospf_lsa_lock(lsa
));
4010 if (oi
->t_ls_ack_direct
== NULL
)
4011 oi
->t_ls_ack_direct
=
4012 thread_add_event(master
, ospf_ls_ack_send_event
, oi
, 0);
4015 /* Send Link State Acknowledgment delayed. */
4016 void ospf_ls_ack_send_delayed(struct ospf_interface
*oi
)
4020 /* Decide destination address. */
4021 /* RFC2328 Section 13.5 On non-broadcast
4022 networks, delayed Link State Acknowledgment packets must be
4023 unicast separately over each adjacency (i.e., neighbor whose
4024 state is >= Exchange). */
4025 if (oi
->type
== OSPF_IFTYPE_NBMA
) {
4026 struct ospf_neighbor
*nbr
;
4027 struct route_node
*rn
;
4029 for (rn
= route_top(oi
->nbrs
); rn
; rn
= route_next(rn
))
4030 if ((nbr
= rn
->info
) != NULL
)
4031 if (nbr
!= oi
->nbr_self
4032 && nbr
->state
>= NSM_Exchange
)
4033 while (listcount(oi
->ls_ack
))
4034 ospf_ls_ack_send_list(
4036 nbr
->address
.u
.prefix4
);
4039 if (oi
->type
== OSPF_IFTYPE_VIRTUALLINK
)
4040 dst
.s_addr
= oi
->vl_data
->peer_addr
.s_addr
;
4041 else if (oi
->state
== ISM_DR
|| oi
->state
== ISM_Backup
)
4042 dst
.s_addr
= htonl(OSPF_ALLSPFROUTERS
);
4043 else if (oi
->type
== OSPF_IFTYPE_POINTOPOINT
)
4044 dst
.s_addr
= htonl(OSPF_ALLSPFROUTERS
);
4045 else if (oi
->type
== OSPF_IFTYPE_POINTOMULTIPOINT
)
4046 dst
.s_addr
= htonl(OSPF_ALLSPFROUTERS
);
4048 dst
.s_addr
= htonl(OSPF_ALLDROUTERS
);
4050 while (listcount(oi
->ls_ack
))
4051 ospf_ls_ack_send_list(oi
, oi
->ls_ack
, dst
);
4055 * On pt-to-pt links, all OSPF control packets are sent to the multicast
4056 * address. As a result, the kernel does not need to learn the interface
4057 * MAC of the OSPF neighbor. However, in our world, this will delay
4058 * convergence. Take the case when due to a link flap, all routes now
4059 * want to use an interface which was deemed to be costlier prior to this
4060 * event. For routes that will be installed, the missing MAC will have
4061 * punt-to-CPU set on them. This may overload the CPU control path that
4062 * can be avoided if the MAC was known apriori.
4064 #define OSPF_PING_NBR_STR_MAX (8 + 40 + 20)
4065 void ospf_proactively_arp(struct ospf_neighbor
*nbr
)
4067 char ping_nbr
[OSPF_PING_NBR_STR_MAX
];
4071 if (!nbr
|| !nbr
->oi
|| !nbr
->oi
->ifp
)
4074 str_ptr
= strcpy(ping_nbr
, "ping -c 1 -I ");
4075 str_ptr
= strcat(str_ptr
, nbr
->oi
->ifp
->name
);
4076 str_ptr
= strcat(str_ptr
, " ");
4077 str_ptr
= strcat(str_ptr
, inet_ntoa(nbr
->address
.u
.prefix4
));
4078 str_ptr
= strcat(str_ptr
, " > /dev/null 2>&1 &");
4079 ret
= system(ping_nbr
);
4080 if (IS_DEBUG_OSPF_EVENT
)
4081 zlog_debug("Executed %s %s", ping_nbr
,
4082 ((ret
== 0) ? "successfully" : "but failed"));