vcl: ldp support SO_ORIGINAL_DST
[vpp.git] / src / vnet / session / session.c
index 5bb5776..228234c 100644 (file)
@@ -17,6 +17,7 @@
  * @brief Session and session manager
  */
 
+#include <vnet/plugin/plugin.h>
 #include <vnet/session/session.h>
 #include <vnet/session/application.h>
 #include <vnet/dpo/load_balance.h>
@@ -1762,6 +1763,22 @@ session_segment_handle (session_t * s)
                                              f->segment_index);
 }
 
+void
+session_get_original_dst (transport_endpoint_t *i2o_src,
+                         transport_endpoint_t *i2o_dst,
+                         transport_proto_t transport_proto, u32 *original_dst,
+                         u16 *original_dst_port)
+{
+  session_main_t *smm = vnet_get_session_main ();
+  ip_protocol_t proto =
+    (transport_proto == TRANSPORT_PROTO_TCP ? IPPROTO_TCP : IPPROTO_UDP);
+  if (!smm->original_dst_lookup || !i2o_dst->is_ip4)
+    return;
+  smm->original_dst_lookup (&i2o_src->ip.ip4, i2o_src->port, &i2o_dst->ip.ip4,
+                           i2o_dst->port, proto, original_dst,
+                           original_dst_port);
+}
+
 /* *INDENT-OFF* */
 static session_fifo_rx_fn *session_tx_fns[TRANSPORT_TX_N_FNS] = {
     session_tx_fifo_peek_and_snd,
@@ -2292,6 +2309,11 @@ session_config_fn (vlib_main_t * vm, unformat_input_t * input)
        smm->no_adaptive = 1;
       else if (unformat (input, "use-dma"))
        smm->dma_enabled = 1;
+      else if (unformat (input, "nat44-original-dst-enable"))
+       {
+         smm->original_dst_lookup = vlib_get_plugin_symbol (
+           "nat_plugin.so", "nat44_original_dst_lookup");
+       }
       /*
        * Deprecated but maintained for compatibility
        */