summaryrefslogtreecommitdiffstats
path: root/src/sip/sip.h
blob: a1ca7bb70b4cc489071e7623ec0e3d9df3de76c6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#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;
	int		shutdown_complete;

	/* 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);