diff options
Diffstat (limited to 'zebra/zebra_fpm_protobuf.c')
| -rw-r--r-- | zebra/zebra_fpm_protobuf.c | 459 | 
1 files changed, 227 insertions, 232 deletions
diff --git a/zebra/zebra_fpm_protobuf.c b/zebra/zebra_fpm_protobuf.c index 1e8af19ea7..450ad5b0bf 100644 --- a/zebra/zebra_fpm_protobuf.c +++ b/zebra/zebra_fpm_protobuf.c @@ -39,241 +39,237 @@  /*   * create_delete_route_message   */ -static Fpm__DeleteRoute * -create_delete_route_message (qpb_allocator_t *allocator, rib_dest_t *dest, -			     struct route_entry *re) +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; +	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;  }  /*   * add_nexthop   */ -static inline int -add_nexthop (qpb_allocator_t *allocator, Fpm__AddRoute *msg, rib_dest_t *dest, -	     struct nexthop *nexthop) +static inline int add_nexthop(qpb_allocator_t *allocator, Fpm__AddRoute *msg, +			      rib_dest_t *dest, struct nexthop *nexthop)  { -  uint32_t if_index; -  union g_addr *gateway, *src; - -  gateway = src = NULL; - -  if_index = nexthop->ifindex; - -  if (nexthop->type == NEXTHOP_TYPE_IPV4 -      || nexthop->type == NEXTHOP_TYPE_IPV4_IFINDEX) -    { -      gateway = &nexthop->gate; -      if (nexthop->src.ipv4.s_addr) -	src = &nexthop->src; -    } - -  if (nexthop->type == NEXTHOP_TYPE_IPV6 -      || nexthop->type == NEXTHOP_TYPE_IPV6_IFINDEX) -    { -      gateway = &nexthop->gate; -    } - -  if (nexthop->type == NEXTHOP_TYPE_IFINDEX) -    { -      if (nexthop->src.ipv4.s_addr) -	src = &nexthop->src; -    } - -  if (!gateway && if_index == 0) -    return 0; - -  /* -   * We have a valid nexthop. -   */ -  { -    Fpm__Nexthop *pb_nh; -    pb_nh = QPB_ALLOC(allocator, typeof(*pb_nh)); -    if (!pb_nh) { -      assert(0); -      return 0; -    } - -    fpm__nexthop__init(pb_nh); - -    if (if_index != 0) { -      pb_nh->if_id = qpb_if_identifier_create (allocator, if_index); -    } - -    if (gateway) { -      pb_nh->address = qpb_l3_address_create (allocator, gateway, -					      rib_dest_af(dest)); -    } - -    msg->nexthops[msg->n_nexthops++] = pb_nh; -  } - -  // TODO: Use src. - -  return 1; +	uint32_t if_index; +	union g_addr *gateway, *src; + +	gateway = src = NULL; + +	if_index = nexthop->ifindex; + +	if (nexthop->type == NEXTHOP_TYPE_IPV4 +	    || nexthop->type == NEXTHOP_TYPE_IPV4_IFINDEX) { +		gateway = &nexthop->gate; +		if (nexthop->src.ipv4.s_addr) +			src = &nexthop->src; +	} + +	if (nexthop->type == NEXTHOP_TYPE_IPV6 +	    || nexthop->type == NEXTHOP_TYPE_IPV6_IFINDEX) { +		gateway = &nexthop->gate; +	} + +	if (nexthop->type == NEXTHOP_TYPE_IFINDEX) { +		if (nexthop->src.ipv4.s_addr) +			src = &nexthop->src; +	} + +	if (!gateway && if_index == 0) +		return 0; + +	/* +	 * We have a valid nexthop. +	 */ +	{ +		Fpm__Nexthop *pb_nh; +		pb_nh = QPB_ALLOC(allocator, typeof(*pb_nh)); +		if (!pb_nh) { +			assert(0); +			return 0; +		} + +		fpm__nexthop__init(pb_nh); + +		if (if_index != 0) { +			pb_nh->if_id = +				qpb_if_identifier_create(allocator, if_index); +		} + +		if (gateway) { +			pb_nh->address = qpb_l3_address_create( +				allocator, gateway, rib_dest_af(dest)); +		} + +		msg->nexthops[msg->n_nexthops++] = pb_nh; +	} + +	// TODO: Use src. + +	return 1;  }  /*   * create_add_route_message   */ -static Fpm__AddRoute * -create_add_route_message (qpb_allocator_t *allocator, rib_dest_t *dest, -			  struct route_entry *re) +static Fpm__AddRoute *create_add_route_message(qpb_allocator_t *allocator, +					       rib_dest_t *dest, +					       struct route_entry *re)  { -  Fpm__AddRoute *msg; -  int discard; -  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); - -  if ((re->flags & ZEBRA_FLAG_BLACKHOLE) || (re->flags & ZEBRA_FLAG_REJECT)) -    discard = 1; -  else -    discard = 0; - -  if (discard) -    { -      if (re->flags & ZEBRA_FLAG_BLACKHOLE) { -	msg->route_type = FPM__ROUTE_TYPE__BLACKHOLE; -      } else if (re->flags & ZEBRA_FLAG_REJECT) { -	msg->route_type = FPM__ROUTE_TYPE__UNREACHABLE; -      } else { -	assert (0); -      } -      return msg; -    } -  else { -    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->nexthop, nexthop)) -    { -      if (num_nhs >= multipath_num) -        break; - -      if (num_nhs >= ZEBRA_NUM_OF(nexthops)) -	break; - -      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; +	Fpm__AddRoute *msg; +	int discard; +	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); + +	if ((re->flags & ZEBRA_FLAG_BLACKHOLE) +	    || (re->flags & ZEBRA_FLAG_REJECT)) +		discard = 1; +	else +		discard = 0; + +	if (discard) { +		if (re->flags & ZEBRA_FLAG_BLACKHOLE) { +			msg->route_type = FPM__ROUTE_TYPE__BLACKHOLE; +		} else if (re->flags & ZEBRA_FLAG_REJECT) { +			msg->route_type = FPM__ROUTE_TYPE__UNREACHABLE; +		} else { +			assert(0); +		} +		return msg; +	} else { +		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->nexthop, nexthop)) { +		if (num_nhs >= multipath_num) +			break; + +		if (num_nhs >= ZEBRA_NUM_OF(nexthops)) +			break; + +		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;  }  /*   * create_route_message   */ -static Fpm__Message * -create_route_message (qpb_allocator_t *allocator, rib_dest_t *dest, -		      struct route_entry *re) +static Fpm__Message *create_route_message(qpb_allocator_t *allocator, +					  rib_dest_t *dest, +					  struct route_entry *re)  { -  Fpm__Message *msg; - -  msg = QPB_ALLOC(allocator, typeof(*msg)); -  if (!msg) { -    assert(0); -    return NULL; -  } - -  fpm__message__init(msg); - -  if (!re) { -    msg->type = FPM__MESSAGE__TYPE__DELETE_ROUTE; -    msg->delete_route = create_delete_route_message(allocator, dest, re); -    if (!msg->delete_route) { -      assert(0); -      return NULL; -    } -    return msg; -  } - -  msg->type = FPM__MESSAGE__TYPE__ADD_ROUTE; -  msg->add_route = create_add_route_message(allocator, dest, re); -  if (!msg->add_route) { -    assert(0); -    return NULL; -  } - -  return msg; +	Fpm__Message *msg; + +	msg = QPB_ALLOC(allocator, typeof(*msg)); +	if (!msg) { +		assert(0); +		return NULL; +	} + +	fpm__message__init(msg); + +	if (!re) { +		msg->type = FPM__MESSAGE__TYPE__DELETE_ROUTE; +		msg->delete_route = +			create_delete_route_message(allocator, dest, re); +		if (!msg->delete_route) { +			assert(0); +			return NULL; +		} +		return msg; +	} + +	msg->type = FPM__MESSAGE__TYPE__ADD_ROUTE; +	msg->add_route = create_add_route_message(allocator, dest, re); +	if (!msg->add_route) { +		assert(0); +		return NULL; +	} + +	return msg;  }  /* @@ -285,25 +281,24 @@ create_route_message (qpb_allocator_t *allocator, rib_dest_t *dest,   * Returns the number of bytes written to the buffer. 0 or a negative   * value indicates an error.   */ -int -zfpm_protobuf_encode_route (rib_dest_t *dest, struct route_entry *re, -			    uint8_t *in_buf, size_t in_buf_len) +int zfpm_protobuf_encode_route(rib_dest_t *dest, struct route_entry *re, +			       uint8_t *in_buf, size_t in_buf_len)  { -  Fpm__Message *msg; -  QPB_DECLARE_STACK_ALLOCATOR (allocator, 4096); -  size_t len; +	Fpm__Message *msg; +	QPB_DECLARE_STACK_ALLOCATOR(allocator, 4096); +	size_t len; -  QPB_INIT_STACK_ALLOCATOR (allocator); +	QPB_INIT_STACK_ALLOCATOR(allocator); -  msg = create_route_message(&allocator, dest, re); -  if (!msg) { -    assert(0); -    return 0; -  } +	msg = create_route_message(&allocator, dest, re); +	if (!msg) { +		assert(0); +		return 0; +	} -  len = fpm__message__pack(msg, (uint8_t *) in_buf); -  assert(len <= in_buf_len); +	len = fpm__message__pack(msg, (uint8_t *)in_buf); +	assert(len <= in_buf_len); -  QPB_RESET_STACK_ALLOCATOR (allocator); -  return len; +	QPB_RESET_STACK_ALLOCATOR(allocator); +	return len;  }  | 
