Dear Klement,

thanks for the hint. I had a look at the code bfd_main.c and in particular
at the function bfd_send_periodic().

I wrote the function send_udp_packet()  -- see below -- in order to send
out UDP packets.

The function is executed (I can see from the VPP terminal) and no exception
is raised, however I do not see any packet out.

1 -- is the function correct or I am missing something?

2 -- if it is not correct, how I can see where the problem is?


Thanks,

Alessio



static void send_udp_packet(vlib_main_t * vm, vlib_node_runtime_t * rt){
    u32 bi;
    vlib_buffer_alloc (vm, &bi, 1)
    vlib_buffer_t *b = vlib_get_buffer (vm, bi);
    ASSERT (b->current_data == 0);
    memset (vnet_buffer (b), 0, sizeof (*vnet_buffer (b)));
    VLIB_BUFFER_TRACE_TRAJECTORY_INIT (b);
    add_udp4_transport (vm,b);
}
int add_udp4_transport (vlib_main_t * vm, vlib_buffer_t * b)
{
    vnet_buffer (b)->ip.adj_index[VLIB_RX] =  ~0;
    vnet_buffer (b)->ip.adj_index[VLIB_TX]=  ~0;
    vnet_buffer (b)->sw_if_index[VLIB_RX] = 0;
    vnet_buffer (b)->sw_if_index[VLIB_TX] = ~0;
    u8 *data;
    udp_header_t *udp;
    ip4_header_t *ip;
    data = vlib_buffer_get_current (b);
    udp = (udp_header_t *) (data - sizeof (udp_header_t));
    ip = (ip4_header_t *) ((u8 *) udp - sizeof (ip4_header_t));
    // Build packet header
    u32 src_address = 167772161; //10.0.0.1  u32 version
    u32 dst_address = 167772162; // 10.0.0.2 u32 version
    ip->src_address.as_u32 = src_address;
    ip->dst_address.as_u32 = dst_address;
    ip->ip_version_and_header_length = 0x45;
    ip->ttl = 254;
    ip->protocol = IP_PROTOCOL_UDP; //0x45 == IP_PROTOCOL_UDP
    ip->length = clib_host_to_net_u16 (b->current_length + sizeof (*udp));
    ip->checksum = ip4_header_checksum (ip);
    udp->src_port = DNS_SERVER_PORT;
    udp->dst_port = DNS_DST_PORT;
    udp->length = clib_host_to_net_u16 (b->current_length);
    udp->checksum = 0;
    b->current_length = sizeof (*ip) + sizeof (*udp);
    return 1;
}









On Wed, Jun 14, 2017 at 6:56 PM, Klement Sekera -X (ksekera - PANTHEON
TECHNOLOGIES at Cisco) <ksek...@cisco.com> wrote:

> Hi Alessio,
>
> you can take a look at BFD code which
>
> a.) creates and sends its own UDP packets - bfd_main.c -
> bfd_send_periodic() creates, encapsulates (UDP) and sends a packet out
> b.) loops back packets received - bfd_udp.c - bfd_udp_echo_input()
>
> I'm not sure what's your use case, whether you are trying to reuse
> existing buffer, but one of these should fit it.
>
> Regards,
> Klement
>
> Quoting Alessio Silvestro (2017-06-14 17:22:14)
> >    Dear all,
> >    I implemented a new VPP node that receives UDP traffic using the
> following
> >    function:
> >
> >    udp_register_dst_port (vm, PORT, my_node.index , 1 /* is_ip4 */);
> >
> >    I am able to parse the packet and I would like to be able to send
> back an
> >    UDP packet.
> >
> >    Looking at the source code, the only function that seems fit my scope
> is
> >    the following (in ~/vpp/src/vnet/udp/udp.h)
> >
> >    ip_udp_encap_one (vlib_main_t * vm, vlib_buffer_t * b0, u8 * ec0, word
> >    ec_len,
> >
> >              u8 is_ip4)
> >
> >    Is that correct or there is another function for this purpose?
> >
> >    Thanks in advance for any help.
> >
> >    Best regards,
> >
> >    Alessio
>
_______________________________________________
vpp-dev mailing list
vpp-dev@lists.fd.io
https://lists.fd.io/mailman/listinfo/vpp-dev
  • [vpp-dev] VPP... Alessio Silvestro
    • Re: [vpp... Klement Sekera -X (ksekera - PANTHEON TECHNOLOGIES at Cisco)
      • Re: ... Alessio Silvestro
        • ... Klement Sekera -X (ksekera - PANTHEON TECHNOLOGIES at Cisco)
          • ... Dharmaray Kundargi
            • ... Neale Ranns (nranns)
              • ... Alessio Silvestro
                • ... Neale Ranns (nranns)
                • ... Alessio Silvestro
                • ... Alessio Silvestro
                • ... Neale Ranns (nranns)

Reply via email to