diff options
Diffstat (limited to 'vnfs/vCPE/vpp-option-82-for-vbrg')
-rwxr-xr-x | vnfs/vCPE/vpp-option-82-for-vbrg/src/patches/VPP-Add-Option82-Nat-Filter-For-vBRG.patch | 99 |
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; |