132 lines
5.2 KiB
C
132 lines
5.2 KiB
C
#ifndef OSMO_CC_ENDPOINT_H
|
|
#define OSMO_CC_ENDPOINT_H
|
|
|
|
#include "message.h"
|
|
#include "socket.h"
|
|
#include "cause.h"
|
|
|
|
/* special osmo-cc error codes */
|
|
#define OSMO_CC_RC_SEE_ERRNO -1
|
|
#define OSMO_CC_RC_VERSION_MISMATCH 1
|
|
|
|
#define OSMO_CC_ATTACH_TIMER 2
|
|
|
|
/* call control state */
|
|
enum osmo_cc_state {
|
|
OSMO_CC_STATE_IDLE = 0,
|
|
/* call states */
|
|
OSMO_CC_STATE_INIT_OUT, /* outgoing CC-SETUP-REQ sent */
|
|
OSMO_CC_STATE_INIT_IN, /* incoming CC-SETUP-IND received */
|
|
OSMO_CC_STATE_OVERLAP_OUT, /* received CC-SETUP-ACK-IND on outgoing call */
|
|
OSMO_CC_STATE_OVERLAP_IN, /* sent CC-SETUP-ACK-REQ on incoming call */
|
|
OSMO_CC_STATE_PROCEEDING_OUT, /* received CC-PROC-IND on outgoing call */
|
|
OSMO_CC_STATE_PROCEEDING_IN, /* sent CC-PROC-REQ on incoming call */
|
|
OSMO_CC_STATE_ALERTING_OUT, /* received CC-ALERT-IND on outgoing call */
|
|
OSMO_CC_STATE_ALERTING_IN, /* sent CC-ALERT-REQ on incoming call */
|
|
OSMO_CC_STATE_CONNECTING_OUT, /* received CC-SETUP-CNF on outgoing call */
|
|
OSMO_CC_STATE_CONNECTING_IN, /* sent CC-SETUP-RSP on incoming call */
|
|
OSMO_CC_STATE_ACTIVE, /* received or sent CC-SETUP-COMPL-* */
|
|
OSMO_CC_STATE_DISCONNECTING_OUT, /* sent CC-DISC-REQ */
|
|
OSMO_CC_STATE_DISCONNECTING_IN, /* received CC-DISC-IND */
|
|
OSMO_CC_STATE_DISC_COLLISION, /* received CC-DISC-IND after sending CC-DISC_REQ */
|
|
OSMO_CC_STATE_RELEASING_OUT, /* sent CC-REL-REQ */
|
|
/* attachment states */
|
|
OSMO_CC_STATE_ATTACH_SENT, /* outgoing CC-ATT-REQ sent to socket */
|
|
OSMO_CC_STATE_ATTACH_OUT, /* received CC-ATT-RSP on outgoing socket */
|
|
OSMO_CC_STATE_ATTACH_WAIT, /* wait for outgoing attachment after failure */
|
|
OSMO_CC_STATE_ATTACH_IN, /* incoming CC-ATT-REQ received from socket*/
|
|
};
|
|
|
|
/* sample type */
|
|
typedef int16_t osmo_cc_sample_t;
|
|
|
|
#define OSMO_CC_SAMPLE_MILLIWATT 23170 /* peak sine at -3 dB of full sample range */
|
|
#define OSMO_CC_SAMPLE_SPEECH 3672 /* peak speech at -16 dB of milliwatt */
|
|
#define OSMO_CC_SAMPLE_MIN -32768 /* lowest level */
|
|
#define OSMO_CC_SAMPLE_MAX 32767 /* highest level */
|
|
|
|
#include "session.h"
|
|
|
|
struct osmo_cc_call;
|
|
|
|
typedef struct osmo_cc_screen_list {
|
|
struct osmo_cc_screen_list *next;
|
|
int has_from_type;
|
|
uint8_t from_type;
|
|
int has_from_present;
|
|
uint8_t from_present;
|
|
char from[128];
|
|
int has_to_type;
|
|
uint8_t to_type;
|
|
int has_to_present;
|
|
uint8_t to_present;
|
|
char to[128];
|
|
} osmo_cc_screen_list_t;
|
|
|
|
/* endpoint instance */
|
|
typedef struct osmo_cc_endpoint {
|
|
struct osmo_cc_endpoint *next;
|
|
void *priv;
|
|
void (*ll_msg_cb)(struct osmo_cc_endpoint *ep, uint32_t callref, osmo_cc_msg_t *msg);
|
|
void (*ul_msg_cb)(struct osmo_cc_call *call, osmo_cc_msg_t *msg);
|
|
osmo_cc_msg_list_t *ll_queue; /* messages towards lower layer */
|
|
struct osmo_cc_call *call_list;
|
|
const char *local_name; /* name of interface */
|
|
const char *local_address; /* host+port */
|
|
const char *local_host;
|
|
uint16_t local_port;
|
|
const char *remote_address; /* host+port */
|
|
const char *remote_host;
|
|
uint16_t remote_port;
|
|
uint8_t serving_location;
|
|
osmo_cc_socket_t os;
|
|
osmo_cc_screen_list_t *screen_calling_in;
|
|
osmo_cc_screen_list_t *screen_called_in;
|
|
osmo_cc_screen_list_t *screen_calling_out;
|
|
osmo_cc_screen_list_t *screen_called_out;
|
|
int remote_auto; /* automatic remote address */
|
|
struct timer attach_timer; /* timer to retry attachment */
|
|
osmo_cc_session_config_t session_config; /* SDP/RTP default configuration */
|
|
} osmo_cc_endpoint_t;
|
|
|
|
extern osmo_cc_endpoint_t *osmo_cc_endpoint_list;
|
|
|
|
/* call process */
|
|
typedef struct osmo_cc_call {
|
|
struct osmo_cc_call *next;
|
|
osmo_cc_endpoint_t *ep;
|
|
enum osmo_cc_state state;
|
|
int lower_layer_released; /* when lower layer sent release, while upper layer gets a disconnect */
|
|
int upper_layer_released; /* when upper layer sent release, while lower layer gets a disconnect */
|
|
uint32_t callref;
|
|
osmo_cc_msg_list_t *sock_queue; /* messages from socket */
|
|
const char *attached_host; /* host and port from remote peer that attached to us */
|
|
uint16_t attached_port;
|
|
const char *attached_name; /* interface name from remote peer that attached to us */
|
|
} osmo_cc_call_t;
|
|
|
|
/* returns 0 if ok
|
|
* returns <0 for error as indicated
|
|
* returns >=1 to indicate osmo-cc error code
|
|
*/
|
|
|
|
void osmo_cc_help(void);
|
|
int osmo_cc_new(osmo_cc_endpoint_t *ep, const char *version, const char *name, uint8_t serving_location, void (*ll_msg_cb)(osmo_cc_endpoint_t *ep, uint32_t callref, osmo_cc_msg_t *msg), void (*ul_msg_cb)(osmo_cc_call_t *call, osmo_cc_msg_t *msg), void *priv, int argc, const char *argv[]);
|
|
void osmo_cc_delete(struct osmo_cc_endpoint *ep);
|
|
int osmo_cc_handle(void);
|
|
osmo_cc_call_t *osmo_cc_call_by_callref(osmo_cc_endpoint_t *ep, uint32_t callref);
|
|
osmo_cc_call_t *osmo_cc_get_attached_interface(osmo_cc_endpoint_t *ep, const char *interface);
|
|
void osmo_cc_ll_msg(osmo_cc_endpoint_t *ep, uint32_t callref, osmo_cc_msg_t *msg);
|
|
void osmo_cc_ul_msg(void *priv, uint32_t callref, osmo_cc_msg_t *msg);
|
|
osmo_cc_call_t *osmo_cc_call_new(osmo_cc_endpoint_t *ep);
|
|
void osmo_cc_call_delete(struct osmo_cc_call *call);
|
|
enum osmo_cc_session_addrtype osmo_cc_address_type(const char *address);
|
|
const char *osmo_cc_host_of_address(const char *address);
|
|
const char *osmo_cc_port_of_address(const char *address);
|
|
|
|
#include "rtp.h"
|
|
#include "sdp.h"
|
|
#include "screen.h"
|
|
|
|
#endif /* OSMO_CC_ENDPOINT_H */
|