Skip to content

Commit

Permalink
[transports] add information about the nature of the transport and su…
Browse files Browse the repository at this point in the history
…pported access lists

Signed-off-by: Fabio M. Di Nitto <fdinitto@redhat.com>
  • Loading branch information
fabbione committed Feb 18, 2019
1 parent 6b69446 commit 0d9bcc6
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 4 deletions.
31 changes: 31 additions & 0 deletions libknet/internals.h
Expand Up @@ -265,6 +265,34 @@ extern pthread_rwlock_t shlib_rwlock; /* global shared lib load lock */
* for every protocol.
*/

/*
* for now knet supports only IP protocols (udp/sctp)
* in future there might be others like ARP
* or TIPC.
* keep this around as transport information
* to use for access lists and other operations
*/

typedef enum {
LOOPBACK,
IP_PROTO
} transport_proto;

/*
* some transports like SCTP can filter incoming
* connections before knet has to process
* any packets.
* GENERIC_ACL -> packet has to be read and filterted
* PROTO_ACL -> transport provides filtering at lower levels
* and packet does not need to be processed
*/

typedef enum {
USE_NO_ACL,
USE_GENERIC_ACL,
USE_PROTO_ACL
} transport_acl;

typedef struct knet_transport_ops {
/*
* transport generic information
Expand All @@ -273,6 +301,9 @@ typedef struct knet_transport_ops {
const uint8_t transport_id;
const uint8_t built_in;

transport_proto transport_protocol;
transport_acl transport_acl_type;

uint32_t transport_mtu_overhead;
/*
* transport init must allocate the new transport
Expand Down
18 changes: 14 additions & 4 deletions libknet/transports.c
Expand Up @@ -27,14 +27,14 @@
#include "transport_sctp.h"
#include "threads_common.h"

#define empty_module 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL },
#define empty_module -1, -1, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL },

static knet_transport_ops_t transport_modules_cmd[KNET_MAX_TRANSPORTS] = {
{ "LOOPBACK", KNET_TRANSPORT_LOOPBACK, 1, KNET_PMTUD_LOOPBACK_OVERHEAD, loopback_transport_init, loopback_transport_free, loopback_transport_link_set_config, loopback_transport_link_clear_config, loopback_transport_link_dyn_connect, loopback_transport_rx_sock_error, loopback_transport_tx_sock_error, loopback_transport_rx_is_data },
{ "UDP", KNET_TRANSPORT_UDP, 1, KNET_PMTUD_UDP_OVERHEAD, udp_transport_init, udp_transport_free, udp_transport_link_set_config, udp_transport_link_clear_config, udp_transport_link_dyn_connect, udp_transport_rx_sock_error, udp_transport_tx_sock_error, udp_transport_rx_is_data },
{ "LOOPBACK", KNET_TRANSPORT_LOOPBACK, 1, LOOPBACK, USE_NO_ACL, KNET_PMTUD_LOOPBACK_OVERHEAD, loopback_transport_init, loopback_transport_free, loopback_transport_link_set_config, loopback_transport_link_clear_config, loopback_transport_link_dyn_connect, loopback_transport_rx_sock_error, loopback_transport_tx_sock_error, loopback_transport_rx_is_data },
{ "UDP", KNET_TRANSPORT_UDP, 1, IP_PROTO, USE_GENERIC_ACL, KNET_PMTUD_UDP_OVERHEAD, udp_transport_init, udp_transport_free, udp_transport_link_set_config, udp_transport_link_clear_config, udp_transport_link_dyn_connect, udp_transport_rx_sock_error, udp_transport_tx_sock_error, udp_transport_rx_is_data },
{ "SCTP", KNET_TRANSPORT_SCTP,
#ifdef HAVE_NETINET_SCTP_H
1, KNET_PMTUD_SCTP_OVERHEAD, sctp_transport_init, sctp_transport_free, sctp_transport_link_set_config, sctp_transport_link_clear_config, sctp_transport_link_dyn_connect, sctp_transport_rx_sock_error, sctp_transport_tx_sock_error, sctp_transport_rx_is_data },
1, IP_PROTO, USE_PROTO_ACL, KNET_PMTUD_SCTP_OVERHEAD, sctp_transport_init, sctp_transport_free, sctp_transport_link_set_config, sctp_transport_link_clear_config, sctp_transport_link_dyn_connect, sctp_transport_rx_sock_error, sctp_transport_tx_sock_error, sctp_transport_rx_is_data },
#else
empty_module
#endif
Expand Down Expand Up @@ -118,6 +118,16 @@ int transport_rx_is_data(knet_handle_t knet_h, uint8_t transport, int sockfd, st
return transport_modules_cmd[transport].transport_rx_is_data(knet_h, sockfd, msg);
}

int transport_get_proto(knet_handle_t knet_h, uint8_t transport)
{
return transport_modules_cmd[transport].transport_protocol;
}

int transport_get_acl_type(knet_handle_t knet_h, uint8_t transport)
{
return transport_modules_cmd[transport].transport_acl_type;
}

/*
* public api
*/
Expand Down
2 changes: 2 additions & 0 deletions libknet/transports.h
Expand Up @@ -18,5 +18,7 @@ int transport_link_dyn_connect(knet_handle_t knet_h, int sockfd, struct knet_lin
int transport_rx_sock_error(knet_handle_t knet_h, uint8_t transport, int sockfd, int recv_err, int recv_errno);
int transport_tx_sock_error(knet_handle_t knet_h, uint8_t transport, int sockfd, int recv_err, int recv_errno);
int transport_rx_is_data(knet_handle_t knet_h, uint8_t transport, int sockfd, struct knet_mmsghdr *msg);
int transport_get_proto(knet_handle_t knet_h, uint8_t transport);
int transport_get_acl_type(knet_handle_t knet_h, uint8_t transport);

#endif

0 comments on commit 0d9bcc6

Please sign in to comment.