mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-07-27 10:04:18 +00:00
Merge pull request #16533 from acooks-at-bda/less-controversial-ospf6d-refactor-before-adding-tlvs
OSPF6: Refactor to prepare for E-LSA handling
This commit is contained in:
commit
3c89cb638f
@ -553,8 +553,7 @@ int ospf6_abr_originate_summary_to_area(struct ospf6_route *route,
|
|||||||
lsa_header = (struct ospf6_lsa_header *)buffer;
|
lsa_header = (struct ospf6_lsa_header *)buffer;
|
||||||
|
|
||||||
if (route->type == OSPF6_DEST_TYPE_ROUTER) {
|
if (route->type == OSPF6_DEST_TYPE_ROUTER) {
|
||||||
router_lsa = (struct ospf6_inter_router_lsa *)
|
router_lsa = lsa_after_header(lsa_header);
|
||||||
ospf6_lsa_header_end(lsa_header);
|
|
||||||
p = (caddr_t)router_lsa + sizeof(struct ospf6_inter_router_lsa);
|
p = (caddr_t)router_lsa + sizeof(struct ospf6_inter_router_lsa);
|
||||||
|
|
||||||
/* Fill Inter-Area-Router-LSA */
|
/* Fill Inter-Area-Router-LSA */
|
||||||
@ -565,8 +564,7 @@ int ospf6_abr_originate_summary_to_area(struct ospf6_route *route,
|
|||||||
router_lsa->router_id = ADV_ROUTER_IN_PREFIX(&route->prefix);
|
router_lsa->router_id = ADV_ROUTER_IN_PREFIX(&route->prefix);
|
||||||
type = htons(OSPF6_LSTYPE_INTER_ROUTER);
|
type = htons(OSPF6_LSTYPE_INTER_ROUTER);
|
||||||
} else {
|
} else {
|
||||||
prefix_lsa = (struct ospf6_inter_prefix_lsa *)
|
prefix_lsa = lsa_after_header(lsa_header);
|
||||||
ospf6_lsa_header_end(lsa_header);
|
|
||||||
p = (caddr_t)prefix_lsa + sizeof(struct ospf6_inter_prefix_lsa);
|
p = (caddr_t)prefix_lsa + sizeof(struct ospf6_inter_prefix_lsa);
|
||||||
|
|
||||||
/* Fill Inter-Area-Prefix-LSA */
|
/* Fill Inter-Area-Prefix-LSA */
|
||||||
@ -1016,8 +1014,7 @@ void ospf6_abr_examin_summary(struct ospf6_lsa *lsa, struct ospf6_area *oa)
|
|||||||
oa->name);
|
oa->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
prefix_lsa = (struct ospf6_inter_prefix_lsa *)
|
prefix_lsa = lsa_after_header(lsa->header);
|
||||||
ospf6_lsa_header_end(lsa->header);
|
|
||||||
prefix.family = AF_INET6;
|
prefix.family = AF_INET6;
|
||||||
prefix.prefixlen = prefix_lsa->prefix.prefix_length;
|
prefix.prefixlen = prefix_lsa->prefix.prefix_length;
|
||||||
ospf6_prefix_in6_addr(&prefix.u.prefix6, prefix_lsa,
|
ospf6_prefix_in6_addr(&prefix.u.prefix6, prefix_lsa,
|
||||||
@ -1036,8 +1033,7 @@ void ospf6_abr_examin_summary(struct ospf6_lsa *lsa, struct ospf6_area *oa)
|
|||||||
oa->name);
|
oa->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
router_lsa = (struct ospf6_inter_router_lsa *)
|
router_lsa = lsa_after_header(lsa->header);
|
||||||
ospf6_lsa_header_end(lsa->header);
|
|
||||||
ospf6_linkstate_prefix(router_lsa->router_id, htonl(0), &prefix);
|
ospf6_linkstate_prefix(router_lsa->router_id, htonl(0), &prefix);
|
||||||
if (is_debug)
|
if (is_debug)
|
||||||
inet_ntop(AF_INET, &router_lsa->router_id, buf,
|
inet_ntop(AF_INET, &router_lsa->router_id, buf,
|
||||||
@ -1429,8 +1425,7 @@ static char *ospf6_inter_area_prefix_lsa_get_prefix_str(struct ospf6_lsa *lsa,
|
|||||||
char tbuf[16];
|
char tbuf[16];
|
||||||
|
|
||||||
if (lsa != NULL) {
|
if (lsa != NULL) {
|
||||||
prefix_lsa = (struct ospf6_inter_prefix_lsa *)
|
prefix_lsa = lsa_after_header(lsa->header);
|
||||||
ospf6_lsa_header_end(lsa->header);
|
|
||||||
|
|
||||||
ospf6_prefix_in6_addr(&in6, prefix_lsa, &prefix_lsa->prefix);
|
ospf6_prefix_in6_addr(&in6, prefix_lsa, &prefix_lsa->prefix);
|
||||||
if (buf) {
|
if (buf) {
|
||||||
@ -1452,8 +1447,7 @@ static int ospf6_inter_area_prefix_lsa_show(struct vty *vty,
|
|||||||
struct ospf6_inter_prefix_lsa *prefix_lsa;
|
struct ospf6_inter_prefix_lsa *prefix_lsa;
|
||||||
char buf[INET6_ADDRSTRLEN];
|
char buf[INET6_ADDRSTRLEN];
|
||||||
|
|
||||||
prefix_lsa = (struct ospf6_inter_prefix_lsa *)ospf6_lsa_header_end(
|
prefix_lsa = lsa_after_header(lsa->header);
|
||||||
lsa->header);
|
|
||||||
|
|
||||||
if (use_json) {
|
if (use_json) {
|
||||||
json_object_int_add(
|
json_object_int_add(
|
||||||
@ -1489,9 +1483,7 @@ static char *ospf6_inter_area_router_lsa_get_prefix_str(struct ospf6_lsa *lsa,
|
|||||||
struct ospf6_inter_router_lsa *router_lsa;
|
struct ospf6_inter_router_lsa *router_lsa;
|
||||||
|
|
||||||
if (lsa != NULL) {
|
if (lsa != NULL) {
|
||||||
router_lsa = (struct ospf6_inter_router_lsa *)
|
router_lsa = lsa_after_header(lsa->header);
|
||||||
ospf6_lsa_header_end(lsa->header);
|
|
||||||
|
|
||||||
|
|
||||||
if (buf)
|
if (buf)
|
||||||
inet_ntop(AF_INET, &router_lsa->router_id, buf, buflen);
|
inet_ntop(AF_INET, &router_lsa->router_id, buf, buflen);
|
||||||
@ -1508,8 +1500,7 @@ static int ospf6_inter_area_router_lsa_show(struct vty *vty,
|
|||||||
struct ospf6_inter_router_lsa *router_lsa;
|
struct ospf6_inter_router_lsa *router_lsa;
|
||||||
char buf[64];
|
char buf[64];
|
||||||
|
|
||||||
router_lsa = (struct ospf6_inter_router_lsa *)ospf6_lsa_header_end(
|
router_lsa = lsa_after_header(lsa->header);
|
||||||
lsa->header);
|
|
||||||
|
|
||||||
ospf6_options_printbuf(router_lsa->options, buf, sizeof(buf));
|
ospf6_options_printbuf(router_lsa->options, buf, sizeof(buf));
|
||||||
if (use_json) {
|
if (use_json) {
|
||||||
|
@ -17,22 +17,6 @@ extern unsigned char conf_debug_ospf6_abr;
|
|||||||
#define OSPF6_DEBUG_ABR_OFF() (conf_debug_ospf6_abr = 0)
|
#define OSPF6_DEBUG_ABR_OFF() (conf_debug_ospf6_abr = 0)
|
||||||
#define IS_OSPF6_DEBUG_ABR (conf_debug_ospf6_abr)
|
#define IS_OSPF6_DEBUG_ABR (conf_debug_ospf6_abr)
|
||||||
|
|
||||||
/* Inter-Area-Prefix-LSA */
|
|
||||||
#define OSPF6_INTER_PREFIX_LSA_MIN_SIZE 4U /* w/o IPv6 prefix */
|
|
||||||
struct ospf6_inter_prefix_lsa {
|
|
||||||
uint32_t metric;
|
|
||||||
struct ospf6_prefix prefix;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Inter-Area-Router-LSA */
|
|
||||||
#define OSPF6_INTER_ROUTER_LSA_FIX_SIZE 12U
|
|
||||||
struct ospf6_inter_router_lsa {
|
|
||||||
uint8_t mbz;
|
|
||||||
uint8_t options[3];
|
|
||||||
uint32_t metric;
|
|
||||||
uint32_t router_id;
|
|
||||||
};
|
|
||||||
|
|
||||||
#define OSPF6_ABR_SUMMARY_METRIC(E) \
|
#define OSPF6_ABR_SUMMARY_METRIC(E) \
|
||||||
(ntohl((E)->metric & htonl(OSPF6_EXT_PATH_METRIC_MAX)))
|
(ntohl((E)->metric & htonl(OSPF6_EXT_PATH_METRIC_MAX)))
|
||||||
#define OSPF6_ABR_SUMMARY_METRIC_SET(E, C) \
|
#define OSPF6_ABR_SUMMARY_METRIC_SET(E, C) \
|
||||||
|
@ -39,6 +39,7 @@
|
|||||||
#include "ospf6d.h"
|
#include "ospf6d.h"
|
||||||
#include "ospf6_spf.h"
|
#include "ospf6_spf.h"
|
||||||
#include "ospf6_nssa.h"
|
#include "ospf6_nssa.h"
|
||||||
|
#include "ospf6_tlv.h"
|
||||||
#include "ospf6_gr.h"
|
#include "ospf6_gr.h"
|
||||||
#include "lib/json.h"
|
#include "lib/json.h"
|
||||||
|
|
||||||
@ -102,8 +103,7 @@ struct ospf6_lsa *ospf6_as_external_lsa_originate(struct ospf6_route *route,
|
|||||||
/* prepare buffer */
|
/* prepare buffer */
|
||||||
memset(buffer, 0, sizeof(buffer));
|
memset(buffer, 0, sizeof(buffer));
|
||||||
lsa_header = (struct ospf6_lsa_header *)buffer;
|
lsa_header = (struct ospf6_lsa_header *)buffer;
|
||||||
as_external_lsa = (struct ospf6_as_external_lsa *)ospf6_lsa_header_end(
|
as_external_lsa = lsa_after_header(lsa_header);
|
||||||
lsa_header);
|
|
||||||
p = (caddr_t)((caddr_t)as_external_lsa
|
p = (caddr_t)((caddr_t)as_external_lsa
|
||||||
+ sizeof(struct ospf6_as_external_lsa));
|
+ sizeof(struct ospf6_as_external_lsa));
|
||||||
|
|
||||||
@ -216,8 +216,7 @@ static route_tag_t ospf6_as_external_lsa_get_tag(struct ospf6_lsa *lsa)
|
|||||||
if (!lsa)
|
if (!lsa)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
external = (struct ospf6_as_external_lsa *)ospf6_lsa_header_end(
|
external = lsa_after_header(lsa->header);
|
||||||
lsa->header);
|
|
||||||
|
|
||||||
if (!CHECK_FLAG(external->bits_metric, OSPF6_ASBR_BIT_T))
|
if (!CHECK_FLAG(external->bits_metric, OSPF6_ASBR_BIT_T))
|
||||||
return 0;
|
return 0;
|
||||||
@ -520,8 +519,7 @@ void ospf6_asbr_lsa_add(struct ospf6_lsa *lsa)
|
|||||||
type = ntohs(lsa->header->type);
|
type = ntohs(lsa->header->type);
|
||||||
oa = lsa->lsdb->data;
|
oa = lsa->lsdb->data;
|
||||||
|
|
||||||
external = (struct ospf6_as_external_lsa *)ospf6_lsa_header_end(
|
external = lsa_after_header(lsa->header);
|
||||||
lsa->header);
|
|
||||||
|
|
||||||
if (IS_OSPF6_DEBUG_EXAMIN(AS_EXTERNAL))
|
if (IS_OSPF6_DEBUG_EXAMIN(AS_EXTERNAL))
|
||||||
zlog_debug("Calculate AS-External route for %s", lsa->name);
|
zlog_debug("Calculate AS-External route for %s", lsa->name);
|
||||||
@ -725,8 +723,7 @@ void ospf6_asbr_lsa_remove(struct ospf6_lsa *lsa,
|
|||||||
int type;
|
int type;
|
||||||
bool debug = false;
|
bool debug = false;
|
||||||
|
|
||||||
external = (struct ospf6_as_external_lsa *)ospf6_lsa_header_end(
|
external = lsa_after_header(lsa->header);
|
||||||
lsa->header);
|
|
||||||
|
|
||||||
if (IS_OSPF6_DEBUG_EXAMIN(AS_EXTERNAL) || (IS_OSPF6_DEBUG_NSSA))
|
if (IS_OSPF6_DEBUG_EXAMIN(AS_EXTERNAL) || (IS_OSPF6_DEBUG_NSSA))
|
||||||
debug = true;
|
debug = true;
|
||||||
@ -2424,8 +2421,7 @@ static char *ospf6_as_external_lsa_get_prefix_str(struct ospf6_lsa *lsa,
|
|||||||
char tbuf[16];
|
char tbuf[16];
|
||||||
|
|
||||||
if (lsa) {
|
if (lsa) {
|
||||||
external = (struct ospf6_as_external_lsa *)ospf6_lsa_header_end(
|
external = lsa_after_header(lsa->header);
|
||||||
lsa->header);
|
|
||||||
|
|
||||||
if (pos == 0) {
|
if (pos == 0) {
|
||||||
ospf6_prefix_in6_addr(&in6, external,
|
ospf6_prefix_in6_addr(&in6, external,
|
||||||
@ -2459,8 +2455,7 @@ static int ospf6_as_external_lsa_show(struct vty *vty, struct ospf6_lsa *lsa,
|
|||||||
char buf[64];
|
char buf[64];
|
||||||
|
|
||||||
assert(lsa->header);
|
assert(lsa->header);
|
||||||
external = (struct ospf6_as_external_lsa *)ospf6_lsa_header_end(
|
external = lsa_after_header(lsa->header);
|
||||||
lsa->header);
|
|
||||||
|
|
||||||
/* bits */
|
/* bits */
|
||||||
snprintf(buf, sizeof(buf), "%c%c%c",
|
snprintf(buf, sizeof(buf), "%c%c%c",
|
||||||
@ -3027,8 +3022,7 @@ ospf6_originate_summary_lsa(struct ospf6 *ospf6,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
external = (struct ospf6_as_external_lsa *)ospf6_lsa_header_end(
|
external = lsa_after_header(aggr_lsa->header);
|
||||||
aggr_lsa->header);
|
|
||||||
metric = (unsigned long)OSPF6_ASBR_METRIC(external);
|
metric = (unsigned long)OSPF6_ASBR_METRIC(external);
|
||||||
tag = ospf6_as_external_lsa_get_tag(aggr_lsa);
|
tag = ospf6_as_external_lsa_get_tag(aggr_lsa);
|
||||||
mtype = CHECK_FLAG(external->bits_metric,
|
mtype = CHECK_FLAG(external->bits_metric,
|
||||||
@ -3176,7 +3170,7 @@ ospf6_handle_external_aggr_modify(struct ospf6 *ospf6,
|
|||||||
return OSPF6_FAILURE;
|
return OSPF6_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
asel = (struct ospf6_as_external_lsa *)ospf6_lsa_header_end(lsa->header);
|
asel = lsa_after_header(lsa->header);
|
||||||
metric = (unsigned long)OSPF6_ASBR_METRIC(asel);
|
metric = (unsigned long)OSPF6_ASBR_METRIC(asel);
|
||||||
tag = ospf6_as_external_lsa_get_tag(lsa);
|
tag = ospf6_as_external_lsa_get_tag(lsa);
|
||||||
mtype = CHECK_FLAG(asel->bits_metric,
|
mtype = CHECK_FLAG(asel->bits_metric,
|
||||||
@ -3365,8 +3359,7 @@ static void ospf6_handle_aggregated_exnl_rt(struct ospf6 *ospf6,
|
|||||||
lsa = ospf6_lsdb_lookup(htons(OSPF6_LSTYPE_AS_EXTERNAL),
|
lsa = ospf6_lsdb_lookup(htons(OSPF6_LSTYPE_AS_EXTERNAL),
|
||||||
htonl(info->id), ospf6->router_id, ospf6->lsdb);
|
htonl(info->id), ospf6->router_id, ospf6->lsdb);
|
||||||
if (lsa) {
|
if (lsa) {
|
||||||
ext_lsa = (struct ospf6_as_external_lsa *)ospf6_lsa_header_end(
|
ext_lsa = lsa_after_header(lsa->header);
|
||||||
lsa->header);
|
|
||||||
|
|
||||||
if (rt->prefix.prefixlen != ext_lsa->prefix.prefix_length)
|
if (rt->prefix.prefixlen != ext_lsa->prefix.prefix_length)
|
||||||
return;
|
return;
|
||||||
|
@ -79,17 +79,6 @@ struct ospf6_external_aggr_rt {
|
|||||||
struct hash *match_extnl_hash;
|
struct hash *match_extnl_hash;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* AS-External-LSA */
|
|
||||||
#define OSPF6_AS_EXTERNAL_LSA_MIN_SIZE 4U /* w/o IPv6 prefix */
|
|
||||||
struct ospf6_as_external_lsa {
|
|
||||||
uint32_t bits_metric;
|
|
||||||
|
|
||||||
struct ospf6_prefix prefix;
|
|
||||||
/* followed by none or one forwarding address */
|
|
||||||
/* followed by none or one external route tag */
|
|
||||||
/* followed by none or one referenced LS-ID */
|
|
||||||
};
|
|
||||||
|
|
||||||
#define OSPF6_ASBR_BIT_T ntohl (0x01000000)
|
#define OSPF6_ASBR_BIT_T ntohl (0x01000000)
|
||||||
#define OSPF6_ASBR_BIT_F ntohl (0x02000000)
|
#define OSPF6_ASBR_BIT_F ntohl (0x02000000)
|
||||||
#define OSPF6_ASBR_BIT_E ntohl (0x04000000)
|
#define OSPF6_ASBR_BIT_E ntohl (0x04000000)
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
|
|
||||||
#include "ospf6_flood.h"
|
#include "ospf6_flood.h"
|
||||||
#include "ospf6_nssa.h"
|
#include "ospf6_nssa.h"
|
||||||
|
#include "ospf6_tlv.h"
|
||||||
#include "ospf6_gr.h"
|
#include "ospf6_gr.h"
|
||||||
|
|
||||||
unsigned char conf_debug_ospf6_flooding;
|
unsigned char conf_debug_ospf6_flooding;
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
#include "printfrr.h"
|
#include "printfrr.h"
|
||||||
#include "lib_errors.h"
|
#include "lib_errors.h"
|
||||||
|
|
||||||
|
#include "ospf6_proto.h"
|
||||||
#include "ospf6d/ospf6_lsa.h"
|
#include "ospf6d/ospf6_lsa.h"
|
||||||
#include "ospf6d/ospf6_lsdb.h"
|
#include "ospf6d/ospf6_lsdb.h"
|
||||||
#include "ospf6d/ospf6_route.h"
|
#include "ospf6d/ospf6_route.h"
|
||||||
@ -30,6 +31,7 @@
|
|||||||
#include "ospf6d/ospf6_flood.h"
|
#include "ospf6d/ospf6_flood.h"
|
||||||
#include "ospf6d/ospf6_intra.h"
|
#include "ospf6d/ospf6_intra.h"
|
||||||
#include "ospf6d/ospf6_spf.h"
|
#include "ospf6d/ospf6_spf.h"
|
||||||
|
#include "ospf6d/ospf6_tlv.h"
|
||||||
#include "ospf6d/ospf6_gr.h"
|
#include "ospf6d/ospf6_gr.h"
|
||||||
#include "ospf6d/ospf6_gr_clippy.c"
|
#include "ospf6d/ospf6_gr_clippy.c"
|
||||||
|
|
||||||
@ -54,16 +56,17 @@ static int ospf6_gr_lsa_originate(struct ospf6_interface *oi,
|
|||||||
/* prepare buffer */
|
/* prepare buffer */
|
||||||
memset(buffer, 0, sizeof(buffer));
|
memset(buffer, 0, sizeof(buffer));
|
||||||
lsa_header = (struct ospf6_lsa_header *)buffer;
|
lsa_header = (struct ospf6_lsa_header *)buffer;
|
||||||
grace_lsa = (struct ospf6_grace_lsa *)ospf6_lsa_header_end(lsa_header);
|
grace_lsa = lsa_after_header(lsa_header);
|
||||||
|
|
||||||
/* Put grace period. */
|
/* Put grace period. */
|
||||||
grace_lsa->tlv_period.header.type = htons(GRACE_PERIOD_TYPE);
|
grace_lsa->tlv_period.header.type = htons(TLV_GRACE_PERIOD_TYPE);
|
||||||
grace_lsa->tlv_period.header.length = htons(GRACE_PERIOD_LENGTH);
|
grace_lsa->tlv_period.header.length = htons(TLV_GRACE_PERIOD_LENGTH);
|
||||||
grace_lsa->tlv_period.interval = htonl(gr_info->grace_period);
|
grace_lsa->tlv_period.interval = htonl(gr_info->grace_period);
|
||||||
|
|
||||||
/* Put restart reason. */
|
/* Put restart reason. */
|
||||||
grace_lsa->tlv_reason.header.type = htons(RESTART_REASON_TYPE);
|
grace_lsa->tlv_reason.header.type = htons(TLV_GRACE_RESTART_REASON_TYPE);
|
||||||
grace_lsa->tlv_reason.header.length = htons(RESTART_REASON_LENGTH);
|
grace_lsa->tlv_reason.header.length =
|
||||||
|
htons(TLV_GRACE_RESTART_REASON_LENGTH);
|
||||||
grace_lsa->tlv_reason.reason = reason;
|
grace_lsa->tlv_reason.reason = reason;
|
||||||
|
|
||||||
/* Fill LSA Header */
|
/* Fill LSA Header */
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
/*
|
/*
|
||||||
* OSPF6 Graceful Retsart helper functions.
|
* OSPF6 Graceful Restart helper functions.
|
||||||
|
* Ref RFC 5187
|
||||||
*
|
*
|
||||||
* Copyright (C) 2021-22 Vmware, Inc.
|
* Copyright (C) 2021-22 Vmware, Inc.
|
||||||
* Rajesh Kumar Girada
|
* Rajesh Kumar Girada
|
||||||
@ -60,58 +61,16 @@ enum ospf6_gr_helper_rejected_reason {
|
|||||||
OSPF6_HELPER_RESTARTING,
|
OSPF6_HELPER_RESTARTING,
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef roundup
|
|
||||||
#define ROUNDUP(val, gran) roundup(val, gran)
|
|
||||||
#else /* roundup */
|
|
||||||
#define ROUNDUP(val, gran) (((val)-1 | (gran)-1) + 1)
|
|
||||||
#endif /* roundup */
|
|
||||||
|
|
||||||
/*
|
#define GRACE_PERIOD_TLV_SIZE sizeof(struct tlv_grace_period)
|
||||||
* Generic TLV (type, length, value) macros
|
#define GRACE_RESTART_REASON_TLV_SIZE sizeof(struct tlv_grace_restart_reason)
|
||||||
*/
|
|
||||||
struct tlv_header {
|
|
||||||
uint16_t type; /* Type of Value */
|
|
||||||
uint16_t length; /* Length of Value portion only, in bytes */
|
|
||||||
};
|
|
||||||
|
|
||||||
#define TLV_HDR_SIZE (sizeof(struct tlv_header))
|
|
||||||
|
|
||||||
#define TLV_BODY_SIZE(tlvh) (ROUNDUP(ntohs((tlvh)->length), sizeof(uint32_t)))
|
|
||||||
|
|
||||||
#define TLV_SIZE(tlvh) (uint32_t)(TLV_HDR_SIZE + TLV_BODY_SIZE(tlvh))
|
|
||||||
|
|
||||||
#define TLV_HDR_TOP(lsah) \
|
|
||||||
(struct tlv_header *)((char *)(lsah) + OSPF6_LSA_HEADER_SIZE)
|
|
||||||
|
|
||||||
#define TLV_HDR_NEXT(tlvh) \
|
|
||||||
(struct tlv_header *)((char *)(tlvh) + TLV_SIZE(tlvh))
|
|
||||||
|
|
||||||
/* Ref RFC5187 appendix-A */
|
|
||||||
/* Grace period TLV */
|
|
||||||
#define GRACE_PERIOD_TYPE 1
|
|
||||||
#define GRACE_PERIOD_LENGTH 4
|
|
||||||
struct grace_tlv_graceperiod {
|
|
||||||
struct tlv_header header;
|
|
||||||
uint32_t interval;
|
|
||||||
};
|
|
||||||
#define GRACE_PERIOD_TLV_SIZE sizeof(struct grace_tlv_graceperiod)
|
|
||||||
|
|
||||||
/* Restart reason TLV */
|
|
||||||
#define RESTART_REASON_TYPE 2
|
|
||||||
#define RESTART_REASON_LENGTH 1
|
|
||||||
struct grace_tlv_restart_reason {
|
|
||||||
struct tlv_header header;
|
|
||||||
uint8_t reason;
|
|
||||||
uint8_t reserved[3];
|
|
||||||
};
|
|
||||||
#define GRACE_RESTART_REASON_TLV_SIZE sizeof(struct grace_tlv_restart_reason)
|
|
||||||
|
|
||||||
#define OSPF6_GRACE_LSA_MIN_SIZE \
|
#define OSPF6_GRACE_LSA_MIN_SIZE \
|
||||||
GRACE_PERIOD_TLV_SIZE + GRACE_RESTART_REASON_TLV_SIZE
|
GRACE_PERIOD_TLV_SIZE + GRACE_RESTART_REASON_TLV_SIZE
|
||||||
|
|
||||||
struct ospf6_grace_lsa {
|
struct ospf6_grace_lsa {
|
||||||
struct grace_tlv_graceperiod tlv_period;
|
struct tlv_grace_period tlv_period;
|
||||||
struct grace_tlv_restart_reason tlv_reason;
|
struct tlv_grace_restart_reason tlv_reason;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct advRtr {
|
struct advRtr {
|
||||||
|
@ -32,6 +32,7 @@
|
|||||||
#include "ospf6_neighbor.h"
|
#include "ospf6_neighbor.h"
|
||||||
#include "ospf6_intra.h"
|
#include "ospf6_intra.h"
|
||||||
#include "ospf6d.h"
|
#include "ospf6d.h"
|
||||||
|
#include "ospf6_tlv.h"
|
||||||
#include "ospf6_gr.h"
|
#include "ospf6_gr.h"
|
||||||
#include "lib/json.h"
|
#include "lib/json.h"
|
||||||
#include "ospf6d/ospf6_gr_helper_clippy.c"
|
#include "ospf6d/ospf6_gr_helper_clippy.c"
|
||||||
@ -129,8 +130,8 @@ static int ospf6_extract_grace_lsa_fields(struct ospf6_lsa *lsa,
|
|||||||
{
|
{
|
||||||
struct ospf6_lsa_header *lsah = NULL;
|
struct ospf6_lsa_header *lsah = NULL;
|
||||||
struct tlv_header *tlvh = NULL;
|
struct tlv_header *tlvh = NULL;
|
||||||
struct grace_tlv_graceperiod *gracePeriod;
|
struct tlv_grace_period *gracePeriod;
|
||||||
struct grace_tlv_restart_reason *grReason;
|
struct tlv_grace_restart_reason *grReason;
|
||||||
uint16_t length = 0;
|
uint16_t length = 0;
|
||||||
int sum = 0;
|
int sum = 0;
|
||||||
|
|
||||||
@ -144,9 +145,8 @@ static int ospf6_extract_grace_lsa_fields(struct ospf6_lsa *lsa,
|
|||||||
|
|
||||||
length = ntohs(lsah->length) - OSPF6_LSA_HEADER_SIZE;
|
length = ntohs(lsah->length) - OSPF6_LSA_HEADER_SIZE;
|
||||||
|
|
||||||
for (tlvh = TLV_HDR_TOP(lsah); sum < length && tlvh;
|
for (tlvh = lsdesc_start(lsah); sum < length && tlvh;
|
||||||
tlvh = TLV_HDR_NEXT(tlvh)) {
|
tlvh = TLV_HDR_NEXT(tlvh)) {
|
||||||
|
|
||||||
/* Check TLV len against overall LSA */
|
/* Check TLV len against overall LSA */
|
||||||
if (sum + TLV_SIZE(tlvh) > length) {
|
if (sum + TLV_SIZE(tlvh) > length) {
|
||||||
if (IS_DEBUG_OSPF6_GR)
|
if (IS_DEBUG_OSPF6_GR)
|
||||||
@ -157,8 +157,8 @@ static int ospf6_extract_grace_lsa_fields(struct ospf6_lsa *lsa,
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch (ntohs(tlvh->type)) {
|
switch (ntohs(tlvh->type)) {
|
||||||
case GRACE_PERIOD_TYPE:
|
case TLV_GRACE_PERIOD_TYPE:
|
||||||
gracePeriod = (struct grace_tlv_graceperiod *)tlvh;
|
gracePeriod = (struct tlv_grace_period *)tlvh;
|
||||||
*interval = ntohl(gracePeriod->interval);
|
*interval = ntohl(gracePeriod->interval);
|
||||||
sum += TLV_SIZE(tlvh);
|
sum += TLV_SIZE(tlvh);
|
||||||
|
|
||||||
@ -167,8 +167,8 @@ static int ospf6_extract_grace_lsa_fields(struct ospf6_lsa *lsa,
|
|||||||
|| *interval < OSPF6_MIN_GRACE_INTERVAL)
|
|| *interval < OSPF6_MIN_GRACE_INTERVAL)
|
||||||
return OSPF6_FAILURE;
|
return OSPF6_FAILURE;
|
||||||
break;
|
break;
|
||||||
case RESTART_REASON_TYPE:
|
case TLV_GRACE_RESTART_REASON_TYPE:
|
||||||
grReason = (struct grace_tlv_restart_reason *)tlvh;
|
grReason = (struct tlv_grace_restart_reason *)tlvh;
|
||||||
*reason = grReason->reason;
|
*reason = grReason->reason;
|
||||||
sum += TLV_SIZE(tlvh);
|
sum += TLV_SIZE(tlvh);
|
||||||
|
|
||||||
@ -1218,8 +1218,8 @@ static int ospf6_grace_lsa_show_info(struct vty *vty, struct ospf6_lsa *lsa,
|
|||||||
{
|
{
|
||||||
struct ospf6_lsa_header *lsah = NULL;
|
struct ospf6_lsa_header *lsah = NULL;
|
||||||
struct tlv_header *tlvh = NULL;
|
struct tlv_header *tlvh = NULL;
|
||||||
struct grace_tlv_graceperiod *gracePeriod;
|
struct tlv_grace_period *gracePeriod;
|
||||||
struct grace_tlv_restart_reason *grReason;
|
struct tlv_grace_restart_reason *grReason;
|
||||||
uint16_t length = 0;
|
uint16_t length = 0;
|
||||||
int sum = 0;
|
int sum = 0;
|
||||||
|
|
||||||
@ -1240,9 +1240,8 @@ static int ospf6_grace_lsa_show_info(struct vty *vty, struct ospf6_lsa *lsa,
|
|||||||
zlog_debug(" TLV info:");
|
zlog_debug(" TLV info:");
|
||||||
}
|
}
|
||||||
|
|
||||||
for (tlvh = TLV_HDR_TOP(lsah); sum < length && tlvh;
|
for (tlvh = lsdesc_start(lsah); sum < length && tlvh;
|
||||||
tlvh = TLV_HDR_NEXT(tlvh)) {
|
tlvh = TLV_HDR_NEXT(tlvh)) {
|
||||||
|
|
||||||
/* Check TLV len */
|
/* Check TLV len */
|
||||||
if (sum + TLV_SIZE(tlvh) > length) {
|
if (sum + TLV_SIZE(tlvh) > length) {
|
||||||
if (vty)
|
if (vty)
|
||||||
@ -1255,8 +1254,8 @@ static int ospf6_grace_lsa_show_info(struct vty *vty, struct ospf6_lsa *lsa,
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch (ntohs(tlvh->type)) {
|
switch (ntohs(tlvh->type)) {
|
||||||
case GRACE_PERIOD_TYPE:
|
case TLV_GRACE_PERIOD_TYPE:
|
||||||
gracePeriod = (struct grace_tlv_graceperiod *)tlvh;
|
gracePeriod = (struct tlv_grace_period *)tlvh;
|
||||||
sum += TLV_SIZE(tlvh);
|
sum += TLV_SIZE(tlvh);
|
||||||
|
|
||||||
if (vty) {
|
if (vty) {
|
||||||
@ -1272,8 +1271,8 @@ static int ospf6_grace_lsa_show_info(struct vty *vty, struct ospf6_lsa *lsa,
|
|||||||
ntohl(gracePeriod->interval));
|
ntohl(gracePeriod->interval));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case RESTART_REASON_TYPE:
|
case TLV_GRACE_RESTART_REASON_TYPE:
|
||||||
grReason = (struct grace_tlv_restart_reason *)tlvh;
|
grReason = (struct tlv_grace_restart_reason *)tlvh;
|
||||||
sum += TLV_SIZE(tlvh);
|
sum += TLV_SIZE(tlvh);
|
||||||
if (vty) {
|
if (vty) {
|
||||||
if (use_json)
|
if (use_json)
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
#include "plist.h"
|
#include "plist.h"
|
||||||
#include "zclient.h"
|
#include "zclient.h"
|
||||||
|
|
||||||
|
#include "ospf6_proto.h"
|
||||||
#include "ospf6_lsa.h"
|
#include "ospf6_lsa.h"
|
||||||
#include "ospf6_lsdb.h"
|
#include "ospf6_lsdb.h"
|
||||||
#include "ospf6_top.h"
|
#include "ospf6_top.h"
|
||||||
@ -30,9 +31,9 @@
|
|||||||
#include "ospf6d.h"
|
#include "ospf6d.h"
|
||||||
#include "ospf6_bfd.h"
|
#include "ospf6_bfd.h"
|
||||||
#include "ospf6_zebra.h"
|
#include "ospf6_zebra.h"
|
||||||
|
#include "ospf6_tlv.h"
|
||||||
#include "ospf6_gr.h"
|
#include "ospf6_gr.h"
|
||||||
#include "lib/json.h"
|
#include "lib/json.h"
|
||||||
#include "ospf6_proto.h"
|
|
||||||
#include "lib/keychain.h"
|
#include "lib/keychain.h"
|
||||||
#include "ospf6_auth_trailer.h"
|
#include "ospf6_auth_trailer.h"
|
||||||
#include "ospf6d/ospf6_interface_clippy.c"
|
#include "ospf6d/ospf6_interface_clippy.c"
|
||||||
|
@ -32,6 +32,7 @@
|
|||||||
#include "ospf6_flood.h"
|
#include "ospf6_flood.h"
|
||||||
#include "ospf6d.h"
|
#include "ospf6d.h"
|
||||||
#include "ospf6_spf.h"
|
#include "ospf6_spf.h"
|
||||||
|
#include "ospf6_tlv.h"
|
||||||
#include "ospf6_gr.h"
|
#include "ospf6_gr.h"
|
||||||
|
|
||||||
unsigned char conf_debug_ospf6_brouter = 0;
|
unsigned char conf_debug_ospf6_brouter = 0;
|
||||||
@ -43,41 +44,20 @@ uint32_t conf_debug_ospf6_brouter_specific_area_id;
|
|||||||
/* RFC2740 3.4.3.1 Router-LSA */
|
/* RFC2740 3.4.3.1 Router-LSA */
|
||||||
/******************************/
|
/******************************/
|
||||||
|
|
||||||
|
/* OSPF6_LSTYPE_ROUTER */
|
||||||
static char *ospf6_router_lsa_get_nbr_id(struct ospf6_lsa *lsa, char *buf,
|
static char *ospf6_router_lsa_get_nbr_id(struct ospf6_lsa *lsa, char *buf,
|
||||||
int buflen, int pos)
|
int buflen, int pos)
|
||||||
{
|
{
|
||||||
struct ospf6_router_lsa *router_lsa;
|
|
||||||
struct ospf6_router_lsdesc *lsdesc;
|
|
||||||
char *start, *end;
|
|
||||||
char buf1[INET_ADDRSTRLEN], buf2[INET_ADDRSTRLEN];
|
char buf1[INET_ADDRSTRLEN], buf2[INET_ADDRSTRLEN];
|
||||||
|
struct ospf6_router_lsdesc *lsdesc = nth_lsdesc(lsa->header, pos);
|
||||||
|
|
||||||
if (lsa) {
|
if (!lsdesc || !buf || buflen < (2 + 2 * INET_ADDRSTRLEN))
|
||||||
router_lsa = (struct ospf6_router_lsa
|
|
||||||
*)((char *)lsa->header
|
|
||||||
+ sizeof(struct ospf6_lsa_header));
|
|
||||||
start = (char *)router_lsa + sizeof(struct ospf6_router_lsa);
|
|
||||||
end = (char *)lsa->header + ntohs(lsa->header->length);
|
|
||||||
|
|
||||||
lsdesc = (struct ospf6_router_lsdesc
|
|
||||||
*)(start
|
|
||||||
+ pos * (sizeof(struct
|
|
||||||
ospf6_router_lsdesc)));
|
|
||||||
if ((char *)lsdesc + sizeof(struct ospf6_router_lsdesc)
|
|
||||||
<= end) {
|
|
||||||
if (buf && (buflen > INET_ADDRSTRLEN * 2)) {
|
|
||||||
inet_ntop(AF_INET,
|
|
||||||
&lsdesc->neighbor_interface_id, buf1,
|
|
||||||
sizeof(buf1));
|
|
||||||
inet_ntop(AF_INET, &lsdesc->neighbor_router_id,
|
|
||||||
buf2, sizeof(buf2));
|
|
||||||
snprintf(buf, buflen, "%s/%s", buf2, buf1);
|
|
||||||
|
|
||||||
return buf;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
inet_ntop(AF_INET, &lsdesc->neighbor_interface_id, buf1, sizeof(buf1));
|
||||||
|
inet_ntop(AF_INET, &lsdesc->neighbor_router_id, buf2, sizeof(buf2));
|
||||||
|
snprintf(buf, buflen, "%s/%s", buf2, buf1);
|
||||||
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ospf6_router_lsa_show(struct vty *vty, struct ospf6_lsa *lsa,
|
static int ospf6_router_lsa_show(struct vty *vty, struct ospf6_lsa *lsa,
|
||||||
@ -195,9 +175,7 @@ int ospf6_router_is_stub_router(struct ospf6_lsa *lsa)
|
|||||||
struct ospf6_router_lsa *rtr_lsa;
|
struct ospf6_router_lsa *rtr_lsa;
|
||||||
|
|
||||||
if (lsa != NULL && OSPF6_LSA_IS_TYPE(ROUTER, lsa)) {
|
if (lsa != NULL && OSPF6_LSA_IS_TYPE(ROUTER, lsa)) {
|
||||||
rtr_lsa = (struct ospf6_router_lsa
|
rtr_lsa = lsa_after_header(lsa->header);
|
||||||
*)((caddr_t)lsa->header
|
|
||||||
+ sizeof(struct ospf6_lsa_header));
|
|
||||||
|
|
||||||
if (!OSPF6_OPT_ISSET(rtr_lsa->options, OSPF6_OPT_R)) {
|
if (!OSPF6_OPT_ISSET(rtr_lsa->options, OSPF6_OPT_R)) {
|
||||||
return OSPF6_IS_STUB_ROUTER;
|
return OSPF6_IS_STUB_ROUTER;
|
||||||
@ -242,14 +220,12 @@ void ospf6_router_lsa_originate(struct event *thread)
|
|||||||
|
|
||||||
memset(buffer, 0, sizeof(buffer));
|
memset(buffer, 0, sizeof(buffer));
|
||||||
lsa_header = (struct ospf6_lsa_header *)buffer;
|
lsa_header = (struct ospf6_lsa_header *)buffer;
|
||||||
router_lsa = (struct ospf6_router_lsa *)ospf6_lsa_header_end(lsa_header);
|
router_lsa = lsa_after_header(lsa_header);
|
||||||
|
|
||||||
ospf6_router_lsa_options_set(oa, router_lsa);
|
ospf6_router_lsa_options_set(oa, router_lsa);
|
||||||
|
|
||||||
/* describe links for each interfaces */
|
/* describe links for each interfaces */
|
||||||
lsdesc = (struct ospf6_router_lsdesc
|
lsdesc = lsdesc_start_lsa_type(lsa_header, OSPF6_LSTYPE_ROUTER);
|
||||||
*)((caddr_t)router_lsa
|
|
||||||
+ sizeof(struct ospf6_router_lsa));
|
|
||||||
|
|
||||||
for (ALL_LIST_ELEMENTS(oa->if_list, node, nnode, oi)) {
|
for (ALL_LIST_ELEMENTS(oa->if_list, node, nnode, oi)) {
|
||||||
/* Interfaces in state Down or Loopback are not described */
|
/* Interfaces in state Down or Loopback are not described */
|
||||||
@ -272,9 +248,9 @@ void ospf6_router_lsa_originate(struct event *thread)
|
|||||||
&& ((size_t)((char *)lsdesc - buffer)
|
&& ((size_t)((char *)lsdesc - buffer)
|
||||||
+ sizeof(struct ospf6_router_lsdesc)
|
+ sizeof(struct ospf6_router_lsdesc)
|
||||||
> oa->router_lsa_size_limit)) {
|
> oa->router_lsa_size_limit)) {
|
||||||
if ((caddr_t)lsdesc
|
if (lsdesc ==
|
||||||
== (caddr_t)router_lsa
|
lsdesc_start_lsa_type(lsa_header,
|
||||||
+ sizeof(struct ospf6_router_lsa)) {
|
OSPF6_LSTYPE_ROUTER)) {
|
||||||
zlog_warn(
|
zlog_warn(
|
||||||
"Size limit setting for Router-LSA too short");
|
"Size limit setting for Router-LSA too short");
|
||||||
return;
|
return;
|
||||||
@ -303,15 +279,13 @@ void ospf6_router_lsa_originate(struct event *thread)
|
|||||||
/* Reset Buffer to fill next Router LSA */
|
/* Reset Buffer to fill next Router LSA */
|
||||||
memset(buffer, 0, sizeof(buffer));
|
memset(buffer, 0, sizeof(buffer));
|
||||||
lsa_header = (struct ospf6_lsa_header *)buffer;
|
lsa_header = (struct ospf6_lsa_header *)buffer;
|
||||||
router_lsa = (struct ospf6_router_lsa *)
|
router_lsa = lsa_after_header(lsa_header);
|
||||||
ospf6_lsa_header_end(lsa_header);
|
|
||||||
|
|
||||||
ospf6_router_lsa_options_set(oa, router_lsa);
|
ospf6_router_lsa_options_set(oa, router_lsa);
|
||||||
|
|
||||||
/* describe links for each interfaces */
|
/* describe links for each interfaces */
|
||||||
lsdesc = (struct ospf6_router_lsdesc
|
lsdesc = lsdesc_start_lsa_type(lsa_header,
|
||||||
*)((caddr_t)router_lsa
|
OSPF6_LSTYPE_ROUTER);
|
||||||
+ sizeof(struct ospf6_router_lsa));
|
|
||||||
|
|
||||||
link_state_id++;
|
link_state_id++;
|
||||||
}
|
}
|
||||||
@ -424,30 +398,13 @@ void ospf6_router_lsa_originate(struct event *thread)
|
|||||||
static char *ospf6_network_lsa_get_ar_id(struct ospf6_lsa *lsa, char *buf,
|
static char *ospf6_network_lsa_get_ar_id(struct ospf6_lsa *lsa, char *buf,
|
||||||
int buflen, int pos)
|
int buflen, int pos)
|
||||||
{
|
{
|
||||||
char *start, *end, *current;
|
struct ospf6_network_lsdesc *lsdesc = nth_lsdesc(lsa->header, pos);
|
||||||
struct ospf6_network_lsa *network_lsa;
|
|
||||||
struct ospf6_network_lsdesc *lsdesc;
|
|
||||||
|
|
||||||
if (lsa) {
|
|
||||||
network_lsa = (struct ospf6_network_lsa
|
|
||||||
*)((caddr_t)lsa->header
|
|
||||||
+ sizeof(struct ospf6_lsa_header));
|
|
||||||
|
|
||||||
start = (char *)network_lsa + sizeof(struct ospf6_network_lsa);
|
|
||||||
end = (char *)lsa->header + ntohs(lsa->header->length);
|
|
||||||
current = start + pos * (sizeof(struct ospf6_network_lsdesc));
|
|
||||||
|
|
||||||
if ((current + sizeof(struct ospf6_network_lsdesc)) <= end) {
|
|
||||||
lsdesc = (struct ospf6_network_lsdesc *)current;
|
|
||||||
if (buf) {
|
|
||||||
inet_ntop(AF_INET, &lsdesc->router_id, buf,
|
|
||||||
buflen);
|
|
||||||
return buf;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
if (!lsdesc || !buf || buflen < (1 + INET_ADDRSTRLEN))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
inet_ntop(AF_INET, &lsdesc->router_id, buf, buflen);
|
||||||
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ospf6_network_lsa_show(struct vty *vty, struct ospf6_lsa *lsa,
|
static int ospf6_network_lsa_show(struct vty *vty, struct ospf6_lsa *lsa,
|
||||||
@ -459,9 +416,7 @@ static int ospf6_network_lsa_show(struct vty *vty, struct ospf6_lsa *lsa,
|
|||||||
char buf[128], options[32];
|
char buf[128], options[32];
|
||||||
json_object *json_arr = NULL;
|
json_object *json_arr = NULL;
|
||||||
|
|
||||||
network_lsa =
|
network_lsa = lsa_after_header(lsa->header);
|
||||||
(struct ospf6_network_lsa *)((caddr_t)lsa->header
|
|
||||||
+ sizeof(struct ospf6_lsa_header));
|
|
||||||
|
|
||||||
ospf6_options_printbuf(network_lsa->options, options, sizeof(options));
|
ospf6_options_printbuf(network_lsa->options, options, sizeof(options));
|
||||||
if (use_json)
|
if (use_json)
|
||||||
@ -563,23 +518,19 @@ void ospf6_network_lsa_originate(struct event *thread)
|
|||||||
/* prepare buffer */
|
/* prepare buffer */
|
||||||
memset(buffer, 0, sizeof(buffer));
|
memset(buffer, 0, sizeof(buffer));
|
||||||
lsa_header = (struct ospf6_lsa_header *)buffer;
|
lsa_header = (struct ospf6_lsa_header *)buffer;
|
||||||
network_lsa =
|
network_lsa = lsa_after_header(lsa_header);
|
||||||
(struct ospf6_network_lsa *)ospf6_lsa_header_end(lsa_header);
|
|
||||||
|
|
||||||
/* Collect the interface's Link-LSAs to describe
|
/* Collect the interface's Link-LSAs to describe
|
||||||
network's optional capabilities */
|
network's optional capabilities */
|
||||||
type = htons(OSPF6_LSTYPE_LINK);
|
type = htons(OSPF6_LSTYPE_LINK);
|
||||||
for (ALL_LSDB_TYPED(oi->lsdb, type, lsa)) {
|
for (ALL_LSDB_TYPED(oi->lsdb, type, lsa)) {
|
||||||
link_lsa = (struct ospf6_link_lsa *)ospf6_lsa_header_end(
|
link_lsa = lsa_after_header(lsa->header);
|
||||||
lsa->header);
|
|
||||||
network_lsa->options[0] |= link_lsa->options[0];
|
network_lsa->options[0] |= link_lsa->options[0];
|
||||||
network_lsa->options[1] |= link_lsa->options[1];
|
network_lsa->options[1] |= link_lsa->options[1];
|
||||||
network_lsa->options[2] |= link_lsa->options[2];
|
network_lsa->options[2] |= link_lsa->options[2];
|
||||||
}
|
}
|
||||||
|
|
||||||
lsdesc = (struct ospf6_network_lsdesc
|
lsdesc = lsdesc_start_lsa_type(lsa_header, OSPF6_LSTYPE_NETWORK);
|
||||||
*)((caddr_t)network_lsa
|
|
||||||
+ sizeof(struct ospf6_network_lsa));
|
|
||||||
|
|
||||||
/* set Link Description to the router itself */
|
/* set Link Description to the router itself */
|
||||||
lsdesc->router_id = oi->area->ospf6->router_id;
|
lsdesc->router_id = oi->area->ospf6->router_id;
|
||||||
@ -623,52 +574,24 @@ void ospf6_network_lsa_originate(struct event *thread)
|
|||||||
static char *ospf6_link_lsa_get_prefix_str(struct ospf6_lsa *lsa, char *buf,
|
static char *ospf6_link_lsa_get_prefix_str(struct ospf6_lsa *lsa, char *buf,
|
||||||
int buflen, int pos)
|
int buflen, int pos)
|
||||||
{
|
{
|
||||||
char *start, *end, *current;
|
struct ospf6_link_lsa *link_lsa = lsa_after_header(lsa->header);
|
||||||
struct ospf6_link_lsa *link_lsa;
|
struct ospf6_prefix *prefix = nth_prefix(lsa->header, pos);
|
||||||
struct in6_addr in6;
|
struct in6_addr in6 = { 0 };
|
||||||
struct ospf6_prefix *prefix;
|
|
||||||
int cnt = 0, prefixnum;
|
|
||||||
|
|
||||||
if (lsa) {
|
if (!lsa || !prefix || !buf || buflen < (1 + INET6_ADDRSTRLEN))
|
||||||
link_lsa = (struct ospf6_link_lsa
|
return NULL;
|
||||||
*)((caddr_t)lsa->header
|
|
||||||
+ sizeof(struct ospf6_lsa_header));
|
|
||||||
|
|
||||||
|
/* position zero is used for the lladdr in the body of the LSA */
|
||||||
if (pos == 0) {
|
if (pos == 0) {
|
||||||
inet_ntop(AF_INET6, &link_lsa->linklocal_addr, buf,
|
inet_ntop(AF_INET6, &link_lsa->linklocal_addr, buf, buflen);
|
||||||
buflen);
|
return buf;
|
||||||
return (buf);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
prefixnum = ntohl(link_lsa->prefix_num);
|
|
||||||
if (pos > prefixnum)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
start = (char *)link_lsa + sizeof(struct ospf6_link_lsa);
|
|
||||||
end = (char *)lsa->header + ntohs(lsa->header->length);
|
|
||||||
current = start;
|
|
||||||
|
|
||||||
while (current + sizeof(struct ospf6_prefix) <= end) {
|
|
||||||
prefix = (struct ospf6_prefix *)current;
|
|
||||||
if (prefix->prefix_length == 0
|
|
||||||
|| current + OSPF6_PREFIX_SIZE(prefix) > end) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cnt < (pos - 1)) {
|
|
||||||
current += OSPF6_PREFIX_SIZE(prefix);
|
|
||||||
cnt++;
|
|
||||||
} else {
|
|
||||||
memset(&in6, 0, sizeof(in6));
|
|
||||||
memcpy(&in6, OSPF6_PREFIX_BODY(prefix),
|
memcpy(&in6, OSPF6_PREFIX_BODY(prefix),
|
||||||
OSPF6_PREFIX_SPACE(
|
OSPF6_PREFIX_SPACE(prefix->prefix_length));
|
||||||
prefix->prefix_length));
|
|
||||||
inet_ntop(AF_INET6, &in6, buf, buflen);
|
inet_ntop(AF_INET6, &in6, buf, buflen);
|
||||||
return (buf);
|
|
||||||
}
|
return buf;
|
||||||
}
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ospf6_link_lsa_show(struct vty *vty, struct ospf6_lsa *lsa,
|
static int ospf6_link_lsa_show(struct vty *vty, struct ospf6_lsa *lsa,
|
||||||
@ -684,8 +607,7 @@ static int ospf6_link_lsa_show(struct vty *vty, struct ospf6_lsa *lsa,
|
|||||||
json_object *json_arr = NULL;
|
json_object *json_arr = NULL;
|
||||||
char prefix_string[133];
|
char prefix_string[133];
|
||||||
|
|
||||||
link_lsa = (struct ospf6_link_lsa *)((caddr_t)lsa->header
|
link_lsa = lsa_after_header(lsa->header);
|
||||||
+ sizeof(struct ospf6_lsa_header));
|
|
||||||
|
|
||||||
ospf6_options_printbuf(link_lsa->options, options, sizeof(options));
|
ospf6_options_printbuf(link_lsa->options, options, sizeof(options));
|
||||||
inet_ntop(AF_INET6, &link_lsa->linklocal_addr, buf, sizeof(buf));
|
inet_ntop(AF_INET6, &link_lsa->linklocal_addr, buf, sizeof(buf));
|
||||||
@ -795,7 +717,7 @@ void ospf6_link_lsa_originate(struct event *thread)
|
|||||||
/* prepare buffer */
|
/* prepare buffer */
|
||||||
memset(buffer, 0, sizeof(buffer));
|
memset(buffer, 0, sizeof(buffer));
|
||||||
lsa_header = (struct ospf6_lsa_header *)buffer;
|
lsa_header = (struct ospf6_lsa_header *)buffer;
|
||||||
link_lsa = (struct ospf6_link_lsa *)ospf6_lsa_header_end(lsa_header);
|
link_lsa = lsa_after_header(lsa_header);
|
||||||
|
|
||||||
/* Fill Link-LSA */
|
/* Fill Link-LSA */
|
||||||
link_lsa->priority = oi->priority;
|
link_lsa->priority = oi->priority;
|
||||||
@ -804,8 +726,7 @@ void ospf6_link_lsa_originate(struct event *thread)
|
|||||||
sizeof(struct in6_addr));
|
sizeof(struct in6_addr));
|
||||||
link_lsa->prefix_num = htonl(oi->route_connected->count);
|
link_lsa->prefix_num = htonl(oi->route_connected->count);
|
||||||
|
|
||||||
op = (struct ospf6_prefix *)((caddr_t)link_lsa
|
op = lsdesc_start_lsa_type(lsa_header, OSPF6_LSTYPE_LINK);
|
||||||
+ sizeof(struct ospf6_link_lsa));
|
|
||||||
|
|
||||||
/* connected prefix to advertise */
|
/* connected prefix to advertise */
|
||||||
for (route = ospf6_route_head(oi->route_connected); route;
|
for (route = ospf6_route_head(oi->route_connected); route;
|
||||||
@ -846,52 +767,22 @@ static char *ospf6_intra_prefix_lsa_get_prefix_str(struct ospf6_lsa *lsa,
|
|||||||
char *buf, int buflen,
|
char *buf, int buflen,
|
||||||
int pos)
|
int pos)
|
||||||
{
|
{
|
||||||
char *start, *end, *current;
|
struct ospf6_prefix *prefix = nth_prefix(lsa->header, pos);
|
||||||
struct ospf6_intra_prefix_lsa *intra_prefix_lsa;
|
struct in6_addr in6 = { 0 };
|
||||||
struct in6_addr in6;
|
|
||||||
int prefixnum, cnt = 0;
|
|
||||||
struct ospf6_prefix *prefix;
|
|
||||||
char tbuf[16];
|
char tbuf[16];
|
||||||
|
|
||||||
if (lsa) {
|
/* ensure buflen >= INET6_ADDRSTRLEN + '/128\0' */
|
||||||
intra_prefix_lsa =
|
if (!lsa || !prefix || !buf || buflen < (5 + INET6_ADDRSTRLEN))
|
||||||
(struct ospf6_intra_prefix_lsa
|
|
||||||
*)((caddr_t)lsa->header
|
|
||||||
+ sizeof(struct ospf6_lsa_header));
|
|
||||||
|
|
||||||
prefixnum = ntohs(intra_prefix_lsa->prefix_num);
|
|
||||||
if ((pos + 1) > prefixnum)
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
start = (char *)intra_prefix_lsa
|
|
||||||
+ sizeof(struct ospf6_intra_prefix_lsa);
|
|
||||||
end = ospf6_lsa_end(lsa->header);
|
|
||||||
current = start;
|
|
||||||
|
|
||||||
while (current + sizeof(struct ospf6_prefix) <= end) {
|
|
||||||
prefix = (struct ospf6_prefix *)current;
|
|
||||||
if (prefix->prefix_length == 0
|
|
||||||
|| current + OSPF6_PREFIX_SIZE(prefix) > end) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cnt < pos) {
|
|
||||||
current += OSPF6_PREFIX_SIZE(prefix);
|
|
||||||
cnt++;
|
|
||||||
} else {
|
|
||||||
memset(&in6, 0, sizeof(in6));
|
|
||||||
memcpy(&in6, OSPF6_PREFIX_BODY(prefix),
|
memcpy(&in6, OSPF6_PREFIX_BODY(prefix),
|
||||||
OSPF6_PREFIX_SPACE(
|
OSPF6_PREFIX_SPACE(prefix->prefix_length));
|
||||||
prefix->prefix_length));
|
|
||||||
inet_ntop(AF_INET6, &in6, buf, buflen);
|
inet_ntop(AF_INET6, &in6, buf, buflen);
|
||||||
snprintf(tbuf, sizeof(tbuf), "/%d",
|
|
||||||
prefix->prefix_length);
|
snprintf(tbuf, sizeof(tbuf), "/%d", prefix->prefix_length);
|
||||||
strlcat(buf, tbuf, buflen);
|
strlcat(buf, tbuf, buflen);
|
||||||
return (buf);
|
|
||||||
}
|
return buf;
|
||||||
}
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ospf6_intra_prefix_lsa_show(struct vty *vty, struct ospf6_lsa *lsa,
|
static int ospf6_intra_prefix_lsa_show(struct vty *vty, struct ospf6_lsa *lsa,
|
||||||
@ -908,9 +799,7 @@ static int ospf6_intra_prefix_lsa_show(struct vty *vty, struct ospf6_lsa *lsa,
|
|||||||
json_object *json_arr = NULL;
|
json_object *json_arr = NULL;
|
||||||
char prefix_string[133];
|
char prefix_string[133];
|
||||||
|
|
||||||
intra_prefix_lsa = (struct ospf6_intra_prefix_lsa
|
intra_prefix_lsa = lsa_after_header(lsa->header);
|
||||||
*)((caddr_t)lsa->header
|
|
||||||
+ sizeof(struct ospf6_lsa_header));
|
|
||||||
|
|
||||||
prefixnum = ntohs(intra_prefix_lsa->prefix_num);
|
prefixnum = ntohs(intra_prefix_lsa->prefix_num);
|
||||||
|
|
||||||
@ -1037,8 +926,7 @@ void ospf6_intra_prefix_lsa_originate_stub(struct event *thread)
|
|||||||
/* prepare buffer */
|
/* prepare buffer */
|
||||||
memset(buffer, 0, sizeof(buffer));
|
memset(buffer, 0, sizeof(buffer));
|
||||||
lsa_header = (struct ospf6_lsa_header *)buffer;
|
lsa_header = (struct ospf6_lsa_header *)buffer;
|
||||||
intra_prefix_lsa = (struct ospf6_intra_prefix_lsa *)ospf6_lsa_header_end(
|
intra_prefix_lsa = lsa_after_header(lsa_header);
|
||||||
lsa_header);
|
|
||||||
|
|
||||||
/* Fill Intra-Area-Prefix-LSA */
|
/* Fill Intra-Area-Prefix-LSA */
|
||||||
intra_prefix_lsa->ref_type = htons(OSPF6_LSTYPE_ROUTER);
|
intra_prefix_lsa->ref_type = htons(OSPF6_LSTYPE_ROUTER);
|
||||||
@ -1122,12 +1010,10 @@ void ospf6_intra_prefix_lsa_originate_stub(struct event *thread)
|
|||||||
|
|
||||||
/* put prefixes to advertise */
|
/* put prefixes to advertise */
|
||||||
prefix_num = 0;
|
prefix_num = 0;
|
||||||
op = (struct ospf6_prefix *)((caddr_t)intra_prefix_lsa
|
op = lsdesc_start_lsa_type(lsa_header, OSPF6_LSTYPE_INTRA_PREFIX);
|
||||||
+ sizeof(struct ospf6_intra_prefix_lsa));
|
|
||||||
for (route = ospf6_route_head(route_advertise); route;
|
for (route = ospf6_route_head(route_advertise); route;
|
||||||
route = ospf6_route_best_next(route)) {
|
route = ospf6_route_best_next(route)) {
|
||||||
if (((caddr_t)op - (caddr_t)lsa_header) > MAX_LSA_PAYLOAD) {
|
if (((caddr_t)op - (caddr_t)lsa_header) > MAX_LSA_PAYLOAD) {
|
||||||
|
|
||||||
intra_prefix_lsa->prefix_num = htons(prefix_num);
|
intra_prefix_lsa->prefix_num = htons(prefix_num);
|
||||||
|
|
||||||
/* Fill LSA Header */
|
/* Fill LSA Header */
|
||||||
@ -1153,8 +1039,7 @@ void ospf6_intra_prefix_lsa_originate_stub(struct event *thread)
|
|||||||
/* Prepare next buffer */
|
/* Prepare next buffer */
|
||||||
memset(buffer, 0, sizeof(buffer));
|
memset(buffer, 0, sizeof(buffer));
|
||||||
lsa_header = (struct ospf6_lsa_header *)buffer;
|
lsa_header = (struct ospf6_lsa_header *)buffer;
|
||||||
intra_prefix_lsa = (struct ospf6_intra_prefix_lsa *)
|
intra_prefix_lsa = lsa_after_header(lsa_header);
|
||||||
ospf6_lsa_header_end(lsa_header);
|
|
||||||
|
|
||||||
/* Fill Intra-Area-Prefix-LSA */
|
/* Fill Intra-Area-Prefix-LSA */
|
||||||
intra_prefix_lsa->ref_type = htons(OSPF6_LSTYPE_ROUTER);
|
intra_prefix_lsa->ref_type = htons(OSPF6_LSTYPE_ROUTER);
|
||||||
@ -1163,10 +1048,8 @@ void ospf6_intra_prefix_lsa_originate_stub(struct event *thread)
|
|||||||
|
|
||||||
/* Put next set of prefixes to advertise */
|
/* Put next set of prefixes to advertise */
|
||||||
prefix_num = 0;
|
prefix_num = 0;
|
||||||
op = (struct ospf6_prefix
|
op = lsdesc_start_lsa_type(lsa_header,
|
||||||
*)((caddr_t)intra_prefix_lsa
|
OSPF6_LSTYPE_INTRA_PREFIX);
|
||||||
+ sizeof(struct
|
|
||||||
ospf6_intra_prefix_lsa));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
op->prefix_length = route->prefix.prefixlen;
|
op->prefix_length = route->prefix.prefixlen;
|
||||||
@ -1261,8 +1144,7 @@ void ospf6_intra_prefix_lsa_originate_transit(struct event *thread)
|
|||||||
/* prepare buffer */
|
/* prepare buffer */
|
||||||
memset(buffer, 0, sizeof(buffer));
|
memset(buffer, 0, sizeof(buffer));
|
||||||
lsa_header = (struct ospf6_lsa_header *)buffer;
|
lsa_header = (struct ospf6_lsa_header *)buffer;
|
||||||
intra_prefix_lsa = (struct ospf6_intra_prefix_lsa *)ospf6_lsa_header_end(
|
intra_prefix_lsa = lsa_after_header(lsa_header);
|
||||||
lsa_header);
|
|
||||||
|
|
||||||
/* Fill Intra-Area-Prefix-LSA */
|
/* Fill Intra-Area-Prefix-LSA */
|
||||||
intra_prefix_lsa->ref_type = htons(OSPF6_LSTYPE_NETWORK);
|
intra_prefix_lsa->ref_type = htons(OSPF6_LSTYPE_NETWORK);
|
||||||
@ -1311,9 +1193,7 @@ void ospf6_intra_prefix_lsa_originate_transit(struct event *thread)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
link_lsa = (struct ospf6_link_lsa
|
link_lsa = lsa_after_header(lsa->header);
|
||||||
*)((caddr_t)lsa->header
|
|
||||||
+ sizeof(struct ospf6_lsa_header));
|
|
||||||
|
|
||||||
prefix_num = (unsigned short)ntohl(link_lsa->prefix_num);
|
prefix_num = (unsigned short)ntohl(link_lsa->prefix_num);
|
||||||
start = (char *)link_lsa + sizeof(struct ospf6_link_lsa);
|
start = (char *)link_lsa + sizeof(struct ospf6_link_lsa);
|
||||||
@ -1356,8 +1236,7 @@ void ospf6_intra_prefix_lsa_originate_transit(struct event *thread)
|
|||||||
zlog_debug("Trailing garbage in %s", lsa->name);
|
zlog_debug("Trailing garbage in %s", lsa->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
op = (struct ospf6_prefix *)((caddr_t)intra_prefix_lsa
|
op = lsdesc_start_lsa_type(lsa_header, OSPF6_LSTYPE_INTRA_PREFIX);
|
||||||
+ sizeof(struct ospf6_intra_prefix_lsa));
|
|
||||||
|
|
||||||
prefix_num = 0;
|
prefix_num = 0;
|
||||||
for (route = ospf6_route_head(route_advertise); route;
|
for (route = ospf6_route_head(route_advertise); route;
|
||||||
@ -1658,10 +1537,7 @@ void ospf6_intra_prefix_route_ecmp_path(struct ospf6_area *oa,
|
|||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
intra_prefix_lsa =
|
intra_prefix_lsa = lsa_after_header(lsa->header);
|
||||||
(struct ospf6_intra_prefix_lsa *)
|
|
||||||
ospf6_lsa_header_end(
|
|
||||||
lsa->header);
|
|
||||||
|
|
||||||
if (intra_prefix_lsa->ref_adv_router
|
if (intra_prefix_lsa->ref_adv_router
|
||||||
== oa->ospf6->router_id) {
|
== oa->ospf6->router_id) {
|
||||||
@ -1742,8 +1618,7 @@ void ospf6_intra_prefix_lsa_add(struct ospf6_lsa *lsa)
|
|||||||
|
|
||||||
oa = OSPF6_AREA(lsa->lsdb->data);
|
oa = OSPF6_AREA(lsa->lsdb->data);
|
||||||
|
|
||||||
intra_prefix_lsa = (struct ospf6_intra_prefix_lsa *)ospf6_lsa_header_end(
|
intra_prefix_lsa = lsa_after_header(lsa->header);
|
||||||
lsa->header);
|
|
||||||
if (intra_prefix_lsa->ref_type == htons(OSPF6_LSTYPE_ROUTER) ||
|
if (intra_prefix_lsa->ref_type == htons(OSPF6_LSTYPE_ROUTER) ||
|
||||||
intra_prefix_lsa->ref_type == htons(OSPF6_LSTYPE_NETWORK))
|
intra_prefix_lsa->ref_type == htons(OSPF6_LSTYPE_NETWORK))
|
||||||
ospf6_linkstate_prefix(intra_prefix_lsa->ref_adv_router,
|
ospf6_linkstate_prefix(intra_prefix_lsa->ref_adv_router,
|
||||||
@ -1971,8 +1846,7 @@ void ospf6_intra_prefix_lsa_remove(struct ospf6_lsa *lsa)
|
|||||||
|
|
||||||
oa = OSPF6_AREA(lsa->lsdb->data);
|
oa = OSPF6_AREA(lsa->lsdb->data);
|
||||||
|
|
||||||
intra_prefix_lsa = (struct ospf6_intra_prefix_lsa *)ospf6_lsa_header_end(
|
intra_prefix_lsa = lsa_after_header(lsa->header);
|
||||||
lsa->header);
|
|
||||||
|
|
||||||
prefix_num = ntohs(intra_prefix_lsa->prefix_num);
|
prefix_num = ntohs(intra_prefix_lsa->prefix_num);
|
||||||
start = (caddr_t)intra_prefix_lsa
|
start = (caddr_t)intra_prefix_lsa
|
||||||
|
@ -13,10 +13,13 @@ extern in_addr_t conf_debug_ospf6_brouter_specific_area_id;
|
|||||||
#define OSPF6_DEBUG_BROUTER_SUMMARY 0x01
|
#define OSPF6_DEBUG_BROUTER_SUMMARY 0x01
|
||||||
#define OSPF6_DEBUG_BROUTER_SPECIFIC_ROUTER 0x02
|
#define OSPF6_DEBUG_BROUTER_SPECIFIC_ROUTER 0x02
|
||||||
#define OSPF6_DEBUG_BROUTER_SPECIFIC_AREA 0x04
|
#define OSPF6_DEBUG_BROUTER_SPECIFIC_AREA 0x04
|
||||||
|
|
||||||
#define OSPF6_DEBUG_BROUTER_ON() \
|
#define OSPF6_DEBUG_BROUTER_ON() \
|
||||||
(conf_debug_ospf6_brouter |= OSPF6_DEBUG_BROUTER_SUMMARY)
|
(conf_debug_ospf6_brouter |= OSPF6_DEBUG_BROUTER_SUMMARY)
|
||||||
|
|
||||||
#define OSPF6_DEBUG_BROUTER_OFF() \
|
#define OSPF6_DEBUG_BROUTER_OFF() \
|
||||||
(conf_debug_ospf6_brouter &= ~OSPF6_DEBUG_BROUTER_SUMMARY)
|
(conf_debug_ospf6_brouter &= ~OSPF6_DEBUG_BROUTER_SUMMARY)
|
||||||
|
|
||||||
#define IS_OSPF6_DEBUG_BROUTER \
|
#define IS_OSPF6_DEBUG_BROUTER \
|
||||||
(conf_debug_ospf6_brouter & OSPF6_DEBUG_BROUTER_SUMMARY)
|
(conf_debug_ospf6_brouter & OSPF6_DEBUG_BROUTER_SUMMARY)
|
||||||
|
|
||||||
@ -26,14 +29,17 @@ extern in_addr_t conf_debug_ospf6_brouter_specific_area_id;
|
|||||||
conf_debug_ospf6_brouter |= \
|
conf_debug_ospf6_brouter |= \
|
||||||
OSPF6_DEBUG_BROUTER_SPECIFIC_ROUTER; \
|
OSPF6_DEBUG_BROUTER_SPECIFIC_ROUTER; \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define OSPF6_DEBUG_BROUTER_SPECIFIC_ROUTER_OFF() \
|
#define OSPF6_DEBUG_BROUTER_SPECIFIC_ROUTER_OFF() \
|
||||||
do { \
|
do { \
|
||||||
conf_debug_ospf6_brouter_specific_router_id = 0; \
|
conf_debug_ospf6_brouter_specific_router_id = 0; \
|
||||||
conf_debug_ospf6_brouter &= \
|
conf_debug_ospf6_brouter &= \
|
||||||
~OSPF6_DEBUG_BROUTER_SPECIFIC_ROUTER; \
|
~OSPF6_DEBUG_BROUTER_SPECIFIC_ROUTER; \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define IS_OSPF6_DEBUG_BROUTER_SPECIFIC_ROUTER \
|
#define IS_OSPF6_DEBUG_BROUTER_SPECIFIC_ROUTER \
|
||||||
(conf_debug_ospf6_brouter & OSPF6_DEBUG_BROUTER_SPECIFIC_ROUTER)
|
(conf_debug_ospf6_brouter & OSPF6_DEBUG_BROUTER_SPECIFIC_ROUTER)
|
||||||
|
|
||||||
#define IS_OSPF6_DEBUG_BROUTER_SPECIFIC_ROUTER_ID(router_id) \
|
#define IS_OSPF6_DEBUG_BROUTER_SPECIFIC_ROUTER_ID(router_id) \
|
||||||
(IS_OSPF6_DEBUG_BROUTER_SPECIFIC_ROUTER \
|
(IS_OSPF6_DEBUG_BROUTER_SPECIFIC_ROUTER \
|
||||||
&& conf_debug_ospf6_brouter_specific_router_id == (router_id))
|
&& conf_debug_ospf6_brouter_specific_router_id == (router_id))
|
||||||
@ -43,42 +49,21 @@ extern in_addr_t conf_debug_ospf6_brouter_specific_area_id;
|
|||||||
conf_debug_ospf6_brouter_specific_area_id = (area_id); \
|
conf_debug_ospf6_brouter_specific_area_id = (area_id); \
|
||||||
conf_debug_ospf6_brouter |= OSPF6_DEBUG_BROUTER_SPECIFIC_AREA; \
|
conf_debug_ospf6_brouter |= OSPF6_DEBUG_BROUTER_SPECIFIC_AREA; \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define OSPF6_DEBUG_BROUTER_SPECIFIC_AREA_OFF() \
|
#define OSPF6_DEBUG_BROUTER_SPECIFIC_AREA_OFF() \
|
||||||
do { \
|
do { \
|
||||||
conf_debug_ospf6_brouter_specific_area_id = 0; \
|
conf_debug_ospf6_brouter_specific_area_id = 0; \
|
||||||
conf_debug_ospf6_brouter &= \
|
conf_debug_ospf6_brouter &= \
|
||||||
~OSPF6_DEBUG_BROUTER_SPECIFIC_AREA; \
|
~OSPF6_DEBUG_BROUTER_SPECIFIC_AREA; \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define IS_OSPF6_DEBUG_BROUTER_SPECIFIC_AREA \
|
#define IS_OSPF6_DEBUG_BROUTER_SPECIFIC_AREA \
|
||||||
(conf_debug_ospf6_brouter & OSPF6_DEBUG_BROUTER_SPECIFIC_AREA)
|
(conf_debug_ospf6_brouter & OSPF6_DEBUG_BROUTER_SPECIFIC_AREA)
|
||||||
|
|
||||||
#define IS_OSPF6_DEBUG_BROUTER_SPECIFIC_AREA_ID(area_id) \
|
#define IS_OSPF6_DEBUG_BROUTER_SPECIFIC_AREA_ID(area_id) \
|
||||||
(IS_OSPF6_DEBUG_BROUTER_SPECIFIC_AREA \
|
(IS_OSPF6_DEBUG_BROUTER_SPECIFIC_AREA \
|
||||||
&& conf_debug_ospf6_brouter_specific_area_id == (area_id))
|
&& conf_debug_ospf6_brouter_specific_area_id == (area_id))
|
||||||
|
|
||||||
/* Router-LSA */
|
|
||||||
#define OSPF6_ROUTER_LSA_MIN_SIZE 4U
|
|
||||||
struct ospf6_router_lsa {
|
|
||||||
uint8_t bits;
|
|
||||||
uint8_t options[3];
|
|
||||||
/* followed by ospf6_router_lsdesc(s) */
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Link State Description in Router-LSA */
|
|
||||||
#define OSPF6_ROUTER_LSDESC_FIX_SIZE 16U
|
|
||||||
struct ospf6_router_lsdesc {
|
|
||||||
uint8_t type;
|
|
||||||
uint8_t reserved;
|
|
||||||
uint16_t metric; /* output cost */
|
|
||||||
uint32_t interface_id;
|
|
||||||
uint32_t neighbor_interface_id;
|
|
||||||
in_addr_t neighbor_router_id;
|
|
||||||
};
|
|
||||||
|
|
||||||
#define OSPF6_ROUTER_LSDESC_POINTTOPOINT 1
|
|
||||||
#define OSPF6_ROUTER_LSDESC_TRANSIT_NETWORK 2
|
|
||||||
#define OSPF6_ROUTER_LSDESC_STUB_NETWORK 3
|
|
||||||
#define OSPF6_ROUTER_LSDESC_VIRTUAL_LINK 4
|
|
||||||
|
|
||||||
enum stub_router_mode {
|
enum stub_router_mode {
|
||||||
OSPF6_NOT_STUB_ROUTER,
|
OSPF6_NOT_STUB_ROUTER,
|
||||||
OSPF6_IS_STUB_ROUTER,
|
OSPF6_IS_STUB_ROUTER,
|
||||||
@ -92,49 +77,16 @@ enum stub_router_mode {
|
|||||||
: 0)
|
: 0)
|
||||||
#define ROUTER_LSDESC_GET_METRIC(x) \
|
#define ROUTER_LSDESC_GET_METRIC(x) \
|
||||||
(ntohs(((struct ospf6_router_lsdesc *)(x))->metric))
|
(ntohs(((struct ospf6_router_lsdesc *)(x))->metric))
|
||||||
|
|
||||||
#define ROUTER_LSDESC_GET_IFID(x) \
|
#define ROUTER_LSDESC_GET_IFID(x) \
|
||||||
(ntohl(((struct ospf6_router_lsdesc *)(x))->interface_id))
|
(ntohl(((struct ospf6_router_lsdesc *)(x))->interface_id))
|
||||||
|
|
||||||
#define ROUTER_LSDESC_GET_NBR_IFID(x) \
|
#define ROUTER_LSDESC_GET_NBR_IFID(x) \
|
||||||
(ntohl(((struct ospf6_router_lsdesc *)(x))->neighbor_interface_id))
|
(ntohl(((struct ospf6_router_lsdesc *)(x))->neighbor_interface_id))
|
||||||
|
|
||||||
#define ROUTER_LSDESC_GET_NBR_ROUTERID(x) \
|
#define ROUTER_LSDESC_GET_NBR_ROUTERID(x) \
|
||||||
(((struct ospf6_router_lsdesc *)(x))->neighbor_router_id)
|
(((struct ospf6_router_lsdesc *)(x))->neighbor_router_id)
|
||||||
|
|
||||||
/* Network-LSA */
|
|
||||||
#define OSPF6_NETWORK_LSA_MIN_SIZE 4U
|
|
||||||
struct ospf6_network_lsa {
|
|
||||||
uint8_t reserved;
|
|
||||||
uint8_t options[3];
|
|
||||||
/* followed by ospf6_netowrk_lsd(s) */
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Link State Description in Router-LSA */
|
|
||||||
#define OSPF6_NETWORK_LSDESC_FIX_SIZE 4U
|
|
||||||
struct ospf6_network_lsdesc {
|
|
||||||
in_addr_t router_id;
|
|
||||||
};
|
|
||||||
#define NETWORK_LSDESC_GET_NBR_ROUTERID(x) \
|
|
||||||
(((struct ospf6_network_lsdesc *)(x))->router_id)
|
|
||||||
|
|
||||||
/* Link-LSA */
|
|
||||||
#define OSPF6_LINK_LSA_MIN_SIZE 24U /* w/o 1st IPv6 prefix */
|
|
||||||
struct ospf6_link_lsa {
|
|
||||||
uint8_t priority;
|
|
||||||
uint8_t options[3];
|
|
||||||
struct in6_addr linklocal_addr;
|
|
||||||
uint32_t prefix_num;
|
|
||||||
/* followed by ospf6 prefix(es) */
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Intra-Area-Prefix-LSA */
|
|
||||||
#define OSPF6_INTRA_PREFIX_LSA_MIN_SIZE 12U /* w/o 1st IPv6 prefix */
|
|
||||||
struct ospf6_intra_prefix_lsa {
|
|
||||||
uint16_t prefix_num;
|
|
||||||
uint16_t ref_type;
|
|
||||||
uint32_t ref_id;
|
|
||||||
in_addr_t ref_adv_router;
|
|
||||||
/* followed by ospf6 prefix(es) */
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
#define OSPF6_ROUTER_LSA_SCHEDULE(oa) \
|
#define OSPF6_ROUTER_LSA_SCHEDULE(oa) \
|
||||||
do { \
|
do { \
|
||||||
@ -142,18 +94,21 @@ struct ospf6_intra_prefix_lsa {
|
|||||||
event_add_event(master, ospf6_router_lsa_originate, \
|
event_add_event(master, ospf6_router_lsa_originate, \
|
||||||
oa, 0, &(oa)->thread_router_lsa); \
|
oa, 0, &(oa)->thread_router_lsa); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define OSPF6_NETWORK_LSA_SCHEDULE(oi) \
|
#define OSPF6_NETWORK_LSA_SCHEDULE(oi) \
|
||||||
do { \
|
do { \
|
||||||
if (!CHECK_FLAG((oi)->flag, OSPF6_INTERFACE_DISABLE)) \
|
if (!CHECK_FLAG((oi)->flag, OSPF6_INTERFACE_DISABLE)) \
|
||||||
event_add_event(master, ospf6_network_lsa_originate, \
|
event_add_event(master, ospf6_network_lsa_originate, \
|
||||||
oi, 0, &(oi)->thread_network_lsa); \
|
oi, 0, &(oi)->thread_network_lsa); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define OSPF6_LINK_LSA_SCHEDULE(oi) \
|
#define OSPF6_LINK_LSA_SCHEDULE(oi) \
|
||||||
do { \
|
do { \
|
||||||
if (!CHECK_FLAG((oi)->flag, OSPF6_INTERFACE_DISABLE)) \
|
if (!CHECK_FLAG((oi)->flag, OSPF6_INTERFACE_DISABLE)) \
|
||||||
event_add_event(master, ospf6_link_lsa_originate, oi, \
|
event_add_event(master, ospf6_link_lsa_originate, oi, \
|
||||||
0, &(oi)->thread_link_lsa); \
|
0, &(oi)->thread_link_lsa); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define OSPF6_INTRA_PREFIX_LSA_SCHEDULE_STUB(oa) \
|
#define OSPF6_INTRA_PREFIX_LSA_SCHEDULE_STUB(oa) \
|
||||||
do { \
|
do { \
|
||||||
if (CHECK_FLAG((oa)->flag, OSPF6_AREA_ENABLE)) \
|
if (CHECK_FLAG((oa)->flag, OSPF6_AREA_ENABLE)) \
|
||||||
@ -161,6 +116,7 @@ struct ospf6_intra_prefix_lsa {
|
|||||||
master, ospf6_intra_prefix_lsa_originate_stub, \
|
master, ospf6_intra_prefix_lsa_originate_stub, \
|
||||||
oa, 0, &(oa)->thread_intra_prefix_lsa); \
|
oa, 0, &(oa)->thread_intra_prefix_lsa); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define OSPF6_INTRA_PREFIX_LSA_SCHEDULE_TRANSIT(oi) \
|
#define OSPF6_INTRA_PREFIX_LSA_SCHEDULE_TRANSIT(oi) \
|
||||||
do { \
|
do { \
|
||||||
if (!CHECK_FLAG((oi)->flag, OSPF6_INTERFACE_DISABLE)) \
|
if (!CHECK_FLAG((oi)->flag, OSPF6_INTERFACE_DISABLE)) \
|
||||||
|
@ -37,8 +37,85 @@ DEFINE_MTYPE_STATIC(OSPF6D, OSPF6_LSA, "OSPF6 LSA");
|
|||||||
DEFINE_MTYPE_STATIC(OSPF6D, OSPF6_LSA_HEADER, "OSPF6 LSA header");
|
DEFINE_MTYPE_STATIC(OSPF6D, OSPF6_LSA_HEADER, "OSPF6 LSA header");
|
||||||
DEFINE_MTYPE_STATIC(OSPF6D, OSPF6_LSA_SUMMARY, "OSPF6 LSA summary");
|
DEFINE_MTYPE_STATIC(OSPF6D, OSPF6_LSA_SUMMARY, "OSPF6 LSA summary");
|
||||||
|
|
||||||
|
const uint8_t ospf6_lsa_min_size[OSPF6_LSTYPE_SIZE] = {
|
||||||
|
[OSPF6_LSTYPE_UNKNOWN] = 0,
|
||||||
|
[0x00ff & OSPF6_LSTYPE_ROUTER] = OSPF6_ROUTER_LSA_MIN_SIZE,
|
||||||
|
[0x00ff & OSPF6_LSTYPE_NETWORK] = OSPF6_NETWORK_LSA_MIN_SIZE,
|
||||||
|
[0x00ff & OSPF6_LSTYPE_INTER_PREFIX] = OSPF6_INTER_PREFIX_LSA_MIN_SIZE,
|
||||||
|
[0x00ff & OSPF6_LSTYPE_INTER_ROUTER] = OSPF6_INTER_ROUTER_LSA_FIX_SIZE,
|
||||||
|
[0x00ff & OSPF6_LSTYPE_AS_EXTERNAL] = OSPF6_AS_EXTERNAL_LSA_MIN_SIZE,
|
||||||
|
[0x00ff & OSPF6_LSTYPE_GROUP_MEMBERSHIP] = 0, /* Unused */
|
||||||
|
[0x00ff & OSPF6_LSTYPE_TYPE_7] = OSPF6_AS_EXTERNAL_LSA_MIN_SIZE,
|
||||||
|
[0x00ff & OSPF6_LSTYPE_LINK] = OSPF6_LINK_LSA_MIN_SIZE,
|
||||||
|
[0x00ff & OSPF6_LSTYPE_INTRA_PREFIX] = OSPF6_INTRA_PREFIX_LSA_MIN_SIZE,
|
||||||
|
[0x00ff & OSPF6_LSTYPE_GRACE_LSA] = 0
|
||||||
|
};
|
||||||
|
|
||||||
|
void *lsdesc_start_lsa_type(struct ospf6_lsa_header *header, int lsa_type)
|
||||||
|
{
|
||||||
|
uint8_t t = (0x00ff & lsa_type);
|
||||||
|
|
||||||
|
if (t == OSPF6_LSTYPE_UNKNOWN || t >= OSPF6_LSTYPE_SIZE) {
|
||||||
|
zlog_debug("Cannot get descriptor offset for unknown lsa type 0x%x",
|
||||||
|
t);
|
||||||
|
return ospf6_lsa_end(header);
|
||||||
|
}
|
||||||
|
return (char *)lsa_after_header(header) + ospf6_lsa_min_size[t];
|
||||||
|
}
|
||||||
|
|
||||||
|
void *lsdesc_start(struct ospf6_lsa_header *header)
|
||||||
|
{
|
||||||
|
return lsdesc_start_lsa_type(header, ntohs(header->type));
|
||||||
|
}
|
||||||
|
|
||||||
static struct ospf6_lsa_handler *lsa_handlers[OSPF6_LSTYPE_SIZE];
|
static struct ospf6_lsa_handler *lsa_handlers[OSPF6_LSTYPE_SIZE];
|
||||||
|
|
||||||
|
void *nth_lsdesc(struct ospf6_lsa_header *header, int pos)
|
||||||
|
{
|
||||||
|
char *lsdesc = lsdesc_start(header);
|
||||||
|
char *lsa_end = ospf6_lsa_end(header);
|
||||||
|
char *nth;
|
||||||
|
int lsdesc_size;
|
||||||
|
|
||||||
|
if (ntohs(header->type) == OSPF6_LSTYPE_ROUTER)
|
||||||
|
lsdesc_size = OSPF6_ROUTER_LSDESC_FIX_SIZE;
|
||||||
|
else if (ntohs(header->type) == OSPF6_LSTYPE_NETWORK)
|
||||||
|
lsdesc_size = OSPF6_NETWORK_LSDESC_FIX_SIZE;
|
||||||
|
else
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
nth = lsdesc + (pos * lsdesc_size);
|
||||||
|
|
||||||
|
if (nth + lsdesc_size <= lsa_end)
|
||||||
|
return nth;
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *nth_prefix(struct ospf6_lsa_header *header, int pos)
|
||||||
|
{
|
||||||
|
struct ospf6_prefix *prefix = lsdesc_start(header);
|
||||||
|
char *end = ospf6_lsa_end(header);
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
if (ntohs(header->type) != OSPF6_LSTYPE_LINK &&
|
||||||
|
ntohs(header->type) != OSPF6_LSTYPE_INTRA_PREFIX)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (pos == 0)
|
||||||
|
return prefix;
|
||||||
|
|
||||||
|
while ((char *)prefix < end &&
|
||||||
|
(char *)prefix + OSPF6_PREFIX_SIZE(prefix) <= end) {
|
||||||
|
if (i == pos)
|
||||||
|
return prefix;
|
||||||
|
i++;
|
||||||
|
prefix = OSPF6_PREFIX_NEXT(prefix);
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
struct ospf6 *ospf6_get_by_lsdb(struct ospf6_lsa *lsa)
|
struct ospf6 *ospf6_get_by_lsdb(struct ospf6_lsa *lsa)
|
||||||
{
|
{
|
||||||
struct ospf6 *ospf6 = NULL;
|
struct ospf6 *ospf6 = NULL;
|
||||||
@ -65,7 +142,7 @@ static int ospf6_unknown_lsa_show(struct vty *vty, struct ospf6_lsa *lsa,
|
|||||||
{
|
{
|
||||||
char *start, *end, *current;
|
char *start, *end, *current;
|
||||||
|
|
||||||
start = ospf6_lsa_header_end(lsa->header);
|
start = lsa_after_header(lsa->header);
|
||||||
end = ospf6_lsa_end(lsa->header);
|
end = ospf6_lsa_end(lsa->header);
|
||||||
|
|
||||||
if (use_json) {
|
if (use_json) {
|
||||||
@ -234,8 +311,8 @@ int ospf6_lsa_is_changed(struct ospf6_lsa *lsa1, struct ospf6_lsa *lsa2)
|
|||||||
if (length <= 0)
|
if (length <= 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
return memcmp(ospf6_lsa_header_end(lsa1->header),
|
return memcmp(lsa_after_header(lsa1->header),
|
||||||
ospf6_lsa_header_end(lsa2->header), length);
|
lsa_after_header(lsa2->header), length);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ospf6 age functions */
|
/* ospf6 age functions */
|
||||||
|
@ -87,11 +87,17 @@ struct ospf6_lsa_header {
|
|||||||
uint16_t length; /* LSA length */
|
uint16_t length; /* LSA length */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
static inline char *ospf6_lsa_header_end(struct ospf6_lsa_header *header)
|
static inline char *ospf6_lsa_header_end(struct ospf6_lsa_header *header)
|
||||||
{
|
{
|
||||||
return (char *)header + sizeof(struct ospf6_lsa_header);
|
return (char *)header + sizeof(struct ospf6_lsa_header);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void *lsa_after_header(struct ospf6_lsa_header *header)
|
||||||
|
{
|
||||||
|
return (char *)header + sizeof(struct ospf6_lsa_header);
|
||||||
|
}
|
||||||
|
|
||||||
static inline char *ospf6_lsa_end(struct ospf6_lsa_header *header)
|
static inline char *ospf6_lsa_end(struct ospf6_lsa_header *header)
|
||||||
{
|
{
|
||||||
return (char *)header + ntohs(header->length);
|
return (char *)header + ntohs(header->length);
|
||||||
@ -116,6 +122,94 @@ static inline uint16_t ospf6_lsa_size(struct ospf6_lsa_header *header)
|
|||||||
#define OSPF6_LSA_IS_CHANGED(L1, L2) ospf6_lsa_is_changed (L1, L2)
|
#define OSPF6_LSA_IS_CHANGED(L1, L2) ospf6_lsa_is_changed (L1, L2)
|
||||||
#define OSPF6_LSA_IS_SEQWRAP(L) ((L)->header->seqnum == htonl(OSPF_MAX_SEQUENCE_NUMBER + 1))
|
#define OSPF6_LSA_IS_SEQWRAP(L) ((L)->header->seqnum == htonl(OSPF_MAX_SEQUENCE_NUMBER + 1))
|
||||||
|
|
||||||
|
/* Router-LSA */
|
||||||
|
#define OSPF6_ROUTER_LSA_MIN_SIZE 4U
|
||||||
|
struct ospf6_router_lsa {
|
||||||
|
uint8_t bits;
|
||||||
|
uint8_t options[3];
|
||||||
|
/* followed by ospf6_router_lsdesc(s) */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Link State Description in Router-LSA */
|
||||||
|
#define OSPF6_ROUTER_LSDESC_FIX_SIZE 16U
|
||||||
|
struct ospf6_router_lsdesc {
|
||||||
|
uint8_t type;
|
||||||
|
uint8_t reserved;
|
||||||
|
uint16_t metric; /* output cost */
|
||||||
|
uint32_t interface_id;
|
||||||
|
uint32_t neighbor_interface_id;
|
||||||
|
in_addr_t neighbor_router_id;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define OSPF6_ROUTER_LSDESC_POINTTOPOINT 1
|
||||||
|
#define OSPF6_ROUTER_LSDESC_TRANSIT_NETWORK 2
|
||||||
|
#define OSPF6_ROUTER_LSDESC_STUB_NETWORK 3
|
||||||
|
#define OSPF6_ROUTER_LSDESC_VIRTUAL_LINK 4
|
||||||
|
|
||||||
|
/* Network-LSA */
|
||||||
|
#define OSPF6_NETWORK_LSA_MIN_SIZE 4U
|
||||||
|
struct ospf6_network_lsa {
|
||||||
|
uint8_t reserved;
|
||||||
|
uint8_t options[3];
|
||||||
|
/* followed by ospf6_network_lsdesc(s) */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Link State Description in Network-LSA */
|
||||||
|
#define OSPF6_NETWORK_LSDESC_FIX_SIZE 4U
|
||||||
|
struct ospf6_network_lsdesc {
|
||||||
|
in_addr_t router_id;
|
||||||
|
};
|
||||||
|
#define NETWORK_LSDESC_GET_NBR_ROUTERID(x) \
|
||||||
|
(((struct ospf6_network_lsdesc *)(x))->router_id)
|
||||||
|
|
||||||
|
/* Inter-Area-Prefix-LSA */
|
||||||
|
#define OSPF6_INTER_PREFIX_LSA_MIN_SIZE 4U /* w/o IPv6 prefix */
|
||||||
|
struct ospf6_inter_prefix_lsa {
|
||||||
|
uint32_t metric;
|
||||||
|
struct ospf6_prefix prefix;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Inter-Area-Router-LSA */
|
||||||
|
#define OSPF6_INTER_ROUTER_LSA_FIX_SIZE 12U
|
||||||
|
struct ospf6_inter_router_lsa {
|
||||||
|
uint8_t mbz;
|
||||||
|
uint8_t options[3];
|
||||||
|
uint32_t metric;
|
||||||
|
uint32_t router_id;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* AS-External-LSA */
|
||||||
|
#define OSPF6_AS_EXTERNAL_LSA_MIN_SIZE 4U /* w/o IPv6 prefix */
|
||||||
|
struct ospf6_as_external_lsa {
|
||||||
|
uint32_t bits_metric;
|
||||||
|
|
||||||
|
struct ospf6_prefix prefix;
|
||||||
|
/* followed by none or one forwarding address */
|
||||||
|
/* followed by none or one external route tag */
|
||||||
|
/* followed by none or one referenced LS-ID */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* FIXME: move nssa lsa here. */
|
||||||
|
|
||||||
|
/* Link-LSA */
|
||||||
|
#define OSPF6_LINK_LSA_MIN_SIZE 24U /* w/o 1st IPv6 prefix */
|
||||||
|
struct ospf6_link_lsa {
|
||||||
|
uint8_t priority;
|
||||||
|
uint8_t options[3];
|
||||||
|
struct in6_addr linklocal_addr;
|
||||||
|
uint32_t prefix_num;
|
||||||
|
/* followed by ospf6 prefix(es) */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Intra-Area-Prefix-LSA */
|
||||||
|
#define OSPF6_INTRA_PREFIX_LSA_MIN_SIZE 12U /* w/o 1st IPv6 prefix */
|
||||||
|
struct ospf6_intra_prefix_lsa {
|
||||||
|
uint16_t prefix_num;
|
||||||
|
uint16_t ref_type;
|
||||||
|
uint32_t ref_id;
|
||||||
|
in_addr_t ref_adv_router;
|
||||||
|
/* followed by ospf6 prefix(es) */
|
||||||
|
};
|
||||||
|
|
||||||
struct ospf6_lsa {
|
struct ospf6_lsa {
|
||||||
char name[64]; /* dump string */
|
char name[64]; /* dump string */
|
||||||
@ -146,6 +240,7 @@ struct ospf6_lsa {
|
|||||||
bool tobe_acknowledged;
|
bool tobe_acknowledged;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#define OSPF6_LSA_HEADERONLY 0x01
|
#define OSPF6_LSA_HEADERONLY 0x01
|
||||||
#define OSPF6_LSA_FLOODBACK 0x02
|
#define OSPF6_LSA_FLOODBACK 0x02
|
||||||
#define OSPF6_LSA_DUPLICATE 0x04
|
#define OSPF6_LSA_DUPLICATE 0x04
|
||||||
@ -274,4 +369,11 @@ extern void ospf6_flush_self_originated_lsas_now(struct ospf6 *ospf6);
|
|||||||
extern struct ospf6 *ospf6_get_by_lsdb(struct ospf6_lsa *lsa);
|
extern struct ospf6 *ospf6_get_by_lsdb(struct ospf6_lsa *lsa);
|
||||||
struct ospf6_lsa *ospf6_find_external_lsa(struct ospf6 *ospf6,
|
struct ospf6_lsa *ospf6_find_external_lsa(struct ospf6 *ospf6,
|
||||||
struct prefix *p);
|
struct prefix *p);
|
||||||
|
|
||||||
|
void *lsdesc_start_lsa_type(struct ospf6_lsa_header *header, int lsa_type);
|
||||||
|
void *lsdesc_start(struct ospf6_lsa_header *header);
|
||||||
|
|
||||||
|
void *nth_lsdesc(struct ospf6_lsa_header *header, int pos);
|
||||||
|
void *nth_prefix(struct ospf6_lsa_header *header, int pos);
|
||||||
|
|
||||||
#endif /* OSPF6_LSA_H */
|
#endif /* OSPF6_LSA_H */
|
||||||
|
@ -229,8 +229,7 @@ struct ospf6_lsa *ospf6_find_inter_prefix_lsa(struct ospf6 *ospf6,
|
|||||||
struct ospf6_inter_prefix_lsa *prefix_lsa;
|
struct ospf6_inter_prefix_lsa *prefix_lsa;
|
||||||
struct prefix prefix;
|
struct prefix prefix;
|
||||||
|
|
||||||
prefix_lsa = (struct ospf6_inter_prefix_lsa *)
|
prefix_lsa = lsa_after_header(lsa->header);
|
||||||
ospf6_lsa_header_end(lsa->header);
|
|
||||||
prefix.family = AF_INET6;
|
prefix.family = AF_INET6;
|
||||||
prefix.prefixlen = prefix_lsa->prefix.prefix_length;
|
prefix.prefixlen = prefix_lsa->prefix.prefix_length;
|
||||||
ospf6_prefix_in6_addr(&prefix.u.prefix6, prefix_lsa,
|
ospf6_prefix_in6_addr(&prefix.u.prefix6, prefix_lsa,
|
||||||
|
@ -33,6 +33,7 @@
|
|||||||
|
|
||||||
#include "ospf6_flood.h"
|
#include "ospf6_flood.h"
|
||||||
#include "ospf6d.h"
|
#include "ospf6d.h"
|
||||||
|
#include "ospf6_tlv.h"
|
||||||
#include "ospf6_gr.h"
|
#include "ospf6_gr.h"
|
||||||
#include <netinet/ip6.h>
|
#include <netinet/ip6.h>
|
||||||
#include "lib/libospf.h"
|
#include "lib/libospf.h"
|
||||||
@ -1303,9 +1304,7 @@ static unsigned ospf6_lsa_examin(struct ospf6_lsa_header *lsah,
|
|||||||
4 bytes of referenced link state ID. */
|
4 bytes of referenced link state ID. */
|
||||||
if (headeronly)
|
if (headeronly)
|
||||||
break;
|
break;
|
||||||
as_external_lsa =
|
as_external_lsa = lsa_after_header(lsah);
|
||||||
(struct ospf6_as_external_lsa
|
|
||||||
*)((caddr_t)lsah + OSPF6_LSA_HEADER_SIZE);
|
|
||||||
exp_length =
|
exp_length =
|
||||||
OSPF6_LSA_HEADER_SIZE + OSPF6_AS_EXTERNAL_LSA_MIN_SIZE;
|
OSPF6_LSA_HEADER_SIZE + OSPF6_AS_EXTERNAL_LSA_MIN_SIZE;
|
||||||
/* To find out if the last optional field (Referenced Link State
|
/* To find out if the last optional field (Referenced Link State
|
||||||
@ -1350,8 +1349,7 @@ static unsigned ospf6_lsa_examin(struct ospf6_lsa_header *lsah,
|
|||||||
by N>=0 IPv6 prefix blocks (with N declared beforehand). */
|
by N>=0 IPv6 prefix blocks (with N declared beforehand). */
|
||||||
if (headeronly)
|
if (headeronly)
|
||||||
break;
|
break;
|
||||||
link_lsa = (struct ospf6_link_lsa *)((caddr_t)lsah
|
link_lsa = lsa_after_header(lsah);
|
||||||
+ OSPF6_LSA_HEADER_SIZE);
|
|
||||||
return ospf6_prefixes_examin(
|
return ospf6_prefixes_examin(
|
||||||
(struct ospf6_prefix *)((caddr_t)link_lsa
|
(struct ospf6_prefix *)((caddr_t)link_lsa
|
||||||
+ OSPF6_LINK_LSA_MIN_SIZE),
|
+ OSPF6_LINK_LSA_MIN_SIZE),
|
||||||
@ -1366,9 +1364,7 @@ static unsigned ospf6_lsa_examin(struct ospf6_lsa_header *lsah,
|
|||||||
*/
|
*/
|
||||||
if (headeronly)
|
if (headeronly)
|
||||||
break;
|
break;
|
||||||
intra_prefix_lsa =
|
intra_prefix_lsa = lsa_after_header(lsah);
|
||||||
(struct ospf6_intra_prefix_lsa
|
|
||||||
*)((caddr_t)lsah + OSPF6_LSA_HEADER_SIZE);
|
|
||||||
return ospf6_prefixes_examin(
|
return ospf6_prefixes_examin(
|
||||||
(struct ospf6_prefix
|
(struct ospf6_prefix
|
||||||
*)((caddr_t)intra_prefix_lsa
|
*)((caddr_t)intra_prefix_lsa
|
||||||
|
@ -30,6 +30,7 @@
|
|||||||
#include "ospf6_lsa.h"
|
#include "ospf6_lsa.h"
|
||||||
#include "ospf6_spf.h"
|
#include "ospf6_spf.h"
|
||||||
#include "ospf6_zebra.h"
|
#include "ospf6_zebra.h"
|
||||||
|
#include "ospf6_tlv.h"
|
||||||
#include "ospf6_gr.h"
|
#include "ospf6_gr.h"
|
||||||
#include "lib/json.h"
|
#include "lib/json.h"
|
||||||
|
|
||||||
|
@ -52,8 +52,7 @@ static int ospf6_abr_nssa_am_elected(struct ospf6_area *oa)
|
|||||||
|
|
||||||
/* Verify all the router LSA to compare the router ID */
|
/* Verify all the router LSA to compare the router ID */
|
||||||
for (ALL_LSDB_TYPED(oa->lsdb, type, lsa)) {
|
for (ALL_LSDB_TYPED(oa->lsdb, type, lsa)) {
|
||||||
router_lsa = (struct ospf6_router_lsa *)ospf6_lsa_header_end(
|
router_lsa = lsa_after_header(lsa->header);
|
||||||
lsa->header);
|
|
||||||
|
|
||||||
/* ignore non-ABR routers */
|
/* ignore non-ABR routers */
|
||||||
if (!CHECK_FLAG(router_lsa->bits, OSPF6_ROUTER_BIT_B))
|
if (!CHECK_FLAG(router_lsa->bits, OSPF6_ROUTER_BIT_B))
|
||||||
@ -414,8 +413,7 @@ static struct ospf6_lsa *ospf6_lsa_translated_nssa_new(struct ospf6_area *area,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* find the translated Type-5 for this Type-7 */
|
/* find the translated Type-5 for this Type-7 */
|
||||||
nssa = (struct ospf6_as_external_lsa *)ospf6_lsa_header_end(
|
nssa = lsa_after_header(type7->header);
|
||||||
type7->header);
|
|
||||||
prefix.family = AF_INET6;
|
prefix.family = AF_INET6;
|
||||||
prefix.prefixlen = nssa->prefix.prefix_length;
|
prefix.prefixlen = nssa->prefix.prefix_length;
|
||||||
ospf6_prefix_in6_addr(&prefix.u.prefix6, nssa, &nssa->prefix);
|
ospf6_prefix_in6_addr(&prefix.u.prefix6, nssa, &nssa->prefix);
|
||||||
@ -435,10 +433,8 @@ static struct ospf6_lsa *ospf6_lsa_translated_nssa_new(struct ospf6_area *area,
|
|||||||
/* prepare buffer */
|
/* prepare buffer */
|
||||||
memset(buffer, 0, sizeof(buffer));
|
memset(buffer, 0, sizeof(buffer));
|
||||||
lsa_header = (struct ospf6_lsa_header *)buffer;
|
lsa_header = (struct ospf6_lsa_header *)buffer;
|
||||||
extnew = (struct ospf6_as_external_lsa *)ospf6_lsa_header_end(
|
extnew = lsa_after_header(lsa_header);
|
||||||
lsa_header);
|
ext = lsa_after_header(type7->header);
|
||||||
ext = (struct ospf6_as_external_lsa *)ospf6_lsa_header_end(
|
|
||||||
type7->header);
|
|
||||||
old_ptr =
|
old_ptr =
|
||||||
(caddr_t)((caddr_t)ext + sizeof(struct ospf6_as_external_lsa));
|
(caddr_t)((caddr_t)ext + sizeof(struct ospf6_as_external_lsa));
|
||||||
new_ptr = (caddr_t)((caddr_t)extnew
|
new_ptr = (caddr_t)((caddr_t)extnew
|
||||||
@ -546,8 +542,7 @@ struct ospf6_lsa *ospf6_translated_nssa_refresh(struct ospf6_area *area,
|
|||||||
"%s: try to find translated Type-5 LSA for %s",
|
"%s: try to find translated Type-5 LSA for %s",
|
||||||
__func__, type7->name);
|
__func__, type7->name);
|
||||||
|
|
||||||
ext_lsa = (struct ospf6_as_external_lsa *)ospf6_lsa_header_end(
|
ext_lsa = lsa_after_header(type7->header);
|
||||||
type7->header);
|
|
||||||
prefix.family = AF_INET6;
|
prefix.family = AF_INET6;
|
||||||
prefix.prefixlen = ext_lsa->prefix.prefix_length;
|
prefix.prefixlen = ext_lsa->prefix.prefix_length;
|
||||||
ospf6_prefix_in6_addr(&prefix.u.prefix6, ext_lsa,
|
ospf6_prefix_in6_addr(&prefix.u.prefix6, ext_lsa,
|
||||||
@ -614,8 +609,7 @@ static void ospf6_abr_translate_nssa(struct ospf6_area *area,
|
|||||||
struct ospf6 *ospf6;
|
struct ospf6 *ospf6;
|
||||||
|
|
||||||
ospf6 = area->ospf6;
|
ospf6 = area->ospf6;
|
||||||
nssa_lsa = (struct ospf6_as_external_lsa *)ospf6_lsa_header_end(
|
nssa_lsa = lsa_after_header(lsa->header);
|
||||||
lsa->header);
|
|
||||||
|
|
||||||
if (!CHECK_FLAG(nssa_lsa->prefix.prefix_options,
|
if (!CHECK_FLAG(nssa_lsa->prefix.prefix_options,
|
||||||
OSPF6_PREFIX_OPTION_P)) {
|
OSPF6_PREFIX_OPTION_P)) {
|
||||||
@ -1240,8 +1234,7 @@ void ospf6_nssa_lsa_originate(struct ospf6_route *route,
|
|||||||
/* prepare buffer */
|
/* prepare buffer */
|
||||||
memset(buffer, 0, sizeof(buffer));
|
memset(buffer, 0, sizeof(buffer));
|
||||||
lsa_header = (struct ospf6_lsa_header *)buffer;
|
lsa_header = (struct ospf6_lsa_header *)buffer;
|
||||||
as_external_lsa = (struct ospf6_as_external_lsa *)ospf6_lsa_header_end(
|
as_external_lsa = lsa_after_header(lsa_header);
|
||||||
lsa_header);
|
|
||||||
p = (caddr_t)((caddr_t)as_external_lsa
|
p = (caddr_t)((caddr_t)as_external_lsa
|
||||||
+ sizeof(struct ospf6_as_external_lsa));
|
+ sizeof(struct ospf6_as_external_lsa));
|
||||||
|
|
||||||
|
@ -16,11 +16,12 @@
|
|||||||
#define ALLSPFROUTERS6 "ff02::5"
|
#define ALLSPFROUTERS6 "ff02::5"
|
||||||
#define ALLDROUTERS6 "ff02::6"
|
#define ALLDROUTERS6 "ff02::6"
|
||||||
|
|
||||||
#define OSPF6_ROUTER_BIT_W (1 << 3)
|
/* RFC 5340 A.4.3 Router-LSAs Options field */
|
||||||
|
#define OSPF6_ROUTER_BIT_NT (1 << 4)
|
||||||
|
#define OSPF6_ROUTER_BIT_W (1 << 3) /* DEPRECATED */
|
||||||
#define OSPF6_ROUTER_BIT_V (1 << 2)
|
#define OSPF6_ROUTER_BIT_V (1 << 2)
|
||||||
#define OSPF6_ROUTER_BIT_E (1 << 1)
|
#define OSPF6_ROUTER_BIT_E (1 << 1)
|
||||||
#define OSPF6_ROUTER_BIT_B (1 << 0)
|
#define OSPF6_ROUTER_BIT_B (1 << 0)
|
||||||
#define OSPF6_ROUTER_BIT_NT (1 << 4)
|
|
||||||
|
|
||||||
|
|
||||||
/* OSPF options */
|
/* OSPF options */
|
||||||
|
@ -16,11 +16,11 @@
|
|||||||
#include "frrevent.h"
|
#include "frrevent.h"
|
||||||
#include "lib_errors.h"
|
#include "lib_errors.h"
|
||||||
|
|
||||||
|
#include "ospf6_proto.h"
|
||||||
#include "ospf6_lsa.h"
|
#include "ospf6_lsa.h"
|
||||||
#include "ospf6_lsdb.h"
|
#include "ospf6_lsdb.h"
|
||||||
#include "ospf6_route.h"
|
#include "ospf6_route.h"
|
||||||
#include "ospf6_area.h"
|
#include "ospf6_area.h"
|
||||||
#include "ospf6_proto.h"
|
|
||||||
#include "ospf6_abr.h"
|
#include "ospf6_abr.h"
|
||||||
#include "ospf6_asbr.h"
|
#include "ospf6_asbr.h"
|
||||||
#include "ospf6_spf.h"
|
#include "ospf6_spf.h"
|
||||||
@ -290,8 +290,7 @@ static void ospf6_nexthop_calc(struct ospf6_vertex *w, struct ospf6_vertex *v,
|
|||||||
!= lsa->header->id)
|
!= lsa->header->id)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
link_lsa = (struct ospf6_link_lsa *)ospf6_lsa_header_end(
|
link_lsa = lsa_after_header(lsa->header);
|
||||||
lsa->header);
|
|
||||||
if (IS_OSPF6_DEBUG_SPF(PROCESS)) {
|
if (IS_OSPF6_DEBUG_SPF(PROCESS)) {
|
||||||
inet_ntop(AF_INET6, &link_lsa->linklocal_addr, buf,
|
inet_ntop(AF_INET6, &link_lsa->linklocal_addr, buf,
|
||||||
sizeof(buf));
|
sizeof(buf));
|
||||||
@ -1136,8 +1135,7 @@ int ospf6_ase_calculate_route(struct ospf6 *ospf6, struct ospf6_lsa *lsa,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
external = (struct ospf6_as_external_lsa *)ospf6_lsa_header_end(
|
external = lsa_after_header(lsa->header);
|
||||||
lsa->header);
|
|
||||||
prefix.family = AF_INET6;
|
prefix.family = AF_INET6;
|
||||||
prefix.prefixlen = external->prefix.prefix_length;
|
prefix.prefixlen = external->prefix.prefix_length;
|
||||||
ospf6_prefix_in6_addr(&prefix.u.prefix6, external, &external->prefix);
|
ospf6_prefix_in6_addr(&prefix.u.prefix6, external, &external->prefix);
|
||||||
|
55
ospf6d/ospf6_tlv.h
Normal file
55
ospf6d/ospf6_tlv.h
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
/*
|
||||||
|
* OSPFv3 Type Length Value.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef OSPF6_TLV_H
|
||||||
|
#define OSPF6_TLV_H
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Generic TLV (type, length, value) macros
|
||||||
|
*/
|
||||||
|
struct tlv_header {
|
||||||
|
uint16_t type; /* Type of Value */
|
||||||
|
uint16_t length; /* Length of Value portion only, in bytes */
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef roundup
|
||||||
|
#define ROUNDUP(val, gran) roundup(val, gran)
|
||||||
|
#else /* roundup */
|
||||||
|
#define ROUNDUP(val, gran) (((val)-1 | (gran)-1) + 1)
|
||||||
|
#endif /* roundup */
|
||||||
|
|
||||||
|
#define TLV_HDR_SIZE (sizeof(struct tlv_header))
|
||||||
|
|
||||||
|
#define TLV_BODY_SIZE(tlvh) (ROUNDUP(ntohs((tlvh)->length), sizeof(uint32_t)))
|
||||||
|
|
||||||
|
#define TLV_SIZE(tlvh) ((uint32_t)(TLV_HDR_SIZE + TLV_BODY_SIZE(tlvh)))
|
||||||
|
|
||||||
|
#define TLV_HDR_NEXT(tlvh) \
|
||||||
|
((struct tlv_header *)((char *)(tlvh) + TLV_SIZE(tlvh)))
|
||||||
|
|
||||||
|
/*
|
||||||
|
* RFC 5187 - OSPFv3 Graceful Restart - Grace-LSA
|
||||||
|
* Graceful restart predates Extended-LSA TLVs and IANA TLV register.
|
||||||
|
*/
|
||||||
|
/* Grace period TLV. */
|
||||||
|
#define TLV_GRACE_PERIOD_TYPE 1
|
||||||
|
#define TLV_GRACE_PERIOD_LENGTH 4
|
||||||
|
struct tlv_grace_period {
|
||||||
|
struct tlv_header header;
|
||||||
|
uint32_t interval;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Restart reason TLV. */
|
||||||
|
#define TLV_GRACE_RESTART_REASON_TYPE 2
|
||||||
|
#define TLV_GRACE_RESTART_REASON_LENGTH 1
|
||||||
|
struct tlv_grace_restart_reason {
|
||||||
|
struct tlv_header header;
|
||||||
|
uint8_t reason;
|
||||||
|
uint8_t reserved[3];
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* OSPF6_TLV_H */
|
@ -37,6 +37,7 @@
|
|||||||
#include "ospf6_intra.h"
|
#include "ospf6_intra.h"
|
||||||
#include "ospf6_spf.h"
|
#include "ospf6_spf.h"
|
||||||
#include "ospf6d.h"
|
#include "ospf6d.h"
|
||||||
|
#include "ospf6_tlv.h"
|
||||||
#include "ospf6_gr.h"
|
#include "ospf6_gr.h"
|
||||||
#include "lib/json.h"
|
#include "lib/json.h"
|
||||||
#include "ospf6_nssa.h"
|
#include "ospf6_nssa.h"
|
||||||
|
@ -27,6 +27,7 @@
|
|||||||
#include "ospf6_zebra.h"
|
#include "ospf6_zebra.h"
|
||||||
#include "ospf6d.h"
|
#include "ospf6d.h"
|
||||||
#include "ospf6_area.h"
|
#include "ospf6_area.h"
|
||||||
|
#include "ospf6_tlv.h"
|
||||||
#include "ospf6_gr.h"
|
#include "ospf6_gr.h"
|
||||||
#include "lib/json.h"
|
#include "lib/json.h"
|
||||||
|
|
||||||
|
@ -30,6 +30,7 @@
|
|||||||
#include "ospf6_flood.h"
|
#include "ospf6_flood.h"
|
||||||
#include "ospf6d.h"
|
#include "ospf6d.h"
|
||||||
#include "ospf6_bfd.h"
|
#include "ospf6_bfd.h"
|
||||||
|
#include "ospf6_tlv.h"
|
||||||
#include "ospf6_gr.h"
|
#include "ospf6_gr.h"
|
||||||
#include "lib/json.h"
|
#include "lib/json.h"
|
||||||
#include "ospf6_nssa.h"
|
#include "ospf6_nssa.h"
|
||||||
|
@ -58,6 +58,7 @@ noinst_HEADERS += \
|
|||||||
ospf6d/ospf6_route.h \
|
ospf6d/ospf6_route.h \
|
||||||
ospf6d/ospf6_routemap_nb.h \
|
ospf6d/ospf6_routemap_nb.h \
|
||||||
ospf6d/ospf6_spf.h \
|
ospf6d/ospf6_spf.h \
|
||||||
|
ospf6d/ospf6_tlv.h \
|
||||||
ospf6d/ospf6_top.h \
|
ospf6d/ospf6_top.h \
|
||||||
ospf6d/ospf6_zebra.h \
|
ospf6d/ospf6_zebra.h \
|
||||||
ospf6d/ospf6d.h \
|
ospf6d/ospf6d.h \
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
#include "vector.h"
|
#include "vector.h"
|
||||||
#include "vty.h"
|
#include "vty.h"
|
||||||
|
|
||||||
|
#include "ospf6d/ospf6_proto.h" /* for struct ospf6_prefix */
|
||||||
#include "ospf6d/ospf6_lsa.h"
|
#include "ospf6d/ospf6_lsa.h"
|
||||||
#include "ospf6d/ospf6_lsdb.h"
|
#include "ospf6d/ospf6_lsdb.h"
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user