static void
oifl_delete(switchlink_handle_t oifl_h) {
    int32_t ref_count;
    switchlink_db_status_t status;
    status  = switchlink_db_oifl_ref_dec(oifl_h, &ref_count);
    assert(status == SWITCHLINK_DB_STATUS_SUCCESS);

    if (ref_count == 0) {
        switchlink_db_oifl_info_t oifl_info;
        memset(&oifl_info, 0, sizeof(switchlink_db_oifl_info_t));
        status = switchlink_db_oifl_handle_get_info(oifl_h, &oifl_info);
        assert(status == SWITCHLINK_DB_STATUS_SUCCESS);
        switchlink_db_oifl_delete(oifl_h);
    }
}
Esempio n. 2
0
int switchlink_mroute_create(switchlink_db_mroute_info_t *mroute_info) {
  sai_status_t status = SAI_STATUS_SUCCESS;

  sai_ipmc_entry_t ipmc_entry;
  memset(&ipmc_entry, 0, sizeof(ipmc_entry));
  ipmc_entry.vr_id = mroute_info->vrf_h;
  if (mroute_info->src_ip.family == AF_INET) {
    ipmc_entry.source.addr_family = SAI_IP_ADDR_FAMILY_IPV4;
    ipmc_entry.source.addr.ip4 = htonl(mroute_info->src_ip.ip.v4addr.s_addr);
    ipmc_entry.group.addr_family = SAI_IP_ADDR_FAMILY_IPV4;
    ipmc_entry.group.addr.ip4 = htonl(mroute_info->dst_ip.ip.v4addr.s_addr);
    ipmc_entry.group.mask.ip4 =
        htonl(ipv4_prefix_len_to_mask(mroute_info->dst_ip.prefix_len));
  } else {
    ipmc_entry.source.addr_family = SAI_IP_ADDR_FAMILY_IPV6;
    memcpy(ipmc_entry.source.addr.ip6,
           &(mroute_info->src_ip.ip.v6addr),
           sizeof(sai_ip6_t));
    ipmc_entry.group.addr_family = SAI_IP_ADDR_FAMILY_IPV6;
    memcpy(ipmc_entry.group.addr.ip6,
           &(mroute_info->dst_ip.ip.v6addr),
           sizeof(sai_ip6_t));
    struct in6_addr mask =
        ipv6_prefix_len_to_mask(mroute_info->dst_ip.prefix_len);
    memcpy(ipmc_entry.group.mask.ip6, &mask, sizeof(sai_ip6_t));
  }

  switchlink_db_status_t db_status;
  switchlink_db_oifl_info_t oifl_info;
  db_status =
      switchlink_db_oifl_handle_get_info(mroute_info->oifl_h, &oifl_info);
  assert(db_status == SWITCHLINK_DB_STATUS_SUCCESS);

  sai_attribute_t attr_list[2];
  memset(attr_list, 0, sizeof(attr_list));
  attr_list[0].id = SAI_IPMC_ATTR_OUTPUT_ROUTER_INTERFACE_LIST;
  attr_list[0].value.objlist.count = oifl_info.num_intfs;
  attr_list[0].value.objlist.list = oifl_info.intfs;
  attr_list[1].id = SAI_IPMC_ATTR_RPF_ROUTER_INTERFACE_LIST;
  attr_list[1].value.objlist.count = 1;
  attr_list[1].value.objlist.list = (sai_object_id_t *)&(mroute_info->iif_h);

  status = ipmc_api->create_ipmc_entry(&ipmc_entry, 2, attr_list);
  return ((status == SAI_STATUS_SUCCESS) ? 0 : -1);
}