Add restart IE helper

Signed-off-by: Karsten Keil <kkeil@linux-pingi.de>
This commit is contained in:
Karsten Keil 2011-06-15 13:59:25 +02:00
parent 28a849fabc
commit 29b5b2d8d0
2 changed files with 42 additions and 1 deletions

View File

@ -144,11 +144,14 @@
#define CAUSE_NOUSER_RESPONDING 18
#define CAUSE_CALL_REJECTED 21
#define CAUSE_NONSELECTED_USER 26
#define CAUSE_DEST_OUT_OF_ORDER 27
#define CAUSE_INVALID_NUMBER 28
#define CAUSE_STATUS_RESPONSE 30
#define CAUSE_NORMALUNSPECIFIED 31
#define CAUSE_NO_CHANNEL 34
#define CAUSE_NET_OUT_OF_ORDER 28
#define CAUSE_TEMPORARY_FAILURE 41
#define CAUSE_SEQ_CONGESTION 42
#define CAUSE_REQUESTED_CHANNEL 44
#define CAUSE_RESOURCES_UNAVAIL 47
#define CAUSE_INVALID_CALLREF 81
@ -163,6 +166,13 @@
#define NO_CAUSE 254
/*
* Restart indication class values
*/
#define RESTART_CLASS_CHANNEL 0
#define RESTART_CLASS_SINGLE 6
#define RESTART_CLASS_ALL 7
/*
* Parser error codes
*/
@ -273,6 +283,7 @@ extern int mi_encode_useruser(struct l3_msg *, int, int, char *);
extern int mi_encode_cause(struct l3_msg *l, int cause, int, int, unsigned char *);
extern int mi_encode_progress(struct l3_msg *, struct misdn_progress_info *);
extern int mi_encode_date(struct l3_msg *, time_t);
extern int mi_encode_restart_ind(struct l3_msg *, unsigned char);
/* Common IE decode helpers */
extern int mi_decode_progress(struct l3_msg *, struct misdn_progress_info *);
@ -286,6 +297,7 @@ extern int mi_decode_called_nr(struct l3_msg *, int *, int *, char *);
extern int mi_decode_redir_nr(struct l3_msg *, int *, int *, int *, int *, int *, char *);
extern int mi_decode_display(struct l3_msg *, char *, int);
extern int mi_decode_useruser(struct l3_msg *, int *, int *, char *, int);
extern int mi_decode_restart_ind(struct l3_msg *, unsigned char *);
/* some print helpers */
extern const char *mi_bearer2str(int);

View File

@ -355,7 +355,8 @@ mi_encode_channel_id(struct l3_msg *l3m, struct misdn_channel_info *ci)
return 0;
if (ci->nr == MI_CHAN_ANY || ci->nr == MI_CHAN_NONE ||
(ci->flags & MI_CHAN_FLG_NONE) || (ci->flags & MI_CHAN_FLG_ANY))
(ci->flags & MI_CHAN_FLG_NONE) || (ci->flags & MI_CHAN_FLG_ANY) ||
(!(ci->flags & MI_CHAN_FLG_EXCLUSIVE)))
excl = 0;
if (ci->flags & MI_CHAN_FLG_OTHER_IF) { /* PRI */
@ -581,6 +582,21 @@ mi_encode_date(struct l3_msg *l3m, time_t ti)
return add_layer3_ie(l3m, IE_DATE, 5, ie);
}
int
mi_encode_restart_ind(struct l3_msg *l3m, unsigned char _class)
{
switch(_class) {
case RESTART_CLASS_CHANNEL:
case RESTART_CLASS_SINGLE:
case RESTART_CLASS_ALL:
break;
default:
return -EINVAL;
}
_class |= 0x80;
return add_layer3_ie(l3m, IE_RESTART_IND, 1, &_class);
}
/* helper functions to decode common IE */
#define _ASSIGN_PVAL(p, v) if (p) *p = (v)
@ -917,6 +933,19 @@ mi_decode_useruser(struct l3_msg *l3m, int *pd, int *uulen, char *uu, int maxlen
return 0;
}
int
mi_decode_restart_ind(struct l3_msg *l3m, unsigned char *_class)
{
if (l3m == NULL || !l3m->restart_ind)
return 0;
if (!_class)
return 0;
if (*l3m->restart_ind < 1)
return 0;
_ASSIGN_PVAL(_class, 0x7f & l3m->restart_ind[1]);
return 0;
}
const char *
mi_bearer2str(int cap)
{