summaryrefslogtreecommitdiffstats
path: root/src/sip/sip.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/sip/sip.h')
-rw-r--r--src/sip/sip.h115
1 files changed, 115 insertions, 0 deletions
diff --git a/src/sip/sip.h b/src/sip/sip.h
new file mode 100644
index 0000000..37b8b8f
--- /dev/null
+++ b/src/sip/sip.h
@@ -0,0 +1,115 @@
+
+#include "../libtimer/timer.h"
+#include "../libosmocc/endpoint.h"
+#include <sofia-sip/nua.h>
+#include <sofia-sip/stun.h>
+
+#define STUN_RETRY_TIMER 10
+#define REGISTER_RETRY_TIMER 10
+
+enum reg_state {
+ REGISTER_STATE_NULL = 0,
+ REGISTER_STATE_UNREGISTERED,
+ REGISTER_STATE_REGISTERING,
+ REGISTER_STATE_REGISTERED,
+ REGISTER_STATE_FAILED,
+};
+
+enum stun_state {
+ STUN_STATE_NULL = 0,
+ STUN_STATE_UNRESOLVED,
+ STUN_STATE_RESOLVING,
+ STUN_STATE_RESOLVED,
+ STUN_STATE_FAILED,
+};
+
+enum sip_state {
+ SIP_STATE_IDLE = 0,
+ SIP_STATE_OUT_INVITE, /* invite sent, waiting for replies */
+ SIP_STATE_IN_INVITE, /* invite received, sending replies */
+ SIP_STATE_CONNECT, /* active call */
+ SIP_STATE_OUT_RELEASE, /* outgoing release, sending REL_CNF */
+};
+
+struct sip_call;
+
+typedef struct sip_endpoint {
+ /* setting flags */
+ int send_no_ringing_after_progress;
+ int receive_no_ringing_after_progress;
+
+ /* endpoint */
+ osmo_cc_endpoint_t cc_ep;
+ const char *name;
+ struct sip_call *call_list;
+
+ /* SIP settings */
+ const char *local_user;
+ const char *local_peer;
+ const char *remote_user;
+ const char *remote_peer;
+ const char *asserted_id;
+ int local_register;
+ int remote_register;
+ const char *register_user;
+ const char *register_peer;
+ int authenticate_local;
+ int authenticate_remote;
+ const char *auth_user;
+ const char *auth_password;
+ const char *auth_realm;
+
+ /* NAT help */
+ char public_ip[256];
+ const char *stun_server;
+
+ /* timers */
+ int register_interval;
+ int options_interval;
+ int stun_interval;
+ struct timer stun_retry_timer;
+ struct timer register_retry_timer;
+ struct timer register_option_timer;
+
+ /* SIP stack */
+ su_root_t *su_root;
+ nua_t *nua;
+ nua_handle_t *register_handle;
+
+ /* register process */
+ char remote_contact[256];
+ char register_nonce[64];
+ char invite_nonce[64];
+ enum reg_state register_state;
+ enum stun_state stun_state;
+
+ /* stun process */
+ stun_handle_t *stun_handle;
+ su_socket_t stun_socket;
+} sip_endpoint_t;
+
+typedef struct sip_call {
+ struct sip_call *next;
+
+ osmo_cc_call_t *cc_call;
+ uint32_t cc_callref;
+ sip_endpoint_t *sip_ep;
+ enum sip_state state;
+
+ nua_handle_t *nua_handle;
+
+ struct timer invite_option_timer;
+
+ char *sdp_request, *sdp_response;
+ int sdp_sent;
+ int alerting_sent;
+
+} call_t;
+
+void cc_message(osmo_cc_endpoint_t *ep, uint32_t callref, osmo_cc_msg_t *msg);
+sip_endpoint_t *sip_endpoint_create(int send_no_ringing_after_progress, int receive_no_ringing_after_progress, const char *name, const char *local_user, const char *local_peer, const char *remote_user, const char *remote_peer, const char *asserted_id, int local_register, int remote_register, const char *register_user, const char *register_peer, int authenticate_local, int authenticate_remote, const char *auth_user, const char *auth_password, const char *auth_realm, const char *public_ip, const char *stun_server, int register_interval, int options_interval, int stun_interval, int expires);
+void sip_endpoint_destroy(sip_endpoint_t *sip_ep);
+int sip_init(int debug_level);
+void sip_exit(void);
+void sip_handle(sip_endpoint_t *sip_ep);
+