/* Inteface addition message from zebra. */ static int ospf_interface_add (int command, struct zclient *zclient, zebra_size_t length) { struct interface *ifp; ifp = zebra_interface_add_read (zclient->ibuf); if (IS_DEBUG_OSPF (zebra, ZEBRA_INTERFACE)) zlog_debug ("Zebra: interface add %s index %d flags %llx metric %d mtu %d", ifp->name, ifp->ifindex, (unsigned long long)ifp->flags, ifp->metric, ifp->mtu); assert (ifp->info); if (!OSPF_IF_PARAM_CONFIGURED (IF_DEF_PARAMS (ifp), type)) { SET_IF_PARAM (IF_DEF_PARAMS (ifp), type); IF_DEF_PARAMS (ifp)->type = ospf_default_iftype(ifp); } ospf_if_update (NULL, ifp); #ifdef HAVE_SNMP ospf_snmp_if_update (ifp); #endif /* HAVE_SNMP */ return 0; }
int ospf_if_get_output_cost (struct ospf_interface *oi) { /* If all else fails, use default OSPF cost */ u_int32_t cost; u_int32_t bw, refbw; bw = oi->ifp->bandwidth ? oi->ifp->bandwidth : OSPF_DEFAULT_BANDWIDTH; refbw = oi->ospf->ref_bandwidth; /* A specifed ip ospf cost overrides a calculated one. */ if (OSPF_IF_PARAM_CONFIGURED (IF_DEF_PARAMS (oi->ifp), output_cost_cmd) || OSPF_IF_PARAM_CONFIGURED (oi->params, output_cost_cmd)) cost = OSPF_IF_PARAM (oi, output_cost_cmd); /* See if a cost can be calculated from the zebra processes interface bandwidth field. */ else { cost = (u_int32_t) ((double)refbw / (double)bw + (double)0.5); if (cost < 1) cost = 1; else if (cost > 65535) cost = 65535; } return cost; }
/*send EIGRP Update packet*/ void eigrp_update_send_init (struct eigrp_neighbor *nbr) { struct eigrp_packet *ep; u_int16_t length = EIGRP_HEADER_LEN; ep = eigrp_packet_new(nbr->ei->ifp->mtu); /* Prepare EIGRP INIT UPDATE header */ if (IS_DEBUG_EIGRP_PACKET(0, RECV)) zlog_debug("Enqueuing Update Init Seq [%u] Ack [%u]", nbr->ei->eigrp->sequence_number, nbr->recv_sequence_number); eigrp_packet_header_init(EIGRP_OPC_UPDATE, nbr->ei, ep->s, EIGRP_INIT_FLAG, nbr->ei->eigrp->sequence_number, nbr->recv_sequence_number); // 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); eigrp_make_md5_digest(nbr->ei,ep->s, EIGRP_AUTH_UPDATE_INIT_FLAG); } /* EIGRP Checksum */ eigrp_packet_checksum(nbr->ei, ep->s, length); ep->length = length; ep->dst.s_addr = nbr->src.s_addr; /*This ack number we await from neighbor*/ nbr->init_sequence_number = nbr->ei->eigrp->sequence_number; ep->sequence_number = nbr->ei->eigrp->sequence_number; if (IS_DEBUG_EIGRP_PACKET(0, RECV)) zlog_debug("Enqueuing Update Init Len [%u] Seq [%u] Dest [%s]", ep->length, ep->sequence_number, inet_ntoa(ep->dst)); /*Put packet to retransmission queue*/ eigrp_fifo_push_head(nbr->retrans_queue, ep); if (nbr->retrans_queue->count == 1) { eigrp_send_packet_reliably(nbr); } }
void eigrp_send_siaquery (struct eigrp_neighbor *nbr, struct eigrp_prefix_entry *pe) { struct eigrp_packet *ep, *duplicate; u_int16_t length = EIGRP_HEADER_LEN; struct listnode *node, *nnode, *node2, *nnode2; ep = eigrp_packet_new(nbr->ei->ifp->mtu); /* Prepare EIGRP INIT UPDATE header */ eigrp_packet_header_init(EIGRP_OPC_SIAQUERY, nbr->ei, ep->s, 0, nbr->ei->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); } length += eigrp_add_internalTLV_to_stream(ep->s, pe); 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); } /* EIGRP Checksum */ eigrp_packet_checksum(nbr->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; if (nbr->state == EIGRP_NEIGHBOR_UP) { /*Put packet to retransmission queue*/ eigrp_fifo_push_head(nbr->retrans_queue, ep); if (nbr->retrans_queue->count == 1) { eigrp_send_packet_reliably(nbr); } } }
void eigrp_send_query (struct eigrp_interface *ei) { struct eigrp_packet *ep, *duplicate; u_int16_t length = EIGRP_HEADER_LEN; struct listnode *node, *nnode, *node2, *nnode2; struct eigrp_neighbor *nbr; struct eigrp_prefix_entry *pe; char has_tlv; ep = eigrp_packet_new(ei->ifp->mtu); /* Prepare EIGRP INIT UPDATE header */ eigrp_packet_header_init(EIGRP_OPC_QUERY, ei, ep->s, 0, ei->eigrp->sequence_number, 0); // encode Authentication TLV, if needed 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); } has_tlv = 0; for (ALL_LIST_ELEMENTS(ei->eigrp->topology_changes_internalIPV4, node, nnode, pe)) { if(pe->req_action & EIGRP_FSM_NEED_QUERY) { length += eigrp_add_internalTLV_to_stream(ep->s, pe); for (ALL_LIST_ELEMENTS(ei->nbrs, node2, nnode2, nbr)) { if(nbr->state == EIGRP_NEIGHBOR_UP) { listnode_add(pe->rij, nbr); has_tlv = 1; } } } }
static int ospf_if_delete_hook (struct interface *ifp) { int rc = 0; struct route_node *rn; rc = ospf_opaque_del_if (ifp); route_table_finish (IF_OIFS (ifp)); for (rn = route_top (IF_OIFS_PARAMS (ifp)); rn; rn = route_next (rn)) if (rn->info) ospf_del_if_params (rn->info); route_table_finish (IF_OIFS_PARAMS (ifp)); ospf_del_if_params ((struct ospf_if_params *) IF_DEF_PARAMS (ifp)); XFREE (MTYPE_OSPF_IF_INFO, ifp->info); ifp->info = NULL; return rc; }
/** * @fn eigrp_update_send_GR_part * * @param[in] nbr contains neighbor who would receive Graceful restart * * @return void * * @par * Function used for sending Graceful restart Update packet * and if there are multiple chunks, send only one of them. * It is called from thread. Do not call it directly. * * Uses nbr_gr_packet_type from neighbor. */ static void eigrp_update_send_GR_part(struct eigrp_neighbor *nbr) { struct eigrp_packet *ep; u_int16_t length = EIGRP_HEADER_LEN; struct listnode *node, *nnode; struct eigrp_prefix_entry *pe; struct prefix_ipv4 *dest_addr; struct eigrp *e; struct access_list *alist, *alist_i; struct prefix_list *plist, *plist_i; struct list *prefixes; u_int32_t flags; unsigned int send_prefixes; struct TLV_IPv4_Internal_type *tlv_max; /* get prefixes to send to neighbor */ prefixes = nbr->nbr_gr_prefixes_send; send_prefixes = 0; length = EIGRP_HEADER_LEN; /* if there already were last packet chunk, we won't continue */ if(nbr->nbr_gr_packet_type == EIGRP_PACKET_PART_LAST) return; /* if this is first packet chunk, we need to decide, * if there will be one or more chunks */ if(nbr->nbr_gr_packet_type == EIGRP_PACKET_PART_FIRST) { if(prefixes->count <= EIGRP_TLV_MAX_IPv4) { /* there will be only one chunk */ flags = EIGRP_INIT_FLAG + EIGRP_RS_FLAG + EIGRP_EOT_FLAG; nbr->nbr_gr_packet_type = EIGRP_PACKET_PART_LAST; } else { /* there will be more chunks */ flags = EIGRP_INIT_FLAG + EIGRP_RS_FLAG; nbr->nbr_gr_packet_type = EIGRP_PACKET_PART_NA; } } else { /* this is not first chunk, and we need to decide, * if there will be more chunks */ if(prefixes->count <= EIGRP_TLV_MAX_IPv4) { /* this is last chunk */ flags = EIGRP_EOT_FLAG; nbr->nbr_gr_packet_type = EIGRP_PACKET_PART_LAST; } else { /* there will be more chunks */ flags = 0; nbr->nbr_gr_packet_type = EIGRP_PACKET_PART_NA; } } ep = eigrp_packet_new(nbr->ei->ifp->mtu); /* Prepare EIGRP Graceful restart UPDATE header */ eigrp_packet_header_init(EIGRP_OPC_UPDATE, nbr->ei, ep->s, flags, nbr->ei->eigrp->sequence_number, nbr->recv_sequence_number); // 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); } for (ALL_LIST_ELEMENTS(nbr->ei->eigrp->topology_table, node, nnode, pe)) { /* * Filtering */ dest_addr = pe->destination_ipv4; /* get list from eigrp process */ e = eigrp_lookup(); /* 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, (struct prefix *) dest_addr) == FILTER_DENY)|| (plist && prefix_list_apply (plist, (struct prefix *) dest_addr) == FILTER_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) == FILTER_DENY)) { /* do not send filtered route */ zlog_info("Filtered prefix %s won't be sent out.", inet_ntoa(dest_addr->prefix)); } else { /* sending route which wasn't filtered */ length += eigrp_add_internalTLV_to_stream(ep->s, pe); send_prefixes++; } alist = e->list[EIGRP_FILTER_IN]; plist = e->prefix[EIGRP_FILTER_IN]; alist_i = nbr->ei->list[EIGRP_FILTER_IN]; plist_i = nbr->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) == FILTER_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) == FILTER_DENY)) { /* do not send filtered route */ zlog_info("Filtered prefix %s will be removed.", inet_ntoa(dest_addr->prefix)); tlv_max = eigrp_IPv4_InternalTLV_new(); tlv_max->type = EIGRP_TLV_IPv4_INT; tlv_max->length = 28U; tlv_max->metric = pe->reported_metric; /* set delay to MAX */ tlv_max->metric.delay = EIGRP_MAX_METRIC; tlv_max->destination = pe->destination_ipv4->prefix; tlv_max->prefix_length = pe->destination_ipv4->prefixlen; /* prepare message for FSM */ struct eigrp_fsm_action_message *fsm_msg; fsm_msg = XCALLOC(MTYPE_EIGRP_FSM_MSG, sizeof(struct eigrp_fsm_action_message)); struct eigrp_neighbor_entry *entry = eigrp_prefix_entry_lookup(pe->entries, nbr); fsm_msg->packet_type = EIGRP_OPC_UPDATE; fsm_msg->eigrp = e; fsm_msg->data_type = EIGRP_TLV_IPv4_INT; fsm_msg->adv_router = nbr; fsm_msg->data.ipv4_int_type = tlv_max; fsm_msg->entry = entry; fsm_msg->prefix = pe; /* send message to FSM */ int event = eigrp_get_fsm_event(fsm_msg); eigrp_fsm_event(fsm_msg, event); /* free memory used by TLV */ eigrp_IPv4_InternalTLV_free (tlv_max); } /* * End of filtering */ /* NULL the pointer */ dest_addr = NULL; /* delete processed prefix from list */ listnode_delete(prefixes, pe); /* if there are enough prefixes, send packet */ if(send_prefixes >= EIGRP_TLV_MAX_IPv4) break; } /* compute Auth digest */ 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); } /* EIGRP Checksum */ eigrp_packet_checksum(nbr->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; if (IS_DEBUG_EIGRP_PACKET(0, RECV)) zlog_debug("Enqueuing Update Init Len [%u] Seq [%u] Dest [%s]", ep->length, ep->sequence_number, inet_ntoa(ep->dst)); /*Put packet to retransmission queue*/ eigrp_fifo_push_head(nbr->retrans_queue, ep); if (nbr->retrans_queue->count == 1) { eigrp_send_packet_reliably(nbr); } }
void eigrp_update_send (struct eigrp_interface *ei) { struct eigrp_packet *ep; struct listnode *node, *nnode, *nnode2; struct eigrp_neighbor *nbr; struct eigrp_prefix_entry *pe; u_char has_tlv; struct access_list *alist; struct prefix_list *plist; struct access_list *alist_i; struct prefix_list *plist_i; struct eigrp *e; struct prefix_ipv4 *dest_addr; u_int16_t length = EIGRP_HEADER_LEN; ep = eigrp_packet_new(ei->ifp->mtu); /* Prepare EIGRP INIT UPDATE header */ eigrp_packet_header_init(EIGRP_OPC_UPDATE, ei, ep->s, 0, ei->eigrp->sequence_number, 0); // encode Authentication TLV, if needed 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); } has_tlv = 0; for (ALL_LIST_ELEMENTS(ei->eigrp->topology_changes_internalIPV4, node, nnode, pe)) { if(pe->req_action & EIGRP_FSM_NEED_UPDATE) { /* Get destination address from prefix */ dest_addr = pe->destination_ipv4; /* * 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_OUT]; plist = e->prefix[EIGRP_FILTER_OUT]; alist_i = ei->list[EIGRP_FILTER_OUT]; plist_i = ei->prefix[EIGRP_FILTER_OUT]; /* 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) == FILTER_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) == FILTER_DENY)) { zlog_info("PROC OUT: Skipping"); //pe->reported_metric.delay = EIGRP_MAX_METRIC; zlog_info("PROC OUT Prefix: %s", inet_ntoa(dest_addr->prefix)); continue; } else { zlog_info("PROC OUT: NENastavujem metriku "); length += eigrp_add_internalTLV_to_stream(ep->s, pe); has_tlv = 1; } /* * End of filtering */ /* NULL the pointer */ dest_addr = NULL; } } if(!has_tlv) { eigrp_packet_free(ep); return; } 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(ei, ep->s, length); ep->length = length; ep->dst.s_addr = htonl(EIGRP_MULTICAST_ADDRESS); /*This ack number we await from neighbor*/ ep->sequence_number = ei->eigrp->sequence_number; if (IS_DEBUG_EIGRP_PACKET(0, RECV)) zlog_debug("Enqueuing Update length[%u] Seq [%u]", length, ep->sequence_number); for (ALL_LIST_ELEMENTS(ei->nbrs, node, nnode, nbr)) { if (nbr->state == EIGRP_NEIGHBOR_UP) { /*Put packet to retransmission queue*/ eigrp_fifo_push_head(nbr->retrans_queue, ep); if (nbr->retrans_queue->count == 1) { eigrp_send_packet_reliably(nbr); } } } }
void eigrp_update_send_EOT (struct eigrp_neighbor *nbr) { struct eigrp_packet *ep; // struct eigrp_packet *ep_multicast; u_int16_t length = EIGRP_HEADER_LEN; struct eigrp_neighbor_entry *te; struct eigrp_prefix_entry *pe; struct listnode *node, *node2, *nnode, *nnode2; struct access_list *alist; struct prefix_list *plist; struct access_list *alist_i; struct prefix_list *plist_i; struct eigrp *e; struct prefix_ipv4 *dest_addr; ep = eigrp_packet_new(nbr->ei->ifp->mtu); /* Prepare EIGRP EOT UPDATE header */ eigrp_packet_header_init(EIGRP_OPC_UPDATE, nbr->ei, ep->s, EIGRP_EOT_FLAG, nbr->ei->eigrp->sequence_number, nbr->recv_sequence_number); // 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); } for (ALL_LIST_ELEMENTS(nbr->ei->eigrp->topology_table, node, nnode, pe)) { for (ALL_LIST_ELEMENTS(pe->entries, node2, nnode2, te)) { if ((te->ei == nbr->ei) && (te->prefix->nt == EIGRP_TOPOLOGY_TYPE_REMOTE)) continue; /* Get destination address from prefix */ dest_addr = pe->destination_ipv4; /* * 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_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, (struct prefix *) dest_addr) == FILTER_DENY)|| (plist && prefix_list_apply (plist, (struct prefix *) dest_addr) == FILTER_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) == FILTER_DENY)) { zlog_info("PROC OUT EOT: Skipping"); //pe->reported_metric.delay = EIGRP_MAX_METRIC; zlog_info("PROC OUT EOT Prefix: %s", inet_ntoa(dest_addr->prefix)); continue; } else { zlog_info("PROC OUT EOT: NENastavujem metriku "); length += eigrp_add_internalTLV_to_stream(ep->s, pe); } /* * End of filtering */ /* NULL the pointer */ dest_addr = NULL; } } 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); } /* EIGRP Checksum */ eigrp_packet_checksum(nbr->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; if (IS_DEBUG_EIGRP_PACKET(0, RECV)) zlog_debug("Enqueuing Update Init Len [%u] Seq [%u] Dest [%s]", ep->length, ep->sequence_number, inet_ntoa(ep->dst)); /*Put packet to retransmission queue*/ eigrp_fifo_push_head(nbr->retrans_queue, ep); if (nbr->retrans_queue->count == 1) { eigrp_send_packet_reliably(nbr); } }
int ospf_if_new_hook (struct interface *ifp) { int rc = 0; ifp->info = XMALLOC (MTYPE_OSPF_IF_INFO, sizeof (struct ospf_if_info)); memset (ifp->info, 0, sizeof (struct ospf_if_info)); IF_OIFS (ifp) = route_table_init (); IF_OIFS_PARAMS (ifp) = route_table_init (); IF_DEF_PARAMS (ifp) = ospf_new_if_params (); SET_IF_PARAM (IF_DEF_PARAMS (ifp), transmit_delay); IF_DEF_PARAMS (ifp)->transmit_delay = OSPF_TRANSMIT_DELAY_DEFAULT; SET_IF_PARAM (IF_DEF_PARAMS (ifp), retransmit_interval); IF_DEF_PARAMS (ifp)->retransmit_interval = OSPF_RETRANSMIT_INTERVAL_DEFAULT; SET_IF_PARAM (IF_DEF_PARAMS (ifp), priority); IF_DEF_PARAMS (ifp)->priority = OSPF_ROUTER_PRIORITY_DEFAULT; IF_DEF_PARAMS (ifp)->mtu_ignore = OSPF_MTU_IGNORE_DEFAULT; SET_IF_PARAM (IF_DEF_PARAMS (ifp), v_hello); IF_DEF_PARAMS (ifp)->v_hello = OSPF_HELLO_INTERVAL_DEFAULT; SET_IF_PARAM (IF_DEF_PARAMS (ifp), fast_hello); IF_DEF_PARAMS (ifp)->fast_hello = OSPF_FAST_HELLO_DEFAULT; SET_IF_PARAM (IF_DEF_PARAMS (ifp), v_wait); IF_DEF_PARAMS (ifp)->v_wait = OSPF_ROUTER_DEAD_INTERVAL_DEFAULT; SET_IF_PARAM (IF_DEF_PARAMS (ifp), auth_simple); memset (IF_DEF_PARAMS (ifp)->auth_simple, 0, OSPF_AUTH_SIMPLE_SIZE); SET_IF_PARAM (IF_DEF_PARAMS (ifp), auth_type); IF_DEF_PARAMS (ifp)->auth_type = OSPF_AUTH_NOTSET; #ifdef HAVE_OPAQUE_LSA rc = ospf_opaque_new_if (ifp); #endif /* HAVE_OPAQUE_LSA */ return rc; }