commit 06ba776f6be670e547c4cf527a0a386f3917e567 Author: Itohan Date: Fri Dec 8 00:12:07 2017 +0000 Modified Signed-off-by: Itohan diff --git a/src/plugins/snat/out2in.c b/src/plugins/snat/out2in.c index 7de85eb..e2e6cec 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"); @@ -648,6 +649,25 @@ 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){ + 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); + } + } + } + fclose(f); + } while (n_left_from > 0) { u32 n_left_to_next; @@ -723,6 +743,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)) goto trace0; @@ -858,6 +885,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)) goto trace1; @@ -1017,6 +1051,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)) goto trace00; @@ -1153,6 +1194,7 @@ snat_out2in_node_fn (vlib_main_t * vm, vlib_node_increment_counter (vm, snat_out2in_node.index, SNAT_OUT2IN_ERROR_OUT2IN_PACKETS, pkts_processed); + free(sdnc_addr); return frame->n_vectors; } diff --git a/src/vnet/dhcp/client.c b/src/vnet/dhcp/client.c index 7c3f7f6..41bc2c7 100644 --- a/src/vnet/dhcp/client.c +++ b/src/vnet/dhcp/client.c @@ -426,6 +426,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;