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]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to