summaryrefslogtreecommitdiffstats
path: root/vnfs/vCPE/vpp-option-82-for-vbrg
diff options
context:
space:
mode:
Diffstat (limited to 'vnfs/vCPE/vpp-option-82-for-vbrg')
-rwxr-xr-xvnfs/vCPE/vpp-option-82-for-vbrg/src/patches/VPP-Add-Option82-Nat-Filter-For-vBRG.patch99
1 files changed, 99 insertions, 0 deletions
diff --git a/vnfs/vCPE/vpp-option-82-for-vbrg/src/patches/VPP-Add-Option82-Nat-Filter-For-vBRG.patch b/vnfs/vCPE/vpp-option-82-for-vbrg/src/patches/VPP-Add-Option82-Nat-Filter-For-vBRG.patch
new file mode 100755
index 00000000..73b19150
--- /dev/null
+++ b/vnfs/vCPE/vpp-option-82-for-vbrg/src/patches/VPP-Add-Option82-Nat-Filter-For-vBRG.patch
@@ -0,0 +1,99 @@
+diff --git a/src/plugins/snat/out2in.c b/src/plugins/snat/out2in.c
+index 5c12b47..f7c7caf 100644
+--- a/src/plugins/snat/out2in.c
++++ b/src/plugins/snat/out2in.c
+@@ -1,3 +1,4 @@
++
+ /*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+@@ -658,6 +659,26 @@ snat_out2in_node_fn (vlib_main_t * vm,
+ n_left_from = frame->n_vectors;
+ next_index = node->cached_next_index;
+
++ //FOR BRG
++ ip4_address_t * sdnc_addr = malloc(4);
++ char line_input[128];
++ char * path = "/opt/config/ip.txt";
++ FILE * f = fopen(path, "r");
++ if (f == NULL)
++ printf("cannot open such file\n");
++
++ while (fgets(line_input, 128, f) != NULL){
++ if (!strcmp(strtok(line_input, " "),"sdnc_ip:")){
++ char * ip = strtok(NULL, " ");
++ char * num = strtok(ip, ".");
++ sdnc_addr->data[0] = atoi(num);
++ for (int i = 1; i < 4; i ++){
++ num = strtok(NULL, ".");
++ sdnc_addr->data[i] = atoi(num);
++ }
++ }
++ }
++
+ while (n_left_from > 0)
+ {
+ u32 n_left_to_next;
+@@ -733,6 +754,13 @@ snat_out2in_node_fn (vlib_main_t * vm,
+
+ proto0 = ip_proto_to_snat_proto (ip0->protocol);
+
++ //for BRG
++ if (PREDICT_TRUE (ip0->src_address.data_u32 != sdnc_addr->data_u32))
++ {
++ next0 = SNAT_OUT2IN_NEXT_LOOKUP;
++ goto trace0;
++ }
++
+ if (PREDICT_FALSE (proto0 == ~0))
+ {
+ snat_out2in_unknown_proto(sm, b0, ip0, rx_fib_index0);
+@@ -871,6 +899,13 @@ snat_out2in_node_fn (vlib_main_t * vm,
+
+ proto1 = ip_proto_to_snat_proto (ip1->protocol);
+
++ //for BRG
++ if (PREDICT_TRUE (ip1->src_address.data_u32 != sdnc_addr->data_u32))
++ {
++ next1 = SNAT_OUT2IN_NEXT_LOOKUP;
++ goto trace1;
++ }
++
+ if (PREDICT_FALSE (proto1 == ~0))
+ {
+ snat_out2in_unknown_proto(sm, b1, ip1, rx_fib_index1);
+@@ -1033,6 +1068,13 @@ snat_out2in_node_fn (vlib_main_t * vm,
+
+ proto0 = ip_proto_to_snat_proto (ip0->protocol);
+
++ //for BRG
++ if (PREDICT_TRUE (ip0->src_address.data_u32 != sdnc_addr->data_u32))
++ {
++ next0 = SNAT_OUT2IN_NEXT_LOOKUP;
++ goto trace00;
++ }
++
+ if (PREDICT_FALSE (proto0 == ~0))
+ {
+ snat_out2in_unknown_proto(sm, b0, ip0, rx_fib_index0);
+diff --git a/src/vnet/dhcp/client.c b/src/vnet/dhcp/client.c
+index 014f17a..296e1a7 100644
+--- a/src/vnet/dhcp/client.c
++++ b/src/vnet/dhcp/client.c
+@@ -427,6 +427,16 @@ send_dhcp_pkt (dhcp_client_main_t * dcm, dhcp_client_t * c,
+ clib_memcpy (o->data, c->option_55_data, vec_len(c->option_55_data));
+ o = (dhcp_option_t *) (((uword) o) + (o->length + 2));
+
++ /*send option 82*/
++ u8 sub2_len = vec_len(hw->hw_address);
++ o->option = 82;
++ o->length = sub2_len + 2;
++ u8 sub_option = 2;
++ clib_memcpy (o->data, &sub_option, 1);
++ clib_memcpy (o->data + 1,&sub2_len, 1);
++ clib_memcpy (o->data + 2, hw->hw_address, vec_len(hw->hw_address));
++ o = (dhcp_option_t *) (((uword) o) + (o->length +2));
++
+ /* End of list */
+ o->option = 0xff;
+ o->length = 0;