summaryrefslogtreecommitdiff
path: root/ospfd/ospf_packet.c
diff options
context:
space:
mode:
Diffstat (limited to 'ospfd/ospf_packet.c')
-rw-r--r--ospfd/ospf_packet.c104
1 files changed, 49 insertions, 55 deletions
diff --git a/ospfd/ospf_packet.c b/ospfd/ospf_packet.c
index d8456842..08217afd 100644
--- a/ospfd/ospf_packet.c
+++ b/ospfd/ospf_packet.c
@@ -482,22 +482,21 @@ ospf_ls_ack_timer (struct thread *thread)
int
ospf_write (struct thread *thread)
{
+ struct ospf *ospf = THREAD_ARG (thread);
struct ospf_interface *oi;
struct ospf_packet *op;
struct sockaddr_in sa_dst;
- u_char type;
- int ret;
- int flags = 0;
struct ip iph;
struct msghdr msg;
struct iovec iov[2];
- struct ospf *top;
+ u_char type;
+ int ret;
+ int flags = 0;
listnode node;
- top = THREAD_ARG (thread);
- top->t_write = NULL;
+ ospf->t_write = NULL;
- node = listhead (top->oi_write_q);
+ node = listhead (ospf->oi_write_q);
assert (node);
oi = getdata (node);
assert (oi);
@@ -507,9 +506,9 @@ ospf_write (struct thread *thread)
assert (op);
assert (op->length >= OSPF_HEADER_SIZE);
- if (op->dst.s_addr == htonl (OSPF_ALLSPFROUTERS) ||
- op->dst.s_addr == htonl (OSPF_ALLDROUTERS))
- ospf_if_ipmulticast (top, oi->address, oi->ifp->ifindex);
+ if (op->dst.s_addr == htonl (OSPF_ALLSPFROUTERS)
+ || op->dst.s_addr == htonl (OSPF_ALLDROUTERS))
+ ospf_if_ipmulticast (ospf, oi->address, oi->ifp->ifindex);
/* Rewrite the md5 signature & update the seq */
ospf_make_md5_digest (oi, op);
@@ -529,7 +528,7 @@ ospf_write (struct thread *thread)
iph.ip_hl = sizeof (struct ip) >> 2;
iph.ip_v = IPVERSION;
- iph.ip_tos = 0;
+ iph.ip_tos = IPTOS_PREC_INTERNETCONTROL;
#if defined(__NetBSD__) || defined(__FreeBSD__)
iph.ip_len = iph.ip_hl*4 + op->length;
#else
@@ -556,7 +555,7 @@ ospf_write (struct thread *thread)
iov[1].iov_base = STREAM_DATA (op->s);
iov[1].iov_len = op->length;
- ret = sendmsg (top->fd, &msg, flags);
+ ret = sendmsg (ospf->fd, &msg, flags);
if (ret < 0)
zlog_warn ("*** sendmsg in ospf_write failed with %s", strerror (errno));
@@ -589,13 +588,13 @@ ospf_write (struct thread *thread)
if (ospf_fifo_head (oi->obuf) == NULL)
{
oi->on_write_q = 0;
- list_delete_node (top->oi_write_q, node);
+ list_delete_node (ospf->oi_write_q, node);
}
/* If packets still remain in queue, call write thread. */
- if (!list_isempty (top->oi_write_q))
- ospf_top->t_write =
- thread_add_write (master, ospf_write, top, top->fd);
+ if (!list_isempty (ospf->oi_write_q))
+ ospf->t_write =
+ thread_add_write (master, ospf_write, ospf, ospf->fd);
return 0;
}
@@ -617,10 +616,8 @@ ospf_hello (struct ip *iph, struct ospf_header *ospfh,
hello = (struct ospf_hello *) STREAM_PNT (s);
/* If Hello is myself, silently discard. */
- if (IPV4_ADDR_SAME (&ospfh->router_id, &ospf_top->router_id)) {
- zlog_info ("Packet %s [Hello:RECV]: router_id matches our router id");
+ if (IPV4_ADDR_SAME (&ospfh->router_id, &oi->ospf->router_id))
return;
- }
/* If incoming interface is passive one, ignore Hello. */
if (OSPF_IF_PARAM (oi, passive_interface) == OSPF_IF_PASSIVE) {
@@ -681,7 +678,7 @@ ospf_hello (struct ip *iph, struct ospf_header *ospfh,
#endif /* REJECT_IF_TBIT_ON */
#ifdef HAVE_OPAQUE_LSA
- if (CHECK_FLAG (ospf_top->config, OSPF_OPAQUE_CAPABLE)
+ if (CHECK_FLAG (oi->ospf->config, OSPF_OPAQUE_CAPABLE)
&& CHECK_FLAG (hello->options, OSPF_OPTION_O))
{
/*
@@ -823,7 +820,7 @@ ospf_hello (struct ip *iph, struct ospf_header *ospfh,
return;
}
- if (ospf_nbr_bidirectional (&ospf_top->router_id, hello->neighbors,
+ if (ospf_nbr_bidirectional (&oi->ospf->router_id, hello->neighbors,
size - OSPF_HELLO_MIN_SIZE))
{
OSPF_NSM_EVENT_EXECUTE (nbr, NSM_TwoWayReceived);
@@ -1050,7 +1047,7 @@ ospf_db_desc (struct ip *iph, struct ospf_header *ospfh,
#ifdef HAVE_OPAQUE_LSA
if (CHECK_FLAG (dd->options, OSPF_OPTION_O)
- && !CHECK_FLAG (ospf_top->config, OSPF_OPAQUE_CAPABLE))
+ && !CHECK_FLAG (oi->ospf->config, OSPF_OPAQUE_CAPABLE))
{
/*
* This node is not configured to handle O-bit, for now.
@@ -1081,7 +1078,7 @@ ospf_db_desc (struct ip *iph, struct ospf_header *ospfh,
if ((IS_SET_DD_ALL (dd->flags) == OSPF_DD_FLAG_ALL) &&
(size == OSPF_DB_DESC_MIN_SIZE))
{
- if (IPV4_ADDR_CMP (&nbr->router_id, &ospf_top->router_id) > 0)
+ if (IPV4_ADDR_CMP (&nbr->router_id, &oi->ospf->router_id) > 0)
{
/* We're Slave---obey */
zlog_warn ("Packet[DD]: Negotiation done (Slave).");
@@ -1098,7 +1095,7 @@ ospf_db_desc (struct ip *iph, struct ospf_header *ospfh,
/* Ack from the Slave */
else if (!IS_SET_DD_MS (dd->flags) && !IS_SET_DD_I (dd->flags) &&
ntohl (dd->dd_seqnum) == nbr->dd_seqnum &&
- IPV4_ADDR_CMP (&nbr->router_id, &ospf_top->router_id) < 0)
+ IPV4_ADDR_CMP (&nbr->router_id, &oi->ospf->router_id) < 0)
{
zlog_warn ("Packet[DD]: Negotiation done (Master).");
nbr->dd_flags &= ~OSPF_DD_FLAG_I;
@@ -1113,7 +1110,7 @@ ospf_db_desc (struct ip *iph, struct ospf_header *ospfh,
nbr->options = dd->options;
#ifdef HAVE_OPAQUE_LSA
- if (CHECK_FLAG (ospf_top->config, OSPF_OPAQUE_CAPABLE))
+ if (CHECK_FLAG (oi->ospf->config, OSPF_OPAQUE_CAPABLE))
{
if (IS_DEBUG_OSPF_EVENT)
zlog_info ("Neighbor[%s] is %sOpaque-capable.",
@@ -1610,8 +1607,8 @@ ospf_ls_upd (struct ip *iph, struct ospf_header *ospfh,
then take the following actions. */
if (IS_LSA_MAXAGE (lsa) && !current &&
- (ospf_nbr_count (oi->nbrs, NSM_Exchange) +
- ospf_nbr_count (oi->nbrs, NSM_Loading)) == 0)
+ (ospf_nbr_count (oi, NSM_Exchange) +
+ ospf_nbr_count (oi, NSM_Loading)) == 0)
{
/* Response Link State Acknowledgment. */
ospf_ls_ack_send (nbr, lsa);
@@ -1623,7 +1620,7 @@ ospf_ls_upd (struct ip *iph, struct ospf_header *ospfh,
#ifdef HAVE_OPAQUE_LSA
if (IS_OPAQUE_LSA (lsa->data->type)
- && IPV4_ADDR_SAME (&lsa->data->adv_router, &ospf_top->router_id))
+ && IPV4_ADDR_SAME (&lsa->data->adv_router, &oi->ospf->router_id))
{
/*
* Even if initial flushing seems to be completed, there might
@@ -1676,7 +1673,7 @@ ospf_ls_upd (struct ip *iph, struct ospf_header *ospfh,
(ret = ospf_lsa_more_recent (current, lsa)) < 0)
{
/* Actual flooding procedure. */
- if (ospf_flood (nbr, current, lsa) < 0) /* Trap NSSA later. */
+ if (ospf_flood (oi->ospf, nbr, current, lsa) < 0) /* Trap NSSA later. */
DISCARD_LSA (lsa, 4);
continue;
}
@@ -1973,9 +1970,9 @@ ospf_associate_packet_vl (struct interface *ifp, struct ospf_interface *oi,
struct ip *iph, struct ospf_header *ospfh)
{
struct ospf_interface *rcv_oi;
- listnode node;
struct ospf_vl_data *vl_data;
struct ospf_area *vl_area;
+ listnode node;
if (IN_MULTICAST (ntohl (iph->ip_dst.s_addr)) ||
!OSPF_IS_AREA_BACKBONE (ospfh))
@@ -1983,16 +1980,17 @@ ospf_associate_packet_vl (struct interface *ifp, struct ospf_interface *oi,
if ((rcv_oi = oi) == NULL)
{
- if ((rcv_oi = ospf_if_lookup_by_local_addr (ifp, iph->ip_dst)) == NULL)
+ if ((rcv_oi = ospf_if_lookup_by_local_addr (oi->ospf, ifp,
+ iph->ip_dst)) == NULL)
return NULL;
}
- for (node = listhead (ospf_top->vlinks); node; nextnode (node))
+ for (node = listhead (oi->ospf->vlinks); node; nextnode (node))
{
if ((vl_data = getdata (node)) == NULL)
continue;
- vl_area = ospf_area_lookup_by_area_id (vl_data->vl_area_id);
+ vl_area = ospf_area_lookup_by_area_id (oi->ospf, vl_data->vl_area_id);
if (!vl_area)
continue;
@@ -2195,7 +2193,7 @@ ospf_read (struct thread *thread)
{
int ret;
struct stream *ibuf;
- struct ospf *top;
+ struct ospf *ospf;
struct ospf_interface *oi;
struct ip *iph;
struct ospf_header *ospfh;
@@ -2203,25 +2201,25 @@ ospf_read (struct thread *thread)
struct interface *ifp;
/* first of all get interface pointer. */
- top = THREAD_ARG (thread);
- top->t_read = NULL;
+ ospf = THREAD_ARG (thread);
+ ospf->t_read = NULL;
/* read OSPF packet. */
- ibuf = ospf_recv_packet (top->fd, &ifp);
+ ibuf = ospf_recv_packet (ospf->fd, &ifp);
if (ibuf == NULL)
return -1;
iph = (struct ip *) STREAM_DATA (ibuf);
/* prepare for next packet. */
- top->t_read = thread_add_read (master, ospf_read, top, top->fd);
+ ospf->t_read = thread_add_read (master, ospf_read, ospf, ospf->fd);
/* IP Header dump. */
if (IS_DEBUG_OSPF_PACKET(0, RECV))
ospf_ip_header_dump (ibuf);
/* Self-originated packet should be discarded silently. */
- if (ospf_if_lookup_by_local_addr (NULL, iph->ip_src))
+ if (ospf_if_lookup_by_local_addr (ospf, NULL, iph->ip_src))
{
stream_free (ibuf);
return 0;
@@ -2234,7 +2232,7 @@ ospf_read (struct thread *thread)
ospfh = (struct ospf_header *) STREAM_PNT (ibuf);
/* associate packet with ospf interface */
- oi = ospf_if_lookup_recv_interface (iph->ip_src);
+ oi = ospf_if_lookup_recv_if (ospf, iph->ip_src);
if (ifp && oi && oi->ifp != ifp)
{
zlog_warn ("Packet from [%s] received on wrong link %s",
@@ -2336,7 +2334,7 @@ ospf_make_header (int type, struct ospf_interface *oi, struct stream *s)
ospfh->version = (u_char) OSPF_VERSION;
ospfh->type = (u_char) type;
- ospfh->router_id = ospf_top->router_id;
+ ospfh->router_id = oi->ospf->router_id;
ospfh->checksum = 0;
ospfh->area_id = oi->area->area_id;
@@ -2453,25 +2451,21 @@ ospf_make_hello (struct ospf_interface *oi, struct stream *s)
/* Add neighbor seen. */
for (rn = route_top (oi->nbrs); rn; rn = route_next (rn))
- if ((nbr = rn->info) != NULL) {
- /* ignore 0.0.0.0 node. */
- if (nbr->router_id.s_addr != 0)
- if (nbr->state != NSM_Attempt)
- /* ignore Down neighbor. */
- if (nbr->state != NSM_Down)
- /* this is myself for DR election. */
- if (!IPV4_ADDR_SAME (&nbr->router_id, &ospf_top->router_id))
+ if ((nbr = rn->info))
+ if (nbr->router_id.s_addr != 0) /* Ignore 0.0.0.0 node. */
+ if (nbr->state != NSM_Attempt) /* Ignore Down neighbor. */
+ if (nbr->state != NSM_Down) /* This is myself for DR election. */
+ if (!IPV4_ADDR_SAME (&nbr->router_id, &oi->ospf->router_id))
{
/* Check neighbor is sane? */
- if (nbr->d_router.s_addr != 0 &&
- IPV4_ADDR_SAME (&nbr->d_router, &oi->address->u.prefix4) &&
- IPV4_ADDR_SAME (&nbr->bd_router, &oi->address->u.prefix4))
- flag = 0;
+ if (nbr->d_router.s_addr != 0
+ && IPV4_ADDR_SAME (&nbr->d_router, &oi->address->u.prefix4)
+ && IPV4_ADDR_SAME (&nbr->bd_router, &oi->address->u.prefix4))
+ flag = 1;
stream_put_ipv4 (s, nbr->router_id.s_addr);
length += 4;
}
- }
/* Let neighbor generate BackupSeen. */
if (flag == 1)
@@ -2503,7 +2497,7 @@ ospf_make_db_desc (struct ospf_interface *oi, struct ospf_neighbor *nbr,
/* Set Options. */
options = OPTIONS (oi);
#ifdef HAVE_OPAQUE_LSA
- if (CHECK_FLAG (ospf_top->config, OSPF_OPAQUE_CAPABLE))
+ if (CHECK_FLAG (oi->ospf->config, OSPF_OPAQUE_CAPABLE))
{
if (IS_SET_DD_I (nbr->dd_flags)
|| CHECK_FLAG (nbr->options, OSPF_OPTION_O))