- ip4_address_t e_addr;
- snat_protocol_t proto;
-
- locals = unformat_nat44_lb_addr_port (mp->locals, mp->local_num);
- clib_memcpy (&e_addr, mp->external_addr, 4);
- proto = ip_proto_to_snat_proto (mp->protocol);
-
- rv =
- nat44_add_del_lb_static_mapping (e_addr,
- clib_net_to_host_u16 (mp->external_port),
- proto, clib_net_to_host_u32 (mp->vrf_id),
- locals, mp->is_add, mp->twice_nat);
-
- vec_free (locals);
-
- REPLY_MACRO (VL_API_NAT44_ADD_DEL_LB_STATIC_MAPPING_REPLY);
-}
-
-static void *vl_api_nat44_add_del_lb_static_mapping_t_print
- (vl_api_nat44_add_del_lb_static_mapping_t * mp, void *handle)
-{
- u8 *s;
-
- s = format (0, "SCRIPT: nat44_add_del_lb_static_mapping ");
- s = format (s, "is_add %d twice_nat %d", mp->is_add, mp->twice_nat);
-
- FINISH;
-}
-
-static void
-send_nat44_lb_static_mapping_details (snat_static_mapping_t * m,
- unix_shared_memory_queue_t * q,
- u32 context)
-{
- vl_api_nat44_lb_static_mapping_details_t *rmp;
- snat_main_t *sm = &snat_main;
- nat44_lb_addr_port_t *ap;
- vl_api_nat44_lb_addr_port_t *locals;
-
- rmp =
- vl_msg_api_alloc (sizeof (*rmp) +
- (vec_len (m->locals) * sizeof (nat44_lb_addr_port_t)));
- memset (rmp, 0, sizeof (*rmp));
- rmp->_vl_msg_id =
- ntohs (VL_API_NAT44_LB_STATIC_MAPPING_DETAILS + sm->msg_id_base);
-
- clib_memcpy (rmp->external_addr, &(m->external_addr), 4);
- rmp->external_port = ntohs (m->external_port);
- rmp->protocol = snat_proto_to_ip_proto (m->proto);
- rmp->vrf_id = ntohl (m->vrf_id);
- rmp->context = context;
- rmp->twice_nat = m->twice_nat;
-
- locals = (vl_api_nat44_lb_addr_port_t *) rmp->locals;
- vec_foreach (ap, m->locals)
- {
- clib_memcpy (locals->addr, &(ap->addr), 4);
- locals->port = htons (ap->port);
- locals->probability = ap->probability;
- locals++;
- rmp->local_num++;
- }
-
- vl_msg_api_send_shmem (q, (u8 *) & rmp);
-}
-
-static void
- vl_api_nat44_lb_static_mapping_dump_t_handler
- (vl_api_nat44_lb_static_mapping_dump_t * mp)
-{
- unix_shared_memory_queue_t *q;
- snat_main_t *sm = &snat_main;
- snat_static_mapping_t *m;
-
- q = vl_api_client_index_to_input_queue (mp->client_index);
- if (q == 0)
- return;
-
- /* *INDENT-OFF* */
- pool_foreach (m, sm->static_mappings,
- ({
- if (vec_len(m->locals))
- send_nat44_lb_static_mapping_details (m, q, mp->context);
- }));
- /* *INDENT-ON* */
-}
-
-static void *vl_api_nat44_lb_static_mapping_dump_t_print
- (vl_api_nat44_lb_static_mapping_dump_t * mp, void *handle)
-{
- u8 *s;
-
- s = format (0, "SCRIPT: nat44_lb_static_mapping_dump ");
-
- FINISH;
-}
-
-static void
-vl_api_nat44_del_session_t_handler (vl_api_nat44_del_session_t * mp)
-{
- snat_main_t *sm = &snat_main;
- vl_api_nat44_del_session_reply_t *rmp;
- ip4_address_t addr;
- u16 port;
- u32 vrf_id;
- int rv = 0;
- snat_protocol_t proto;
-
- memcpy (&addr.as_u8, mp->address, 4);
- port = clib_net_to_host_u16 (mp->port);
- vrf_id = clib_net_to_host_u32 (mp->vrf_id);
- proto = ip_proto_to_snat_proto (mp->protocol);
-
- rv = nat44_del_session (sm, &addr, port, proto, vrf_id, mp->is_in);
-
- REPLY_MACRO (VL_API_NAT44_DEL_SESSION_REPLY);
-}
-
-static void *
-vl_api_nat44_del_session_t_print (vl_api_nat44_del_session_t * mp,
- void *handle)
-{
- u8 *s;
-
- s = format (0, "SCRIPT: nat44_add_del_static_mapping ");
- s = format (s, "addr %U port %d protocol %d vrf_id %d is_in %d",
- format_ip4_address, mp->address,
- clib_net_to_host_u16 (mp->port),
- mp->protocol, clib_net_to_host_u32 (mp->vrf_id), mp->is_in);
-
- FINISH;
-}
-
-/*******************************/
-/*** Deterministic NAT (CGN) ***/
-/*******************************/
-
-static void
-vl_api_nat_det_add_del_map_t_handler (vl_api_nat_det_add_del_map_t * mp)
-{
- snat_main_t *sm = &snat_main;
- vl_api_nat_det_add_del_map_reply_t *rmp;
- int rv = 0;
- ip4_address_t in_addr, out_addr;
-
- if (!mp->is_nat44)
- {
- rv = VNET_API_ERROR_UNIMPLEMENTED;
- goto send_reply;
- }
-
- clib_memcpy (&in_addr, mp->in_addr, 4);
- clib_memcpy (&out_addr, mp->out_addr, 4);
- rv = snat_det_add_map (sm, &in_addr, mp->in_plen, &out_addr,
- mp->out_plen, mp->is_add);
-
-send_reply:
- REPLY_MACRO (VL_API_NAT_DET_ADD_DEL_MAP_REPLY);
-}
-
-static void *
-vl_api_nat_det_add_del_map_t_print (vl_api_nat_det_add_del_map_t * mp,
- void *handle)
-{
- u8 *s;
-
- s = format (0, "SCRIPT: nat_det_add_del_map ");
- s = format (s, "inside address %U/%d outside address %U/%d\n",
- format_ip4_address, mp->in_addr, mp->in_plen,
- format_ip4_address, mp->out_addr, mp->out_plen);
-
- FINISH;
-}
-
-static void
-vl_api_nat_det_forward_t_handler (vl_api_nat_det_forward_t * mp)
-{
- snat_main_t *sm = &snat_main;
- vl_api_nat_det_forward_reply_t *rmp;
- int rv = 0;
- u16 lo_port = 0, hi_port = 0;
- snat_det_map_t *dm;
- ip4_address_t in_addr, out_addr;