summaryrefslogtreecommitdiffstats
path: root/vnet/etc
AgeCommit message (Expand)AuthorFilesLines
2016-06-07IPv6 HBH: Refactor code. Separate out RFC2460 HBH handling and the more exper...Ole Troan1-0/+84
2016-05-16VPP-61 Patch1/2 - Remove NSH from VPPKeith Burns (alagalah)4-73/+0
2016-05-14VPP-63: clean up config scripts, remove specific hostnamesDave Barach37-59/+45
2015-12-08Initial commit of vpp code.v1.0.0Ed Warnicke68-0/+3132
d='n98' href='#n98'>98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
/*
 * Copyright (c) 2018 Cisco and/or its affiliates.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at:
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef __GBP_ENDPOINT_GROUP_H__
#define __GBP_ENDPOINT_GROUP_H__

#include <plugins/gbp/gbp_types.h>
#include <plugins/gbp/gbp_itf.h>

#include <vnet/fib/fib_types.h>

/**
 * Endpoint Retnetion Policy
 */
typedef struct gbp_endpoint_retention_t_
{
  /** Aging timeout for remote endpoints */
  u32 remote_ep_timeout;
} gbp_endpoint_retention_t;

/**
 * An Endpoint Group representation
 */
typedef struct gpb_endpoint_group_t_
{
  /**
   * ID
   */
  vnid_t gg_vnid;

  /**
   * Sclass. Could be unset => ~0
   */
  u16 gg_sclass;

  /**
   * Bridge-domain ID the EPG is in
   */
  index_t gg_gbd;

  /**
   * route-domain/IP-table ID the EPG is in
   */
  index_t gg_rd;

  /**
   * Is the EPG an external/NAT
   */
  u8 gg_is_ext;

  /**
   * the uplink interface dedicated to the EPG
   */
  u32 gg_uplink_sw_if_index;
  gbp_itf_hdl_t gg_uplink_itf;

  /**
   * The DPO used in the L3 path for forwarding internal subnets
   */
  dpo_id_t gg_dpo[FIB_PROTOCOL_IP_MAX];

  /**
   * Locks/references to this EPG
   */
  u32 gg_locks;

  /**
   * EP retention policy
   */
  gbp_endpoint_retention_t gg_retention;
} gbp_endpoint_group_t;

/**
 * EPG DB, key'd on EGP-ID
 */
typedef struct gbp_endpoint_group_db_t_
{
  uword *gg_hash_sclass;
} gbp_endpoint_group_db_t;

extern int gbp_endpoint_group_add_and_lock (vnid_t vnid,
					    u16 sclass,
					    u32 bd_id,
					    u32 rd_id,
					    u32 uplink_sw_if_index,
					    const gbp_endpoint_retention_t *
					    retention);
extern index_t gbp_endpoint_group_find (sclass_t sclass);
extern int gbp_endpoint_group_delete (sclass_t sclass);
extern void gbp_endpoint_group_unlock (index_t index);
extern void gbp_endpoint_group_lock (index_t index);
extern u32 gbp_endpoint_group_get_bd_id (const gbp_endpoint_group_t *);

extern gbp_endpoint_group_t *gbp_endpoint_group_get (index_t i);
extern index_t gbp_endpoint_group_get_fib_index (const gbp_endpoint_group_t *
						 gg, fib_protocol_t fproto);

typedef int (*gbp_endpoint_group_cb_t) (gbp_endpoint_group_t * gbpe,
					void *ctx);
extern void gbp_endpoint_group_walk (gbp_endpoint_group_cb_t bgpe, void *ctx);


extern u8 *format_gbp_endpoint_group (u8 * s, va_list * args);

/**
 * DP functions and databases
 */
extern gbp_endpoint_group_db_t gbp_endpoint_group_db;
extern gbp_endpoint_group_t *gbp_endpoint_group_pool;
extern uword *gbp_epg_sclass_db;

always_inline u32
gbp_epg_itf_lookup_sclass (sclass_t sclass)
{
  uword *p;

  p = hash_get (gbp_endpoint_group_db.gg_hash_sclass, sclass);

  if (NULL != p)
    {
      gbp_endpoint_group_t *gg;

      gg = pool_elt_at_index (gbp_endpoint_group_pool, p[0]);
      return (gg->gg_uplink_sw_if_index);
    }
  return (~0);
}

always_inline const dpo_id_t *
gbp_epg_dpo_lookup (sclass_t sclass, fib_protocol_t fproto)
{
  uword *p;

  p = hash_get (gbp_endpoint_group_db.gg_hash_sclass, sclass);

  if (NULL != p)
    {
      gbp_endpoint_group_t *gg;

      gg = pool_elt_at_index (gbp_endpoint_group_pool, p[0]);
      return (&gg->gg_dpo[fproto]);
    }
  return (NULL);
}

#endif

/*
 * fd.io coding-style-patch-verification: ON
 *
 * Local Variables:
 * eval: (c-set-style "gnu")
 * End:
 */