static struct ospf6 * ospf6_create (void) { struct ospf6 *o; o = XCALLOC (MTYPE_OSPF6_TOP, sizeof (struct ospf6)); /* initialize */ quagga_gettime (QUAGGA_CLK_MONOTONIC, &o->starttime); o->area_list = list_new (); o->area_list->cmp = ospf6_area_cmp; o->lsdb = ospf6_lsdb_create (o); o->lsdb_self = ospf6_lsdb_create (o); o->lsdb->hook_add = ospf6_top_lsdb_hook_add; o->lsdb->hook_remove = ospf6_top_lsdb_hook_remove; o->route_table = OSPF6_ROUTE_TABLE_CREATE (GLOBAL, ROUTES); o->route_table->scope = o; o->route_table->hook_add = ospf6_top_route_hook_add; o->route_table->hook_remove = ospf6_top_route_hook_remove; o->brouter_table = OSPF6_ROUTE_TABLE_CREATE (GLOBAL, BORDER_ROUTERS); o->brouter_table->scope = o; o->brouter_table->hook_add = ospf6_top_brouter_hook_add; o->brouter_table->hook_remove = ospf6_top_brouter_hook_remove; o->external_table = OSPF6_ROUTE_TABLE_CREATE (GLOBAL, EXTERNAL_ROUTES); o->external_table->scope = o; o->external_id_table = route_table_init (); return o; }
/* Create new ospf6 interface structure */ struct ospf6_interface * ospf6_interface_create (struct interface *ifp) { struct ospf6_interface *oi; unsigned int iobuflen; oi = (struct ospf6_interface *) XMALLOC (MTYPE_OSPF6_IF, sizeof (struct ospf6_interface)); if (oi) memset (oi, 0, sizeof (struct ospf6_interface)); else { zlog_err ("Can't malloc ospf6_interface for ifindex %d", ifp->ifindex); return (struct ospf6_interface *) NULL; } oi->area = (struct ospf6_area *) NULL; oi->neighbor_list = list_new (); oi->neighbor_list->cmp = ospf6_neighbor_cmp; oi->linklocal_addr = (struct in6_addr *) NULL; oi->instance_id = 0; oi->transdelay = 1; oi->priority = 1; oi->hello_interval = 10; oi->dead_interval = 40; oi->rxmt_interval = 5; oi->cost = 1; oi->state = OSPF6_INTERFACE_DOWN; oi->flag = 0; /* Try to adjust I/O buffer size with IfMtu */ oi->ifmtu = ifp->mtu6; iobuflen = ospf6_iobuf_size (ifp->mtu6); if (oi->ifmtu > iobuflen) { if (IS_OSPF6_DEBUG_INTERFACE) zlog_debug ("Interface %s: IfMtu is adjusted to I/O buffer size: %d.", ifp->name, iobuflen); oi->ifmtu = iobuflen; } oi->lsupdate_list = ospf6_lsdb_create (oi); oi->lsack_list = ospf6_lsdb_create (oi); oi->lsdb = ospf6_lsdb_create (oi); oi->lsdb->hook_add = ospf6_interface_lsdb_hook; oi->lsdb->hook_remove = ospf6_interface_lsdb_hook; oi->lsdb_self = ospf6_lsdb_create (oi); oi->route_connected = OSPF6_ROUTE_TABLE_CREATE (INTERFACE, CONNECTED_ROUTES); oi->route_connected->scope = oi; /* link both */ oi->interface = ifp; ifp->info = oi; return oi; }
static struct ospf6 *ospf6_create(void) { struct ospf6 *o; o = XCALLOC(MTYPE_OSPF6_TOP, sizeof(struct ospf6)); /* initialize */ monotime(&o->starttime); o->area_list = list_new(); o->area_list->cmp = ospf6_area_cmp; o->lsdb = ospf6_lsdb_create(o); o->lsdb_self = ospf6_lsdb_create(o); o->lsdb->hook_add = ospf6_top_lsdb_hook_add; o->lsdb->hook_remove = ospf6_top_lsdb_hook_remove; o->spf_delay = OSPF_SPF_DELAY_DEFAULT; o->spf_holdtime = OSPF_SPF_HOLDTIME_DEFAULT; o->spf_max_holdtime = OSPF_SPF_MAX_HOLDTIME_DEFAULT; o->spf_hold_multiplier = 1; /* LSA timers value init */ o->lsa_minarrival = OSPF_MIN_LS_ARRIVAL; o->route_table = OSPF6_ROUTE_TABLE_CREATE(GLOBAL, ROUTES); o->route_table->scope = o; o->route_table->hook_add = ospf6_top_route_hook_add; o->route_table->hook_remove = ospf6_top_route_hook_remove; o->brouter_table = OSPF6_ROUTE_TABLE_CREATE(GLOBAL, BORDER_ROUTERS); o->brouter_table->scope = o; o->brouter_table->hook_add = ospf6_top_brouter_hook_add; o->brouter_table->hook_remove = ospf6_top_brouter_hook_remove; o->external_table = OSPF6_ROUTE_TABLE_CREATE(GLOBAL, EXTERNAL_ROUTES); o->external_table->scope = o; o->external_id_table = route_table_init(); o->ref_bandwidth = OSPF6_REFERENCE_BANDWIDTH; o->distance_table = route_table_init(); /* Enable "log-adjacency-changes" */ #if DFLT_OSPF6_LOG_ADJACENCY_CHANGES SET_FLAG(o->config_flags, OSPF6_LOG_ADJACENCY_CHANGES); #endif QOBJ_REG(o, ospf6); return o; }
/* Make new area structure */ struct ospf6_area * ospf6_area_create (u_int32_t area_id, struct ospf6 *o) { struct ospf6_area *oa; struct ospf6_route *route; oa = XCALLOC (MTYPE_OSPF6_AREA, sizeof (struct ospf6_area)); inet_ntop (AF_INET, &area_id, oa->name, sizeof (oa->name)); oa->area_id = area_id; oa->if_list = list_new (); oa->lsdb = ospf6_lsdb_create (oa); oa->lsdb->hook_add = ospf6_area_lsdb_hook_add; oa->lsdb->hook_remove = ospf6_area_lsdb_hook_remove; oa->lsdb_self = ospf6_lsdb_create (oa); oa->spf_table = OSPF6_ROUTE_TABLE_CREATE (AREA, SPF_RESULTS); oa->spf_table->scope = oa; oa->route_table = OSPF6_ROUTE_TABLE_CREATE (AREA, ROUTES); oa->route_table->scope = oa; oa->route_table->hook_add = ospf6_area_route_hook_add; oa->route_table->hook_remove = ospf6_area_route_hook_remove; oa->range_table = OSPF6_ROUTE_TABLE_CREATE (AREA, PREFIX_RANGES); oa->range_table->scope = oa; oa->summary_prefix = OSPF6_ROUTE_TABLE_CREATE (AREA, SUMMARY_PREFIXES); oa->summary_prefix->scope = oa; oa->summary_router = OSPF6_ROUTE_TABLE_CREATE (AREA, SUMMARY_ROUTERS); oa->summary_router->scope = oa; /* set default options */ OSPF6_OPT_SET (oa->options, OSPF6_OPT_V6); OSPF6_OPT_SET (oa->options, OSPF6_OPT_E); OSPF6_OPT_SET (oa->options, OSPF6_OPT_R); oa->ospf6 = o; listnode_add_sort (o->area_list, oa); /* import athoer area's routes as inter-area routes */ for (route = ospf6_route_head (o->route_table); route; route = ospf6_route_next (route)) ospf6_abr_originate_summary_to_area (route, oa); return oa; }
/* create ospf6 neighbor */ struct ospf6_neighbor * ospf6_neighbor_create(u_int32_t router_id, struct ospf6_interface * oi) { struct ospf6_neighbor * on; char buf[16]; on = (struct ospf6_neighbor *)calloc(1, sizeof(struct ospf6_neighbor)); if(on == NULL) { printf("malloc failed\n"); return NULL; } memset (on, 0, sizeof (struct ospf6_neighbor)); inet_ntop (AF_INET, &router_id, buf, sizeof (buf)); snprintf (on->name, sizeof (on->name), "%s%%%s", buf, oi->interface->name); on->ospf6_if = oi; on->state = OSPF6_NEIGHBOR_DOWN; zebralite_gettime(ZEBRALITE_CLK_MONOTONIC, &on->last_changed); on->router_id = router_id; on->summary_list = ospf6_lsdb_create (on); on->request_list = ospf6_lsdb_create (on); on->retrans_list = ospf6_lsdb_create (on); on->dbdesc_list = ospf6_lsdb_create (on); on->lsreq_list = ospf6_lsdb_create (on); on->lsupdate_list = ospf6_lsdb_create (on); on->lsack_list = ospf6_lsdb_create (on); list_push_back(&oi->neighbor_list, &on->node); return on; }
/* create ospf6_neighbor */ struct ospf6_neighbor * ospf6_neighbor_create (u_int32_t router_id, struct ospf6_interface *oi) { struct ospf6_neighbor *on; char buf[16]; on = (struct ospf6_neighbor *) XMALLOC (MTYPE_OSPF6_NEIGHBOR, sizeof (struct ospf6_neighbor)); if (on == NULL) { zlog_warn ("neighbor: malloc failed"); return NULL; } memset (on, 0, sizeof (struct ospf6_neighbor)); inet_ntop (AF_INET, &router_id, buf, sizeof (buf)); snprintf (on->name, sizeof (on->name), "%s%%%s", buf, oi->interface->name); on->ospf6_if = oi; on->state = OSPF6_NEIGHBOR_DOWN; gettimeofday (&on->last_changed, (struct timezone *) NULL); on->router_id = router_id; on->summary_list = ospf6_lsdb_create (on); on->request_list = ospf6_lsdb_create (on); on->retrans_list = ospf6_lsdb_create (on); on->dbdesc_list = ospf6_lsdb_create (on); on->lsreq_list = ospf6_lsdb_create (on); on->lsupdate_list = ospf6_lsdb_create (on); on->lsack_list = ospf6_lsdb_create (on); listnode_add_sort (oi->neighbor_list, on); return on; }
static struct ospf6 * ospf6_create (void) { struct ospf6 *o; o = XCALLOC (MTYPE_OSPF6_TOP, sizeof (struct ospf6)); /* initialize */ quagga_gettime (QUAGGA_CLK_MONOTONIC, &o->starttime); o->area_list = list_new (); o->area_list->cmp = ospf6_area_cmp; o->lsdb = ospf6_lsdb_create (o); o->lsdb_self = ospf6_lsdb_create (o); o->lsdb->hook_add = ospf6_top_lsdb_hook_add; o->lsdb->hook_remove = ospf6_top_lsdb_hook_remove; o->spf_delay = OSPF_SPF_DELAY_DEFAULT; o->spf_holdtime = OSPF_SPF_HOLDTIME_DEFAULT; o->spf_max_holdtime = OSPF_SPF_MAX_HOLDTIME_DEFAULT; o->spf_hold_multiplier = 1; o->route_table = OSPF6_ROUTE_TABLE_CREATE (GLOBAL, ROUTES); o->route_table->scope = o; o->route_table->hook_add = ospf6_top_route_hook_add; o->route_table->hook_remove = ospf6_top_route_hook_remove; o->brouter_table = OSPF6_ROUTE_TABLE_CREATE (GLOBAL, BORDER_ROUTERS); o->brouter_table->scope = o; o->brouter_table->hook_add = ospf6_top_brouter_hook_add; o->brouter_table->hook_remove = ospf6_top_brouter_hook_remove; o->external_table = OSPF6_ROUTE_TABLE_CREATE (GLOBAL, EXTERNAL_ROUTES); o->external_table->scope = o; o->external_id_table = route_table_init (); o->ref_bandwidth = OSPF6_REFERENCE_BANDWIDTH; return o; }
/* Make new area structure */ struct ospf6_area * ospf6_area_create (u_int32_t area_id) { struct ospf6_area *o6a; /* allocate memory */ o6a = (struct ospf6_area *) XMALLOC (MTYPE_OSPF6_AREA, sizeof (struct ospf6_area)); if (!o6a) { char str[16]; inet_ntop (AF_INET, &area_id, str, sizeof (str)); zlog_err ("can't allocate memory for Area %s", str); return NULL; } /* initialize */ memset (o6a, 0, sizeof (struct ospf6_area)); inet_ntop (AF_INET, &area_id, o6a->str, sizeof (o6a->str)); o6a->area_id = area_id; o6a->if_list = list_new (); #if 0 o6a->lsdb = list_new (); #endif o6a->lsdb = ospf6_lsdb_create (); o6a->spf_tree = ospf6_spftree_create (); o6a->table_topology = route_table_init (); /* xxx, set options */ OSPF6_OPT_SET (o6a->options, OSPF6_OPT_V6); OSPF6_OPT_SET (o6a->options, OSPF6_OPT_E); OSPF6_OPT_SET (o6a->options, OSPF6_OPT_R); o6a->foreach_if = ospf6_area_foreach_interface; o6a->foreach_nei = ospf6_area_foreach_neighbor; return o6a; }
static struct ospf6 * ospf6_create(void) { struct ospf6 * o; o = calloc(1, sizeof(struct ospf6)); o->lsdb = ospf6_lsdb_create(o); o->lsdb->hook_add = ospf6_top_lsdb_hook_add; o->lsdb->hook_remove = ospf6_top_lsdb_hook_remove; o->route_table = OSPF6_ROUTE_TABLE_CREATE(GLOBAL, ROUTES); o->route_table->scope = o; o->route_table->hook_add = ospf6_top_route_hook_add; o->route_table->hook_remove = ospf6_top_route_hook_remove; o->external_table = OSPF6_ROUTE_TABLE_CREATE(GLOBAL, ROUTES); o->external_table->scope = o; list_init(&o->area_list); o->restart_mode = my_restart_mode; o->checkpoint_enabled = true; // default is for checkpointing to be enabled if(!o->restart_mode) { o->ready_to_checkpoint = true; // o->checkpoint_egress_xid = true; } else { o->ready_to_checkpoint = false; // o->checkpoint_egress_xid = false; } o->restarted_first_egress_not_sent = false; return o; }
/* Make new area structure */ struct ospf6_area * ospf6_area_create (u_int32_t area_id) { struct ospf6_area *o6a; char namebuf[64]; /* allocate memory */ o6a = XCALLOC (MTYPE_OSPF6_AREA, sizeof (struct ospf6_area)); /* initialize */ inet_ntop (AF_INET, &area_id, o6a->str, sizeof (o6a->str)); o6a->area_id = area_id; o6a->if_list = list_new (); o6a->lsdb = ospf6_lsdb_create (); o6a->spf_tree = ospf6_spftree_create (); snprintf (namebuf, sizeof (namebuf), "Area %s's route table", o6a->str); o6a->route_table = ospf6_route_table_create (namebuf); o6a->route_table->hook_add = ospf6_area_route_add; o6a->route_table->hook_change = ospf6_area_route_add; o6a->route_table->hook_remove = ospf6_area_route_remove; snprintf (namebuf, sizeof (namebuf), "Area %s's topology table", o6a->str); o6a->table_topology = ospf6_route_table_create (namebuf); o6a->table_topology->hook_add = ospf6_intra_topology_add; o6a->table_topology->hook_change = ospf6_intra_topology_add; o6a->table_topology->hook_remove = ospf6_intra_topology_remove; /* xxx, set options */ OSPF6_OPT_SET (o6a->options, OSPF6_OPT_V6); OSPF6_OPT_SET (o6a->options, OSPF6_OPT_E); OSPF6_OPT_SET (o6a->options, OSPF6_OPT_R); o6a->foreach_if = ospf6_area_foreach_interface; o6a->foreach_nei = ospf6_area_foreach_neighbor; return o6a; }