/* * create_delete_route_message */ static Fpm__DeleteRoute *create_delete_route_message(qpb_allocator_t *allocator, rib_dest_t *dest, struct route_entry *re) { Fpm__DeleteRoute *msg; msg = QPB_ALLOC(allocator, typeof(*msg)); if (!msg) { assert(0); return NULL; } fpm__delete_route__init(msg); msg->vrf_id = zvrf_id(rib_dest_vrf(dest)); qpb_address_family_set(&msg->address_family, rib_dest_af(dest)); /* * XXX Hardcode subaddress family for now. */ msg->sub_address_family = QPB__SUB_ADDRESS_FAMILY__UNICAST; msg->key = fpm_route_key_create(allocator, rib_dest_prefix(dest)); if (!msg->key) { assert(0); return NULL; } return msg; }
void zebra_ipmr_route_stats(ZAPI_HANDLER_ARGS) { struct mcast_route_data mroute; struct stream *s; int suc = -1; memset(&mroute, 0, sizeof(mroute)); STREAM_GET(&mroute.sg.src, msg, 4); STREAM_GET(&mroute.sg.grp, msg, 4); STREAM_GETL(msg, mroute.ifindex); if (IS_ZEBRA_DEBUG_KERNEL) { char sbuf[40]; char gbuf[40]; strlcpy(sbuf, inet_ntoa(mroute.sg.src), sizeof(sbuf)); strlcpy(gbuf, inet_ntoa(mroute.sg.grp), sizeof(gbuf)); zlog_debug("Asking for (%s,%s) mroute information", sbuf, gbuf); } suc = kernel_get_ipmr_sg_stats(zvrf, &mroute); stream_failure: s = stream_new(ZEBRA_MAX_PACKET_SIZ); stream_reset(s); zclient_create_header(s, ZEBRA_IPMR_ROUTE_STATS, zvrf_id(zvrf)); stream_put_in_addr(s, &mroute.sg.src); stream_put_in_addr(s, &mroute.sg.grp); stream_put(s, &mroute.lastused, sizeof(mroute.lastused)); stream_putl(s, suc); stream_putw_at(s, 0, stream_get_endp(s)); zserv_send_message(client, s); }
/* * create_add_route_message */ static Fpm__AddRoute *create_add_route_message(qpb_allocator_t *allocator, rib_dest_t *dest, struct route_entry *re) { Fpm__AddRoute *msg; struct nexthop *nexthop; uint num_nhs, u; struct nexthop *nexthops[MULTIPATH_NUM]; msg = QPB_ALLOC(allocator, typeof(*msg)); if (!msg) { assert(0); return NULL; } fpm__add_route__init(msg); msg->vrf_id = zvrf_id(rib_dest_vrf(dest)); qpb_address_family_set(&msg->address_family, rib_dest_af(dest)); /* * XXX Hardcode subaddress family for now. */ msg->sub_address_family = QPB__SUB_ADDRESS_FAMILY__UNICAST; msg->key = fpm_route_key_create(allocator, rib_dest_prefix(dest)); qpb_protocol_set(&msg->protocol, re->type); msg->has_route_type = 1; msg->route_type = FPM__ROUTE_TYPE__NORMAL; msg->metric = re->metric; /* * Figure out the set of nexthops to be added to the message. */ num_nhs = 0; for (ALL_NEXTHOPS(re->ng, nexthop)) { if (num_nhs >= multipath_num) break; if (num_nhs >= ZEBRA_NUM_OF(nexthops)) break; if (nexthop->type == NEXTHOP_TYPE_BLACKHOLE) { switch (nexthop->bh_type) { case BLACKHOLE_REJECT: msg->route_type = FPM__ROUTE_TYPE__UNREACHABLE; break; case BLACKHOLE_NULL: default: msg->route_type = FPM__ROUTE_TYPE__BLACKHOLE; break; } return msg; } if (CHECK_FLAG(nexthop->flags, NEXTHOP_FLAG_RECURSIVE)) continue; if (!CHECK_FLAG(nexthop->flags, NEXTHOP_FLAG_ACTIVE)) continue; nexthops[num_nhs] = nexthop; num_nhs++; } if (!num_nhs) { zfpm_debug("netlink_encode_route(): No useful nexthop."); assert(0); return NULL; } /* * And add them to the message. */ if (!(msg->nexthops = qpb_alloc_ptr_array(allocator, num_nhs))) { assert(0); return NULL; } msg->n_nexthops = 0; for (u = 0; u < num_nhs; u++) { if (!add_nexthop(allocator, msg, dest, nexthops[u])) { assert(0); return NULL; } } assert(msg->n_nexthops == num_nhs); return msg; }