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
#include
#include
#include
#include
#include
#include
#include
//#include
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 >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_addraddr;
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