#include <vnet/pg/pg.h>
#include <vnet/udp/udp.h>
#include <vnet/tcp/tcp.h>
+#include <vnet/sctp/sctp.h>
#include <vnet/ip/punt.h>
#include <vppinfra/sparse_vec.h>
#include <vlib/unix/unix.h>
punt_client_t *v = is_ip4 ? pm->clients_by_dst_port4 :
pm->clients_by_dst_port6;
- memset (&c, 0, sizeof (c));
+ clib_memset (&c, 0, sizeof (c));
memcpy (c.caddr.sun_path, client_pathname, sizeof (c.caddr.sun_path));
c.caddr.sun_family = AF_UNIX;
c.port = port;
vlib_node_runtime_t * node,
vlib_frame_t * frame, bool is_ip4)
{
- u32 *buffers = vlib_frame_args (frame);
+ u32 *buffers = vlib_frame_vector_args (frame);
uword n_packets = frame->n_vectors;
struct iovec *iovecs = 0;
punt_main_t *pm = &punt_main;
c = punt_client_get (is_ip4, port);
udp_punt_trace_t *t;
t = vlib_add_trace (vm, node, b, sizeof (t[0]));
- clib_memcpy (&t->client, c, sizeof (t->client));
+ clib_memcpy_fast (&t->client, c, sizeof (t->client));
}
/* Re-set iovecs if present. */
}
udp_punt_trace_t *t;
t = vlib_add_trace (vm, node, b, sizeof (t[0]));
- clib_memcpy (&t->client, c, sizeof (t->client));
+ clib_memcpy_fast (&t->client, c, sizeof (t->client));
t->is_midchain = 1;
}
bool is_add)
{
- /* For now we only support UDP punt */
- if (protocol != IP_PROTOCOL_UDP && protocol != IP_PROTOCOL_TCP)
+ /* For now we only support TCP, UDP and SCTP punt */
+ if (protocol != IP_PROTOCOL_UDP &&
+ protocol != IP_PROTOCOL_TCP && protocol != IP_PROTOCOL_SCTP)
return clib_error_return (0,
- "only UDP (%d) and TCP (%d) protocols are supported, got %d",
- IP_PROTOCOL_UDP, IP_PROTOCOL_TCP, protocol);
+ "only UDP (%d), TCP (%d) and SCTP (%d) protocols are supported, got %d",
+ IP_PROTOCOL_UDP, IP_PROTOCOL_TCP,
+ IP_PROTOCOL_SCTP, protocol);
if (ipv != (u8) ~ 0 && ipv != 4 && ipv != 6)
return clib_error_return (0, "IP version must be 4 or 6, got %d", ipv);
udp_punt_unknown (vm, 1, is_add);
else if (protocol == IP_PROTOCOL_TCP)
tcp_punt_unknown (vm, 1, is_add);
+ else if (protocol == IP_PROTOCOL_SCTP)
+ sctp_punt_unknown (vm, 1, is_add);
}
if ((ipv == 6) || (ipv == (u8) ~ 0))
udp_punt_unknown (vm, 0, is_add);
else if (protocol == IP_PROTOCOL_TCP)
tcp_punt_unknown (vm, 0, is_add);
+ else if (protocol == IP_PROTOCOL_SCTP)
+ sctp_punt_unknown (vm, 0, is_add);
}
return 0;
else if (is_add)
{
- if (protocol == IP_PROTOCOL_TCP)
- return clib_error_return (0, "punt TCP ports is not supported yet");
+ if (protocol == IP_PROTOCOL_TCP || protocol == IP_PROTOCOL_SCTP)
+ return clib_error_return (0,
+ "punt TCP/SCTP ports is not supported yet");
if (ipv == 4 || ipv == (u8) ~ 0)
udp_register_dst_port (vm, port, udp4_punt_node.index, 1);
return clib_error_return (0, "socket error");
}
- memset (&addr, 0, sizeof (addr));
+ clib_memset (&addr, 0, sizeof (addr));
addr.sun_family = AF_UNIX;
if (*socket_path == '\0')
{
clib_file_t template = { 0 };
template.read_function = punt_socket_read_ready;
template.file_descriptor = pm->socket_fd;
+ template.description = format (0, "%s", socket_path);
pm->clib_file_index = clib_file_add (fm, &template);
pm->is_configured = true;