struct iface * krt_temp_iface(struct krt_proto *p, char *name) { struct iface *i; WALK_LIST(i, p->scan.temp_ifs) if (!strcmp(i->name, name)) return i; i = mb_allocz(p->p.pool, sizeof(struct iface)); strcpy(i->name, name); add_tail(&p->scan.temp_ifs, &i->n); return i; }
static void rte_src_init(void) { rte_src_slab = sl_new(rta_pool, sizeof(struct rte_src)); src_id_pos = 0; src_id_size = SRC_ID_INIT_SIZE; src_ids = mb_allocz(rta_pool, src_id_size * sizeof(u32)); /* ID 0 is reserved */ src_ids[0] = 1; src_id_used = 1; HASH_INIT(src_hash, rta_pool, RSH_INIT_ORDER); }
/** * proto_new - create a new protocol instance * @c: protocol configuration * @size: size of protocol data structure (each protocol instance is represented by * a structure starting with generic part [struct &proto] and continued * with data specific to the protocol) * * When a new configuration has been read in, the core code starts * initializing all the protocol instances configured by calling their * init() hooks with the corresponding instance configuration. The initialization * code of the protocol is expected to create a new instance according to the * configuration by calling this function and then modifying the default settings * to values wanted by the protocol. */ void * proto_new(struct proto_config *c, unsigned size) { struct protocol *pr = c->protocol; struct proto *p = mb_allocz(proto_pool, size); p->cf = c; p->debug = c->debug; p->mrtdump = c->mrtdump; p->name = c->name; p->preference = c->preference; p->disabled = c->disabled; p->proto = pr; p->table = c->table->table; p->hash_key = random_u32(); c->proto = p; return p; }
/** * proto_add_announce_hook - connect protocol to a routing table * @p: protocol instance * @t: routing table to connect to * @stats: per-table protocol statistics * * This function creates a connection between the protocol instance @p * and the routing table @t, making the protocol hear all changes in * the table. * * The announce hook is linked in the protocol ahook list and, if the * protocol accepts routes, also in the table ahook list. Announce * hooks are allocated from the routing table resource pool, they are * unlinked from the table ahook list after the protocol went down, * (in proto_schedule_flush()) and they are automatically freed after the * protocol is flushed (in proto_fell_down()). * * Unless you want to listen to multiple routing tables (as the Pipe * protocol does), you needn't to worry about this function since the * connection to the protocol's primary routing table is initialized * automatically by the core code. */ struct announce_hook * proto_add_announce_hook(struct proto *p, struct rtable *t, struct proto_stats *stats) { struct announce_hook *h; DBG("Connecting protocol %s to table %s\n", p->name, t->name); PD(p, "Connected to table %s", t->name); h = mb_allocz(rt_table_pool, sizeof(struct announce_hook)); h->table = t; h->proto = p; h->stats = stats; h->next = p->ahooks; p->ahooks = h; if (p->rt_notify) add_tail(&t->hooks, &h->n); return h; }
static void ospf_prepare_dbdes(struct ospf_proto *p, struct ospf_neighbor *n) { struct ospf_iface *ifa = n->ifa; struct ospf_packet *pkt; uint length; u16 iface_mtu = (ifa->type == OSPF_IT_VLINK) ? 0 : ifa->iface->mtu; /* Update DBDES buffer */ if (n->ldd_bsize != ifa->tx_length) { mb_free(n->ldd_buffer); n->ldd_buffer = mb_allocz(n->pool, ifa->tx_length); n->ldd_bsize = ifa->tx_length; } pkt = n->ldd_buffer; ospf_pkt_fill_hdr(ifa, pkt, DBDES_P); if (ospf_is_v2(p)) { struct ospf_dbdes2_packet *ps = (void *) pkt; ps->iface_mtu = htons(iface_mtu); ps->options = ifa->oa->options; ps->imms = 0; /* Will be set later */ ps->ddseq = htonl(n->dds); length = sizeof(struct ospf_dbdes2_packet); } else /* OSPFv3 */ { struct ospf_dbdes3_packet *ps = (void *) pkt; ps->options = htonl(ifa->oa->options); ps->iface_mtu = htons(iface_mtu); ps->padding = 0; ps->imms = 0; /* Will be set later */ ps->ddseq = htonl(n->dds); length = sizeof(struct ospf_dbdes3_packet); } /* Prepare DBDES body */ if (!(n->myimms & DBDES_I) && (n->myimms & DBDES_M)) { struct ospf_lsa_header *lsas; struct top_hash_entry *en; uint i = 0, lsa_max; ospf_dbdes_body(p, pkt, &lsas, &lsa_max); en = (void *) s_get(&(n->dbsi)); while (i < lsa_max) { if (!SNODE_VALID(en)) { n->myimms &= ~DBDES_M; /* Unset More bit */ break; } if ((en->lsa.age < LSA_MAXAGE) && lsa_flooding_allowed(en->lsa_type, en->domain, ifa)) { lsa_hton_hdr(&(en->lsa), lsas + i); i++; } en = SNODE_NEXT(en); } s_put(&(n->dbsi), SNODE en); length += i * sizeof(struct ospf_lsa_header); } if (ospf_is_v2(p)) ((struct ospf_dbdes2_packet *) pkt)->imms = n->myimms; else ((struct ospf_dbdes3_packet *) pkt)->imms = n->myimms; pkt->length = htons(length); }