Print this page
WIP to help bringup NAT flows
*** 49,58 ****
--- 49,59 ----
list_node_t vxnr_link;
/* refheld link, or if NULL, this rule is "condemned" and no good. */
struct vxlnat_vnet_s *vxnr_vnet;
in6_addr_t vxnr_myaddr;
in6_addr_t vxnr_pubaddr;
+ /* XXX KEBE ASKS, ire? */
uint8_t vxnr_myether[ETHERADDRL];
uint16_t vxnr_vlanid; /* Fabrics use this too. */
uint32_t vxnr_refcount;
uint8_t vxnr_prefix;
} vxlnat_rule_t;
*** 69,79 ****
extern void vxlnat_rule_free(vxlnat_rule_t *);
/*
* NAT FLOWS. These are per-vnet, and keyed/searched by:
* <inner-IP-source,IP-dest,inner-source-port,dest-port,protocol>.
! * They will be tied-to/part-of
*/
typedef struct vxlnat_flow_s {
avl_node_t vxnfl_treenode;
/*
* I'm guessing that dst varies more than src. Also
--- 70,80 ----
extern void vxlnat_rule_free(vxlnat_rule_t *);
/*
* NAT FLOWS. These are per-vnet, and keyed/searched by:
* <inner-IP-source,IP-dest,inner-source-port,dest-port,protocol>.
! * They will be tied-to/part-of a conn_t.
*/
typedef struct vxlnat_flow_s {
avl_node_t vxnfl_treenode;
/*
* I'm guessing that dst varies more than src. Also
*** 84,104 ****
--- 85,122 ----
in6_addr_t vxnfl_src; /* INNER source address. */
uint32_t vxnfl_ports;
uint8_t vxnfl_protocol;
uint8_t vxnfl_isv4 : 1, /* Will save us 12 bytes of compares... */
vxlfl_reserved1 : 7;
+ /* Theoretically 16 bits lies where this comment is. */
+ uint32_t vxnfl_refcount;
conn_t *vxnfl_connp; /* Question - embed instead? */
vxlnat_rule_t *vxnfl_rule; /* Refhold to rule that generated me. */
+ /*
+ * XXX KEBE SAYS Other NAT-state belongs here too. Like time-values
+ * for timeouts, and more!
+ */
} vxlnat_flow_t;
/* Exploit endianisms, maintain network order... */
#ifdef _BIG_ENDIAN
#define VXNFL_SPORT(ports) (uint16_t)((ports) >> 16) /* Unsigned all around. */
#define VXNFL_DPORT(ports) ((ports) & 0xFFFF)
#else
#define VXNFL_SPORT(ports) ((ports) & 0xFFFF)
#define VXNFL_DPORT(ports) (uint16_t)((ports) >> 16) /* Unsigned all around. */
#endif
+ #define VXNFL_REFHOLD(vxnfl) { \
+ atomic_inc_32(&(vxnfl)->vxnfl_refcount); \
+ ASSERT((vxnfl)->vxnfl_refcount > 0); \
+ }
+ #define VXNFL_REFRELE(vxnfl) { \
+ ASSERT((vxnfl)->vxnfl_refcount > 0); \
+ membar_exit(); \
+ if (atomic_dec_32_nv(&(vxnfl)->vxnfl_refcount) == 0) \
+ vxlnat_flow_free(vxnfl); \
+ }
+ extern void vxlnat_flow_free(vxlnat_flow_t *);
/*
* 1-1 IP mapping.
*/
typedef struct vxlnat_fixed_s {
*** 261,270 ****
--- 279,293 ----
extern int vxlnat_fixed_ire_send_v4(ire_t *, mblk_t *, void *,
ip_xmit_attr_t *, uint32_t *);
extern int vxlnat_fixed_ire_send_v6(ire_t *, mblk_t *, void *,
ip_xmit_attr_t *, uint32_t *);
+ extern boolean_t vxlnat_new_conn(vxlnat_flow_t *);
+ extern void vxlnat_activate_conn(vxlnat_flow_t *);
+ #ifdef notyet
+ extern void vxlnat_deactivate_conn(vxlnat_flow_t *);
+ #endif
extern vxlnat_vnet_t *vxlnat_get_vnet(uint32_t, boolean_t);
#ifdef __cplusplus
}