osmo-e1d/include/osmocom/octoi/octoi.h

88 lines
2.4 KiB
C

#pragma once
#include <osmocom/core/linuxlist.h>
#include <osmocom/core/utils.h>
#include <osmocom/core/sockaddr_str.h>
#include <osmocom/vty/vty.h>
struct octoi_peer;
enum octoi_account_mode {
ACCOUNT_MODE_NONE,
ACCOUNT_MODE_ICE1USB,
ACCOUNT_MODE_REDIRECT,
ACCOUNT_MODE_DAHDI,
};
extern const struct value_string octoi_account_mode_name[];
/* a single user account connecting via OCTOI protocol */
struct octoi_account {
struct llist_head list; /* member in octoi_server.cfg.accounts */
char *user_id; /* user ID (IMSI) */
enum octoi_account_mode mode;
union {
struct {
char *usb_serial; /* USB serial string (ASCII) of icE1usb */
uint8_t line_nr; /* line nubmer inside icE1usb */
} ice1usb;
struct {
struct osmo_sockaddr_str to; /* remote IP/port to which to redirect */
} redirect;
struct {
/* TBD */
} dahdi;
} u;
};
struct octoi_sock;
struct octoi_server {
struct octoi_sock *sock; /* OCTOI UDP server sock representation */
struct {
struct llist_head accounts; /* list of octoi_account */
struct osmo_sockaddr_str local; /* local socket bind address/port */
} cfg;
};
struct octoi_client {
struct llist_head list; /* member in e1_daemon.octoi.clients */
struct octoi_sock *sock; /* OCTOI UDP server sock representation */
struct {
struct osmo_sockaddr_str remote; /* remote socket address/port */
struct osmo_sockaddr_str local; /* local socket bind address/port */
struct octoi_account *account;
} cfg;
};
/* call-backs from OCTOI library to application */
struct octoi_ops {
/* server notifies the application that a new client connection has just been accepted */
void * (*client_connected)(struct octoi_server *srv, struct octoi_peer *peer,
struct octoi_account *acc);
/* OCTOI library notifies the application that a given peer has disconnected */
void (*peer_disconnected)(struct octoi_peer *peer);
};
struct octoi_daemon {
void *priv;
const struct octoi_ops *ops;
struct octoi_server *server;
struct llist_head clients;
};
extern struct octoi_daemon *g_octoi;
void octoi_init(void *ctx, void *priv, const struct octoi_ops *ops);
int octoi_vty_go_parent(struct vty *vty);
struct octoi_peer *octoi_client_get_peer(struct octoi_client *client);
void octoi_clnt_start_for_peer(struct octoi_peer *peer, struct octoi_account *acc);
void octoi_peer_e1o_in(struct octoi_peer *peer, const uint8_t *buf, int ftr);
void octoi_peer_e1t_out(struct octoi_peer *peer, uint8_t *buf, int fts);