text: /*
   *------------------------------------------------------------------
   * vcgn_db.h - translation database definitions
   *
   * Copyright (c) 2007-2014 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 __VCGN_DB_H__
  #define __VCGN_DB_H__
  
  #include "index_list.h"
  
  /*
   * The key structure. All fields are in NETWORK byte order!
   */
  typedef struct {
      u32 ipv4;
      u16 port;
      u16 vrf;  //bit0-12:vrf, bit13:unused, bit14-15:protocol
  } cnat_db_key_t;
  
  /* bit14-15:protocol in cnat_db_key_t */
  #define CNAT_INVALID_PROTO     0x0000
  #define CNAT_UDP      0x4000
  #define CNAT_TCP      0x8000
  #define CNAT_ICMP     0xc000
  #define CNAT_VRF_MASK 0x3fff
  #define CNAT_PRO_MASK 0xc000
  #define CNAT_PRO_SHIFT 14
  
  /*
   * Maximum number of VRF entries supported
   */
  #define CNAT_MAX_VRFMAP_ENTRIES  (CNAT_VRF_MASK + 1)
  /*
   * for hashing purposes, fetch the key in one instr.
   */
  typedef union {
      cnat_db_key_t k;
      u64 key64;
  } cnat_key_t;
  
  /*
   * Main translation database entries. Currently 0x50 = 80 bytes in length.
   * Given 20,000,000 entries, it saves nearly 1gb of SDRAM to pack the entries
   * and pay the extra prefetch. So, that's what we do.
   */
  
  typedef struct {
      /* 0x00 */
      index_slist_t out2in_hash;  /* hash-and-chain, x2 */
      index_slist_t in2out_hash; 
  
      /* 0x08 */
      cnat_key_t out2in_key;      /* network-to-user, outside-to-inside key */
  
      /* 0x10 */
      cnat_key_t in2out_key;      /* user-to-network, inside-to-outside key */
  
      /* 0x18 */
      index_dlist_t user_ports;   /* per-user translation list */
  
      /* 0x20 */
      u32 user_index;             /* index of user that owns this entry */
  
      /* 0x24 */
      u16 vrfmap_index;           /* index of vrfmap */
  
      /* 0x26 */
      u16 flags;                  /* Always need flags... */
  #define CNAT_DB_FLAG_PORT_PAIR (1<<0)
  #define CNAT_DB_FLAG_TCP_ACTIVE (1<<1)
  #define CNAT_DB_FLAG_ENTRY_FREE (1<<2)
  #define CNAT_DB_FLAG_UDP_ACTIVE (1<<3)
  #define CNAT_DB_FLAG_STATIC_PORT (1<<4)
  #define CNAT_DB_FLAG_ALG_ENTRY  (1<<5)
      
      /* 0x28 */
      u32 dst_ipv4;               /* pointer to ipv4 dst list, used in evil mode */
  
      /* 0x2C */
      u32 out2in_pkts;            /* pkt counters */
  
      /* 0x30 */
      u32 in2out_pkts;
  
      /* 0x34 */
      u32 entry_expires;     /* timestamp used to expire translations */
  
      /* 0x38 */
      union {                     /* used by FTP ALG, pkt len delta due to FTP PORT cmd */
      u16 delta;             
      i8  alg_dlt[2];             /* two delta values, 0 for previous, 1 for current */
      u16 il;                     /* Used to indicate if interleaved mode is used
                                     in case of RTSP ALG */
      } alg;
  
      /* 0x 48 */
      u32 tcp_seq_num;            /* last tcp (FTP) seq # that has pkt len change due to PORT */
  
      cnat_timeout_t destn_key;  
  
      /* 0x4C... last byte -- 72 total */
  } cnat_main_db_entry_t;
  #endif
  