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: [email protected]
Unsubscribe: https://lists.fd.io/g/vpp-dev/unsub [[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-