mirror of
https://github.com/rtbrick/bngblaster.git
synced 2024-05-06 15:54:57 +00:00
210 lines
5.5 KiB
C
210 lines
5.5 KiB
C
/*
|
|
* BNG Blaster (BBL) - Interfaces
|
|
*
|
|
* Christian Giese, October 2020
|
|
*
|
|
* Copyright (C) 2020-2021, RtBrick, Inc.
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*/
|
|
|
|
#ifndef __BBL_INTERFACE_H__
|
|
#define __BBL_INTERFACE_H__
|
|
|
|
typedef struct bbl_interface_
|
|
{
|
|
CIRCLEQ_ENTRY(bbl_interface_) interface_qnode;
|
|
struct bbl_ctx_ *ctx; /* parent */
|
|
char *name; /* interface name */
|
|
|
|
bbl_interface_type_t type;
|
|
|
|
struct timer_ *timer_arp;
|
|
struct timer_ *timer_nd;
|
|
|
|
struct {
|
|
bbl_io_mode_t mode;
|
|
|
|
int fd_tx;
|
|
int fd_rx;
|
|
|
|
struct tpacket_req req_tx;
|
|
struct tpacket_req req_rx;
|
|
struct sockaddr_ll addr;
|
|
|
|
uint8_t *rx_buf; /* RX buffer */
|
|
uint16_t rx_len;
|
|
uint8_t *tx_buf; /* TX buffer */
|
|
uint16_t tx_len;
|
|
|
|
uint8_t *ring_tx; /* TX ring buffer */
|
|
uint8_t *ring_rx; /* RX ring buffer */
|
|
uint16_t cursor_tx; /* slot # inside the ring buffer */
|
|
uint16_t cursor_rx; /* slot # inside the ring buffer */
|
|
|
|
bool pollout;
|
|
|
|
#ifdef BNGBLASTER_NETMAP
|
|
struct nm_desc *port;
|
|
#endif
|
|
} io;
|
|
|
|
struct {
|
|
bbl_send_slot_t *ring;
|
|
uint16_t size; /* number of send slots */
|
|
uint16_t read; /* current read slot */
|
|
uint16_t write; /* current write slot */
|
|
uint16_t next; /* next write slot */
|
|
} send;
|
|
|
|
uint32_t ifindex; /* interface index */
|
|
uint32_t pcap_index; /* interface index for packet captures */
|
|
|
|
uint32_t send_requests;
|
|
bool arp_resolved;
|
|
uint32_t ip;
|
|
uint32_t gateway;
|
|
uint16_t vlan;
|
|
bool qinq; /* use ethertype 0x8818 */
|
|
uint8_t mac[ETH_ADDR_LEN];
|
|
uint8_t gateway_mac[ETH_ADDR_LEN];
|
|
|
|
ipv6_prefix ip6;
|
|
ipv6_prefix gateway6;
|
|
bool icmpv6_nd_resolved;
|
|
|
|
bool gateway_resolve_wait;
|
|
|
|
uint8_t *mc_packets;
|
|
uint16_t mc_packet_len;
|
|
uint64_t mc_packet_seq;
|
|
uint16_t mc_packet_cursor;
|
|
|
|
struct {
|
|
uint64_t packets_tx;
|
|
uint64_t packets_rx;
|
|
bbl_rate_s rate_packets_tx;
|
|
bbl_rate_s rate_packets_rx;
|
|
uint64_t bytes_tx;
|
|
uint64_t bytes_rx;
|
|
bbl_rate_s rate_bytes_tx;
|
|
bbl_rate_s rate_bytes_rx;
|
|
uint64_t packets_rx_drop_unknown;
|
|
uint64_t packets_rx_drop_decode_error;
|
|
uint64_t sendto_failed;
|
|
uint64_t no_tx_buffer;
|
|
uint64_t poll_tx;
|
|
uint64_t poll_rx;
|
|
uint64_t encode_errors;
|
|
|
|
uint64_t mc_tx;
|
|
bbl_rate_s rate_mc_tx;
|
|
uint64_t mc_rx;
|
|
bbl_rate_s rate_mc_rx;
|
|
uint64_t mc_loss;
|
|
|
|
/* Packet Stats */
|
|
uint32_t arp_tx;
|
|
uint32_t arp_rx;
|
|
uint32_t cfm_cc_tx;
|
|
uint32_t cfm_cc_rx;
|
|
uint32_t padi_tx;
|
|
uint32_t pado_rx;
|
|
uint32_t padr_tx;
|
|
uint32_t pads_rx;
|
|
uint32_t padt_tx;
|
|
uint32_t padt_rx;
|
|
uint32_t lcp_tx;
|
|
uint32_t lcp_rx;
|
|
uint32_t lcp_timeout;
|
|
uint32_t lcp_echo_timeout;
|
|
uint32_t pap_tx;
|
|
uint32_t pap_rx;
|
|
uint32_t pap_timeout;
|
|
uint32_t chap_tx;
|
|
uint32_t chap_rx;
|
|
uint32_t chap_timeout;
|
|
uint32_t ipcp_tx;
|
|
uint32_t ipcp_rx;
|
|
uint32_t ipcp_timeout;
|
|
uint32_t ip6cp_tx;
|
|
uint32_t ip6cp_rx;
|
|
uint32_t ip6cp_timeout;
|
|
uint32_t igmp_rx;
|
|
uint32_t igmp_tx;
|
|
uint32_t icmp_tx;
|
|
uint32_t icmp_rx;
|
|
uint32_t icmpv6_tx;
|
|
uint32_t icmpv6_rx;
|
|
uint32_t icmpv6_rs_timeout;
|
|
|
|
uint32_t dhcp_tx;
|
|
uint32_t dhcp_rx;
|
|
uint32_t dhcp_timeout;
|
|
|
|
uint32_t dhcpv6_tx;
|
|
uint32_t dhcpv6_rx;
|
|
uint32_t dhcpv6_timeout;
|
|
|
|
uint32_t ipv4_fragmented_rx;
|
|
|
|
uint64_t session_ipv4_tx;
|
|
bbl_rate_s rate_session_ipv4_tx;
|
|
uint64_t session_ipv4_rx;
|
|
bbl_rate_s rate_session_ipv4_rx;
|
|
uint64_t session_ipv4_loss;
|
|
|
|
uint64_t session_ipv6_tx;
|
|
bbl_rate_s rate_session_ipv6_tx;
|
|
uint64_t session_ipv6_rx;
|
|
bbl_rate_s rate_session_ipv6_rx;
|
|
uint64_t session_ipv6_loss;
|
|
|
|
uint64_t session_ipv6pd_tx;
|
|
bbl_rate_s rate_session_ipv6pd_tx;
|
|
uint64_t session_ipv6pd_rx;
|
|
bbl_rate_s rate_session_ipv6pd_rx;
|
|
uint64_t session_ipv6pd_loss;
|
|
|
|
uint64_t session_ipv4_wrong_session;
|
|
uint64_t session_ipv6_wrong_session;
|
|
uint64_t session_ipv6pd_wrong_session;
|
|
|
|
uint32_t l2tp_control_rx;
|
|
uint32_t l2tp_control_rx_dup; /* duplicate */
|
|
uint32_t l2tp_control_rx_ooo; /* out of order */
|
|
uint32_t l2tp_control_rx_nf; /* session not found */
|
|
uint32_t l2tp_control_tx;
|
|
uint32_t l2tp_control_retry;
|
|
uint64_t l2tp_data_rx;
|
|
uint64_t l2tp_data_tx;
|
|
bbl_rate_s rate_l2tp_data_rx;
|
|
bbl_rate_s rate_l2tp_data_tx;
|
|
|
|
uint64_t li_rx;
|
|
bbl_rate_s rate_li_rx;
|
|
} stats;
|
|
|
|
struct timer_ *tx_job;
|
|
struct timer_ *rx_job;
|
|
struct timer_ *rate_job;
|
|
|
|
struct timespec tx_timestamp; /* user space timestamps */
|
|
struct timespec rx_timestamp; /* user space timestamps */
|
|
|
|
CIRCLEQ_HEAD(session_tx_, bbl_session_ ) session_tx_qhead; /* list of sessions that want to transmit */
|
|
CIRCLEQ_HEAD(l2tp_tx_, bbl_l2tp_queue_ ) l2tp_tx_qhead; /* list of messages that want to transmit */
|
|
} bbl_interface_s;
|
|
|
|
void
|
|
bbl_interface_unlock_all(bbl_ctx_s *ctx);
|
|
|
|
bool
|
|
bbl_add_interfaces(bbl_ctx_s *ctx);
|
|
|
|
bbl_interface_s *
|
|
bbl_get_network_interface(bbl_ctx_s *ctx, char *interface_name);
|
|
|
|
bbl_interface_s *
|
|
bbl_get_a10nsp_interface(bbl_ctx_s *ctx, char *interface_name);
|
|
|
|
#endif |