summaryrefslogtreecommitdiff
path: root/eigrpd/eigrp_reply.c
diff options
context:
space:
mode:
authorDonald Sharp <sharpd@cumulusnetworks.com>2017-08-26 09:15:58 -0400
committerDonald Sharp <sharpd@cumulusnetworks.com>2017-08-26 09:15:58 -0400
commit71b52ef23ad7cbf5865f47a6211a77214d8fd321 (patch)
tree99f19a77b61f4e9df8540a13e8b522319194de4c /eigrpd/eigrp_reply.c
parent3a45a729a3e4a36becc81ee87a2170c20e8c5d6c (diff)
eigrpd: Refactor access/prefix list applications
There was allot of code cut-n-pasting to apply the prefix/access lists. Refactor to simplify code. Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
Diffstat (limited to 'eigrpd/eigrp_reply.c')
-rw-r--r--eigrpd/eigrp_reply.c95
1 files changed, 20 insertions, 75 deletions
diff --git a/eigrpd/eigrp_reply.c b/eigrpd/eigrp_reply.c
index 2b5b0aa44b..11e6e855c3 100644
--- a/eigrpd/eigrp_reply.c
+++ b/eigrpd/eigrp_reply.c
@@ -64,43 +64,20 @@ void eigrp_send_reply(struct eigrp_neighbor *nbr, struct eigrp_prefix_entry *pe)
{
struct eigrp_packet *ep;
u_int16_t length = EIGRP_HEADER_LEN;
-
- struct access_list *alist;
- struct prefix_list *plist;
- struct access_list *alist_i;
- struct prefix_list *plist_i;
- struct eigrp *e;
+ struct eigrp_interface *ei = nbr->ei;
+ struct eigrp *eigrp = ei->eigrp;
struct eigrp_prefix_entry *pe2;
// TODO: Work in progress
/* Filtering */
/* get list from eigrp process */
- e = eigrp_lookup();
pe2 = XCALLOC(MTYPE_EIGRP_PREFIX_ENTRY,
sizeof(struct eigrp_prefix_entry));
memcpy(pe2, pe, sizeof(struct eigrp_prefix_entry));
- /* Get access-lists and prefix-lists from process and interface */
- alist = e->list[EIGRP_FILTER_OUT];
- plist = e->prefix[EIGRP_FILTER_OUT];
- alist_i = nbr->ei->list[EIGRP_FILTER_OUT];
- plist_i = nbr->ei->prefix[EIGRP_FILTER_OUT];
-
- /* Check if any list fits */
- if ((alist
- && access_list_apply(alist, pe2->destination)
- == FILTER_DENY)
- || (plist
- && prefix_list_apply(plist,
- pe2->destination)
- == PREFIX_DENY)
- || (alist_i
- && access_list_apply(alist_i,
- pe2->destination)
- == FILTER_DENY)
- || (plist_i
- && prefix_list_apply(plist_i,
- pe2->destination)
- == PREFIX_DENY)) {
+
+ if (eigrp_update_prefix_apply(eigrp, ei,
+ EIGRP_FILTER_OUT,
+ pe2->destination)) {
zlog_info("REPLY SEND: Setting Metric to max");
pe2->reported_metric.delay = EIGRP_MAX_METRIC;
@@ -110,34 +87,34 @@ void eigrp_send_reply(struct eigrp_neighbor *nbr, struct eigrp_prefix_entry *pe)
* End of filtering
*/
- ep = eigrp_packet_new(nbr->ei->ifp->mtu, nbr);
+ ep = eigrp_packet_new(ei->ifp->mtu, nbr);
/* Prepare EIGRP INIT UPDATE header */
- eigrp_packet_header_init(EIGRP_OPC_REPLY, e, ep->s, 0,
- nbr->ei->eigrp->sequence_number, 0);
+ eigrp_packet_header_init(EIGRP_OPC_REPLY, eigrp, ep->s, 0,
+ eigrp->sequence_number, 0);
// encode Authentication TLV, if needed
- if ((IF_DEF_PARAMS(nbr->ei->ifp)->auth_type == EIGRP_AUTH_TYPE_MD5)
- && (IF_DEF_PARAMS(nbr->ei->ifp)->auth_keychain != NULL)) {
- length += eigrp_add_authTLV_MD5_to_stream(ep->s, nbr->ei);
+ if ((IF_DEF_PARAMS(ei->ifp)->auth_type == EIGRP_AUTH_TYPE_MD5)
+ && (IF_DEF_PARAMS(ei->ifp)->auth_keychain != NULL)) {
+ length += eigrp_add_authTLV_MD5_to_stream(ep->s, ei);
}
length += eigrp_add_internalTLV_to_stream(ep->s, pe2);
- if ((IF_DEF_PARAMS(nbr->ei->ifp)->auth_type == EIGRP_AUTH_TYPE_MD5)
- && (IF_DEF_PARAMS(nbr->ei->ifp)->auth_keychain != NULL)) {
- eigrp_make_md5_digest(nbr->ei, ep->s, EIGRP_AUTH_UPDATE_FLAG);
+ if ((IF_DEF_PARAMS(ei->ifp)->auth_type == EIGRP_AUTH_TYPE_MD5)
+ && (IF_DEF_PARAMS(ei->ifp)->auth_keychain != NULL)) {
+ eigrp_make_md5_digest(ei, ep->s, EIGRP_AUTH_UPDATE_FLAG);
}
/* EIGRP Checksum */
- eigrp_packet_checksum(nbr->ei, ep->s, length);
+ eigrp_packet_checksum(ei, ep->s, length);
ep->length = length;
ep->dst.s_addr = nbr->src.s_addr;
/*This ack number we await from neighbor*/
- ep->sequence_number = nbr->ei->eigrp->sequence_number;
+ ep->sequence_number = eigrp->sequence_number;
/*Put packet to retransmission queue*/
eigrp_fifo_push(nbr->retrans_queue, ep);
@@ -157,12 +134,6 @@ void eigrp_reply_receive(struct eigrp *eigrp, struct ip *iph,
struct eigrp_neighbor *nbr;
struct TLV_IPv4_Internal_type *tlv;
- struct access_list *alist;
- struct prefix_list *plist;
- struct access_list *alist_i;
- struct prefix_list *plist_i;
- struct eigrp *e;
-
u_int16_t type;
/* increment statistics. */
@@ -200,35 +171,9 @@ void eigrp_reply_receive(struct eigrp *eigrp, struct ip *iph,
struct eigrp_neighbor_entry *entry =
eigrp_prefix_entry_lookup(dest->entries, nbr);
- /*
- * Filtering
- */
- // TODO: Work in progress
- /* get list from eigrp process */
- e = eigrp_lookup();
- /* Get access-lists and prefix-lists from process and
- * interface */
- alist = e->list[EIGRP_FILTER_IN];
- plist = e->prefix[EIGRP_FILTER_IN];
- alist_i = ei->list[EIGRP_FILTER_IN];
- plist_i = ei->prefix[EIGRP_FILTER_IN];
- /* Check if any list fits */
- if ((alist
- && access_list_apply(alist,
- (struct prefix *)&dest_addr)
- == FILTER_DENY)
- || (plist
- && prefix_list_apply(
- plist, (struct prefix *)&dest_addr)
- == PREFIX_DENY)
- || (alist_i
- && access_list_apply(
- alist_i, (struct prefix *)&dest_addr)
- == FILTER_DENY)
- || (plist_i
- && prefix_list_apply(
- plist_i, (struct prefix *)&dest_addr)
- == PREFIX_DENY)) {
+ if (eigrp_update_prefix_apply(eigrp, ei,
+ EIGRP_FILTER_IN,
+ &dest_addr)) {
tlv->metric.delay = EIGRP_MAX_METRIC;
}
/*