blob: b680a9adb5a798587c2ae5ef0d23c632a6532b6f [file] [log] [blame]
James Kuszmaul82f6c042021-01-17 11:30:16 -08001/**
2 * @file close.c SIP Session Close
3 *
4 * Copyright (C) 2010 Creytiv.com
5 */
6#include <re_types.h>
7#include <re_mem.h>
8#include <re_mbuf.h>
9#include <re_sa.h>
10#include <re_list.h>
11#include <re_hash.h>
12#include <re_fmt.h>
13#include <re_uri.h>
14#include <re_tmr.h>
15#include <re_msg.h>
16#include <re_sip.h>
17#include <re_sipsess.h>
18#include "sipsess.h"
19
20
21static void bye_resp_handler(int err, const struct sip_msg *msg, void *arg)
22{
23 struct sipsess *sess = arg;
24
25 if (err || sip_request_loops(&sess->ls, msg->scode))
26 goto out;
27
28 if (msg->scode < 200) {
29 return;
30 }
31 else if (msg->scode < 300) {
32 ;
33 }
34 else {
35 if (sess->peerterm)
36 goto out;
37
38 switch (msg->scode) {
39
40 case 401:
41 case 407:
42 err = sip_auth_authenticate(sess->auth, msg);
43 if (err)
44 break;
45
46 err = sipsess_bye(sess, false);
47 if (err)
48 break;
49
50 return;
51 }
52 }
53
54 out:
55 mem_deref(sess);
56}
57
58
59int sipsess_bye(struct sipsess *sess, bool reset_ls)
60{
61 if (sess->req)
62 return EPROTO;
63
64 if (reset_ls)
65 sip_loopstate_reset(&sess->ls);
66
67 return sip_drequestf(&sess->req, sess->sip, true, "BYE",
68 sess->dlg, 0, sess->auth,
69 NULL, bye_resp_handler, sess,
70 "%s"
71 "Content-Length: 0\r\n"
72 "\r\n",
73 sess->close_hdrs);
74}