version 1.1.1.2, 2013/07/21 23:54:40
|
version 1.1.1.3, 2016/11/02 10:09:12
|
Line 23
|
Line 23
|
#include <zebra.h> |
#include <zebra.h> |
|
|
#ifdef SUPPORT_OSPF_API |
#ifdef SUPPORT_OSPF_API |
#ifndef HAVE_OPAQUE_LSA |
|
#error "Core Opaque-LSA module must be configured." |
|
#endif /* HAVE_OPAQUE_LSA */ |
|
|
|
#include "linklist.h" |
#include "linklist.h" |
#include "prefix.h" |
#include "prefix.h" |
Line 464 new_msg_register_event (u_int32_t seqnum, struct lsa_f
|
Line 461 new_msg_register_event (u_int32_t seqnum, struct lsa_f
|
{ |
{ |
u_char buf[OSPF_API_MAX_MSG_SIZE]; |
u_char buf[OSPF_API_MAX_MSG_SIZE]; |
struct msg_register_event *emsg; |
struct msg_register_event *emsg; |
int len; | size_t len; |
|
|
emsg = (struct msg_register_event *) buf; |
emsg = (struct msg_register_event *) buf; |
len = sizeof (struct msg_register_event) + |
len = sizeof (struct msg_register_event) + |
Line 472 new_msg_register_event (u_int32_t seqnum, struct lsa_f
|
Line 469 new_msg_register_event (u_int32_t seqnum, struct lsa_f
|
emsg->filter.typemask = htons (filter->typemask); |
emsg->filter.typemask = htons (filter->typemask); |
emsg->filter.origin = filter->origin; |
emsg->filter.origin = filter->origin; |
emsg->filter.num_areas = filter->num_areas; |
emsg->filter.num_areas = filter->num_areas; |
|
if (len > sizeof (buf)) |
|
len = sizeof(buf); |
|
/* API broken - missing memcpy to fill data */ |
return msg_new (MSG_REGISTER_EVENT, emsg, seqnum, len); |
return msg_new (MSG_REGISTER_EVENT, emsg, seqnum, len); |
} |
} |
|
|
Line 480 new_msg_sync_lsdb (u_int32_t seqnum, struct lsa_filter
|
Line 480 new_msg_sync_lsdb (u_int32_t seqnum, struct lsa_filter
|
{ |
{ |
u_char buf[OSPF_API_MAX_MSG_SIZE]; |
u_char buf[OSPF_API_MAX_MSG_SIZE]; |
struct msg_sync_lsdb *smsg; |
struct msg_sync_lsdb *smsg; |
int len; | size_t len; |
|
|
smsg = (struct msg_sync_lsdb *) buf; |
smsg = (struct msg_sync_lsdb *) buf; |
len = sizeof (struct msg_sync_lsdb) + |
len = sizeof (struct msg_sync_lsdb) + |
Line 488 new_msg_sync_lsdb (u_int32_t seqnum, struct lsa_filter
|
Line 488 new_msg_sync_lsdb (u_int32_t seqnum, struct lsa_filter
|
smsg->filter.typemask = htons (filter->typemask); |
smsg->filter.typemask = htons (filter->typemask); |
smsg->filter.origin = filter->origin; |
smsg->filter.origin = filter->origin; |
smsg->filter.num_areas = filter->num_areas; |
smsg->filter.num_areas = filter->num_areas; |
|
if (len > sizeof (buf)) |
|
len = sizeof(buf); |
|
/* API broken - missing memcpy to fill data */ |
return msg_new (MSG_SYNC_LSDB, smsg, seqnum, len); |
return msg_new (MSG_SYNC_LSDB, smsg, seqnum, len); |
} |
} |
|
|
Line 498 new_msg_originate_request (u_int32_t seqnum,
|
Line 501 new_msg_originate_request (u_int32_t seqnum,
|
struct in_addr area_id, struct lsa_header *data) |
struct in_addr area_id, struct lsa_header *data) |
{ |
{ |
struct msg_originate_request *omsg; |
struct msg_originate_request *omsg; |
int omsglen; | size_t omsglen; |
char buf[OSPF_API_MAX_MSG_SIZE]; |
char buf[OSPF_API_MAX_MSG_SIZE]; |
|
|
omsglen = sizeof (struct msg_originate_request) - sizeof (struct lsa_header) |
|
+ ntohs (data->length); |
|
|
|
omsg = (struct msg_originate_request *) buf; |
omsg = (struct msg_originate_request *) buf; |
omsg->ifaddr = ifaddr; |
omsg->ifaddr = ifaddr; |
omsg->area_id = area_id; |
omsg->area_id = area_id; |
memcpy (&omsg->data, data, ntohs (data->length)); |
|
|
|
|
omsglen = ntohs (data->length); |
|
if (omsglen > sizeof (buf) - offsetof (struct msg_originate_request, data)) |
|
omsglen = sizeof (buf) - offsetof (struct msg_originate_request, data); |
|
memcpy (&omsg->data, data, omsglen); |
|
omsglen += sizeof (struct msg_originate_request) - sizeof (struct lsa_header); |
|
|
return msg_new (MSG_ORIGINATE_REQUEST, omsg, seqnum, omsglen); |
return msg_new (MSG_ORIGINATE_REQUEST, omsg, seqnum, omsglen); |
} |
} |
|
|
Line 622 new_msg_lsa_change_notify (u_char msgtype,
|
Line 627 new_msg_lsa_change_notify (u_char msgtype,
|
{ |
{ |
u_char buf[OSPF_API_MAX_MSG_SIZE]; |
u_char buf[OSPF_API_MAX_MSG_SIZE]; |
struct msg_lsa_change_notify *nmsg; |
struct msg_lsa_change_notify *nmsg; |
int len; | size_t len; |
|
|
assert (data); |
assert (data); |
|
|
nmsg = (struct msg_lsa_change_notify *) buf; |
nmsg = (struct msg_lsa_change_notify *) buf; |
len = ntohs (data->length) + sizeof (struct msg_lsa_change_notify) |
|
- sizeof (struct lsa_header); |
|
nmsg->ifaddr = ifaddr; |
nmsg->ifaddr = ifaddr; |
nmsg->area_id = area_id; |
nmsg->area_id = area_id; |
nmsg->is_self_originated = is_self_originated; |
nmsg->is_self_originated = is_self_originated; |
memset (&nmsg->pad, 0, sizeof (nmsg->pad)); |
memset (&nmsg->pad, 0, sizeof (nmsg->pad)); |
memcpy (&nmsg->data, data, ntohs (data->length)); | |
| len = ntohs (data->length); |
| if (len > sizeof (buf) - offsetof (struct msg_lsa_change_notify, data)) |
| len = sizeof (buf) - offsetof (struct msg_lsa_change_notify, data); |
| memcpy (&nmsg->data, data, len); |
| len += sizeof (struct msg_lsa_change_notify) - sizeof (struct lsa_header); |
|
|
return msg_new (msgtype, nmsg, seqnum, len); |
return msg_new (msgtype, nmsg, seqnum, len); |
} |
} |