please tell me how to update the value of the tcp-flags in each new packets? For example, to make a tcp-session break. -- с уважением, Владислав
/* * Copyright (c) 2015 Cisco and/or its affiliates. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at: * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include <vlib/vlib.h> #include <vnet/vnet.h> #include <vnet/pg/pg.h> #include <vppinfra/error.h> #include <sample/sample.h> #include <vnet/ethernet/packet.h> #include <vnet/ip/ip4_packet.h> #include <arpa/inet.h> //#include <dpdk/ipsec/ipsec.h>
u8 count =0; // typedef struct { u32 next_index; u32 sw_if_index; u8 new_src_mac[6]; u8 new_dst_mac[6]; } sample_trace_t; static u8 * format_mac_address (u8 * s, va_list * args) { u8 *a = va_arg (*args, u8 *); return format (s, "%02x:%02x:%02x:%02x:%02x:%02x", a[0], a[1], a[2], a[3], a[4], a[5]); } /* packet trace format function */ static u8 * format_sample_trace (u8 * s, va_list * args) { CLIB_UNUSED (vlib_main_t * vm) = va_arg (*args, vlib_main_t *); CLIB_UNUSED (vlib_node_t * node) = va_arg (*args, vlib_node_t *); sample_trace_t * t = va_arg (*args, sample_trace_t *); clib_warning("SAMPLE TRACe: dst =%u | src=%u | sw_if_index = %u\n", t->new_dst_mac , t->new_src_mac, t->sw_if_index); s = format (s, "SAMPLE TRACe: sw_if_index %d, next index %d\n", t->sw_if_index, t->next_index); s = format (s, " new src %U -> new dst %U", format_mac_address, t->new_src_mac, format_mac_address, t->new_dst_mac); return s; } vlib_node_registration_t sample_node; #define foreach_sample_error \ _(SWAPPED, "Mac swap packets processed") typedef enum { #define _(sym,str) SAMPLE_ERROR_##sym, foreach_sample_error #undef _ SAMPLE_N_ERROR, } sample_error_t; static char * sample_error_strings[] = { #define _(sym,string) string, foreach_sample_error #undef _ }; typedef enum { SAMPLE_NEXT_INTERFACE_OUTPUT, SAMPLE_N_NEXT, } sample_next_t; #define foreach_mac_address_offset \ _(0) \ _(1) \ _(2) \ _(3) \ _(4) \ _(5) static uword sample_node_fn (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame) { u32 n_left_from, * from, * to_next; sample_next_t next_index; u32 pkts_swapped = 0; from = vlib_frame_vector_args (frame); n_left_from = frame->n_vectors; next_index = node->cached_next_index; while (n_left_from > 0) { u32 n_left_to_next; vlib_get_next_frame (vm, node, next_index, to_next, n_left_to_next); while (n_left_from > 0 && n_left_to_next > 0) { u32 bi0; vlib_buffer_t * b0; u32 next0 = SAMPLE_NEXT_INTERFACE_OUTPUT; // u32 next0 = SAMPLE_N_NEXT; u32 sw_if_index0; u8 tmp0[6]; ethernet_header_t *en0; ip4_header_t * ip40; ip4_address_t * dst_addr_ip40; tcp_header_t *tcp_0; //__attribute__((unused)) tcp_header_t * tcp_0; //tcp_header_t *tcp_0; u32 *ip_src = 0 , ip_dst = 0; /* speculatively enqueue b0 to the current next frame */ bi0 = from[0]; to_next[0] = bi0; from += 1; to_next += 1; n_left_from -= 1; n_left_to_next -= 1; //Get the reference to the buffer b0 = vlib_get_buffer (vm, bi0); // add 2507 >>> sw_if_index0 = vnet_buffer(b0)->sw_if_index[VLIB_RX]; // <<< /* * Direct from the driver, we should be at offset 0 * aka at &b0->data[0] */ ASSERT (b0->current_data == 0); //2 var en0 = vlib_buffer_get_current (b0); ip40 = (ip4_header_t *)( en0 + 1) ; tcp_0 =ip4_next_header(ip40); vlib_buffer_add_data(vm ,) if(ip40->protocol == 6) clib_warning("protocol TCP \n" ); if(ip40->protocol == 17) clib_warning("protocol UDP \n" ); struct in_addr addr; addr.s_addr = htonl(ip40->src_address.as_u32); ip_src = inet_ntoa(addr); // addr.s_addr = htonl(ip40->dst_address.as_u32); // ip_dst = inet_ntoa(addr); clib_warning("NODE ADDRESS: ip src = %s | dst = %s\n" , ip_src,ip_dst); /* This is where you do whatever you'd like to with your packet */ /* ... */ clib_warning("NODE: BEFORE: tcp_0->flags = 0x%x\n" , tcp_0->flags); // for (int i=0; i<6;i++) clib_warning("en0->src_address%d] = %u\n", i , en0->src_address[i]); // for example( in the future ACL rules) >>> count++; // <<< if(count ==10) { tcp_0->flags&=0x0; tcp_0->flags|=0x5; //RST+FIN clib_warning("IZM!:tcp_0->flags = 0x%x\n" , tcp_0->flags); /* This is not the fastest way to swap src + dst mac addresses */ #define _(a) tmp0[a] = en0->src_address[a]; foreach_mac_address_offset; #undef _ #define _(a) en0->src_address[a] = en0->dst_address[a]; foreach_mac_address_offset; #undef _ #define _(a) en0->dst_address[a] = tmp0[a]; foreach_mac_address_offset; #undef _ sw_if_index0 = vnet_buffer(b0)->sw_if_index[VLIB_RX]; vnet_buffer(b0)->sw_if_index[VLIB_TX] = sw_if_index0; sample_trace_t *t = vlib_add_trace (vm, node, b0, sizeof (*t)); t->sw_if_index = sw_if_index0; t->next_index = next0; //swapped src & dst ?? clib_memcpy (t->new_src_mac, en0->dst_address , sizeof (t->new_dst_mac)); clib_memcpy (t->new_dst_mac, en0->src_address, sizeof (t->new_src_mac)); clib_warning("t->new_src_mac = %u\n" , t->new_src_mac); clib_warning("t->new_dst_mac = %u\n" , t->new_dst_mac); pkts_swapped += 1; vlib_validate_buffer_enqueue_x1 (vm, node, next_index, to_next, n_left_to_next, bi0, next0); vlib_put_next_frame (vm, node, next_index, n_left_to_next); } // end --- if(count ==10) // !!!commented out a section of code that does not allow traffic to pass through the plugin // ------------------------------------ ---------------------------- -------------------------------------------------- // /* Get the software index for the hardware */ //sw_if_index0 = vnet_buffer(b0)->sw_if_index[VLIB_RX]; // nb!1707 // Send pkt back out the RX interface //vnet_buffer(b0)->sw_if_index[VLIB_TX] = sw_if_index0; // nb!1707 // ------------------------------------ ---------------------------- -------------------------------------------------- // // ----> vnet_buffer(b0)->sw_if_index[VLIB_RX] = 0; 0 - local inyerface // ----> vnet_buffer(b0)->sw_if_index[VLIB_TX] = ~0; ne znayu /* Do we want to trace (used for debugging) */ if (PREDICT_FALSE((node->flags & VLIB_NODE_FLAG_TRACE) && (b0->flags & VLIB_BUFFER_IS_TRACED))) { sample_trace_t *t = vlib_add_trace (vm, node, b0, sizeof (*t)); t->sw_if_index = sw_if_index0; t->next_index = next0; clib_memcpy (t->new_src_mac, en0->src_address, sizeof (t->new_src_mac)); clib_memcpy (t->new_dst_mac, en0->dst_address, sizeof (t->new_dst_mac)); clib_warning("t->new_src_mac = %u\n" , t->new_src_mac); clib_warning("t->new_dst_mac = %u\n" , t->new_dst_mac); } pkts_swapped += 1; // verify speculative enqueue, maybe switch current next frame vlib_validate_buffer_enqueue_x1 (vm, node, next_index, to_next, n_left_to_next, bi0, next0); vlib_put_next_frame (vm, node, next_index, n_left_to_next); } // ende --------- while (n_left_from > 0 && n_left_to_next > 0) vlib_put_next_frame (vm, node, next_index, n_left_to_next); } vlib_node_increment_counter (vm, sample_node.index, SAMPLE_ERROR_SWAPPED, pkts_swapped); return frame->n_vectors; } VLIB_REGISTER_NODE (sample_node) = { .function = sample_node_fn, .name = "sample", .vector_size = sizeof (u32), .format_trace = format_sample_trace, .type = VLIB_NODE_TYPE_INTERNAL, .n_errors = ARRAY_LEN(sample_error_strings), .error_strings = sample_error_strings, .n_next_nodes = SAMPLE_N_NEXT, /* edit / add dispositions here */ .next_nodes = { [SAMPLE_NEXT_INTERFACE_OUTPUT] = "ethernet-input", //"ethernet-input", //"interface-output" }, };
-=-=-=-=-=-=-=-=-=-=-=- Links: You receive all messages sent to this group. View/Reply Online (#9928): https://lists.fd.io/g/vpp-dev/message/9928 Mute This Topic: https://lists.fd.io/mt/23811656/21656 Group Owner: vpp-dev+ow...@lists.fd.io Unsubscribe: https://lists.fd.io/g/vpp-dev/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-