summaryrefslogtreecommitdiff
path: root/channels
diff options
context:
space:
mode:
authorMatthew Jordan <mjordan@digium.com>2012-08-07 12:46:36 +0000
committerMatthew Jordan <mjordan@digium.com>2012-08-07 12:46:36 +0000
commit5c4578f4ad9af0d13638ec72a2bc141227ec8b3c (patch)
tree77427fe11562062a59774f755a23ffc82c5cbff5 /channels
parent096baa0897f556b2de6bfb8fa0acc09a504e39a4 (diff)
Add named callgroups/pickupgroups
This patch adds named calledgroups/pickupgroups to Asterisk. Named groups are implemented in parallel to the existing numbered callgroup/pickupgroup implementation. However, unlike the existing implementation, which is limited to a maximum of 64 defined groups, the number of defined groups allowed for named callgroups/pickupgroups is effectively unlimited. Named groups are configured with the keywords "namedcallgroup" and "namedpickupgroup". This corresponds to the numbered group definitions of "callgroup" and "pickupgroup". Note that as the implementation of named groups coexists with the existing numbered implementation, a defined named group of "4" does not equate to numbered group 4. Support for the named groups has been added to the SIP, DAHDI, and mISDN channel drivers. Review: https://reviewboard.asterisk.org/r/2043 Uploaded by: Guenther Kelleter(license #6372) git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@370831 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'channels')
-rw-r--r--channels/chan_dahdi.c29
-rw-r--r--channels/chan_misdn.c17
-rw-r--r--channels/chan_sip.c75
-rw-r--r--channels/misdn/chan_misdn_config.h2
-rw-r--r--channels/misdn_config.c48
-rw-r--r--channels/sip/include/sip.h4
6 files changed, 169 insertions, 6 deletions
diff --git a/channels/chan_dahdi.c b/channels/chan_dahdi.c
index c0afc576a..b60838358 100644
--- a/channels/chan_dahdi.c
+++ b/channels/chan_dahdi.c
@@ -1092,6 +1092,16 @@ struct dahdi_pvt {
*/
ast_group_t pickupgroup;
/*!
+ * \brief Named call groups this belongs to.
+ * \note The "namedcallgroup" string read in from chan_dahdi.conf
+ */
+ struct ast_namedgroups *named_callgroups;
+ /*!
+ * \brief Named pickup groups this belongs to.
+ * \note The "namedpickupgroup" string read in from chan_dahdi.conf
+ */
+ struct ast_namedgroups *named_pickupgroups;
+ /*!
* \brief Channel variable list with associated values to set when a channel is created.
* \note The "setvar" strings read in from chan_dahdi.conf
*/
@@ -5917,6 +5927,10 @@ static void destroy_dahdi_pvt(struct dahdi_pvt *pvt)
if (p->cc_params) {
ast_cc_config_params_destroy(p->cc_params);
}
+
+ p->named_callgroups = ast_unref_namedgroups(p->named_callgroups);
+ p->named_pickupgroups = ast_unref_namedgroups(p->named_pickupgroups);
+
ast_mutex_destroy(&p->lock);
dahdi_close_sub(p, SUB_REAL);
if (p->owner)
@@ -9904,6 +9918,8 @@ static struct ast_channel *dahdi_new(struct dahdi_pvt *i, int state, int startpb
/* Only FXO signalled stuff can be picked up */
ast_channel_callgroup_set(tmp, i->callgroup);
ast_channel_pickupgroup_set(tmp, i->pickupgroup);
+ ast_channel_named_callgroups_set(tmp, i->named_callgroups);
+ ast_channel_named_pickupgroups_set(tmp, i->named_pickupgroups);
}
if (!ast_strlen_zero(i->parkinglot))
ast_channel_parkinglot_set(tmp, i->parkinglot);
@@ -13159,6 +13175,10 @@ static struct dahdi_pvt *mkintf(int channel, const struct dahdi_chan_conf *conf,
tmp->group = conf->chan.group;
tmp->callgroup = conf->chan.callgroup;
tmp->pickupgroup= conf->chan.pickupgroup;
+ ast_unref_namedgroups(tmp->named_callgroups);
+ tmp->named_callgroups = ast_ref_namedgroups(conf->chan.named_callgroups);
+ ast_unref_namedgroups(tmp->named_pickupgroups);
+ tmp->named_pickupgroups = ast_ref_namedgroups(conf->chan.named_pickupgroups);
if (conf->chan.vars) {
struct ast_variable *v, *tmpvar;
for (v = conf->chan.vars ; v ; v = v->next) {
@@ -17557,6 +17577,10 @@ static int process_dahdi(struct dahdi_chan_conf *confp, const char *cat, struct
confp->chan.pickupgroup = 0;
else
confp->chan.pickupgroup = ast_get_group(v->value);
+ } else if (!strcasecmp(v->name, "namedcallgroup")) {
+ confp->chan.named_callgroups = ast_get_namedgroups(v->value);
+ } else if (!strcasecmp(v->name, "namedpickupgroup")) {
+ confp->chan.named_pickupgroups = ast_get_namedgroups(v->value);
} else if (!strcasecmp(v->name, "setvar")) {
char *varname = ast_strdupa(v->value), *varval = NULL;
struct ast_variable *tmpvar;
@@ -18541,6 +18565,11 @@ static int process_dahdi(struct dahdi_chan_conf *confp, const char *cat, struct
}
ast_cc_config_params_destroy(conf.chan.cc_params);
}
+
+ /* Since named callgroup and named pickup group are ref'd to dahdi_pvt at this point, unref container in confp's pvt. */
+ confp->chan.named_callgroups = ast_unref_namedgroups(confp->chan.named_callgroups);
+ confp->chan.named_pickupgroups = ast_unref_namedgroups(confp->chan.named_pickupgroups);
+
return 0;
}
diff --git a/channels/chan_misdn.c b/channels/chan_misdn.c
index 82939614a..ce654ee41 100644
--- a/channels/chan_misdn.c
+++ b/channels/chan_misdn.c
@@ -5904,6 +5904,9 @@ static int read_config(struct chan_list *ch)
char buf2[256];
ast_group_t pg;
ast_group_t cg;
+ struct ast_namedgroups *npg;
+ struct ast_namedgroups *ncg;
+ struct ast_str *tmp_str;
if (!ch) {
ast_log(LOG_WARNING, "Cannot configure without chanlist\n");
@@ -5987,6 +5990,20 @@ static int read_config(struct chan_list *ch)
ast_channel_pickupgroup_set(ast, pg);
ast_channel_callgroup_set(ast, cg);
+ misdn_cfg_get(port, MISDN_CFG_NAMEDPICKUPGROUP, &npg, sizeof(npg));
+ misdn_cfg_get(port, MISDN_CFG_NAMEDCALLGROUP, &ncg, sizeof(ncg));
+
+ tmp_str = ast_str_create(1024);
+ if (tmp_str) {
+ chan_misdn_log(5, port, " --> * NamedCallGrp:%s\n", ast_print_namedgroups(&tmp_str, ncg));
+ ast_str_reset(tmp_str);
+ chan_misdn_log(5, port, " --> * NamedPickupGrp:%s\n", ast_print_namedgroups(&tmp_str, npg));
+ ast_free(tmp_str);
+ }
+
+ ast_channel_named_pickupgroups_set(ast, npg);
+ ast_channel_named_callgroups_set(ast, ncg);
+
if (ch->originator == ORG_AST) {
char callerid[BUFFERSIZE + 1];
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 7afe46f1a..b002254ef 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -410,6 +410,12 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
<enum name="pickupgroup">
<para>The configured Pickupgroup.</para>
</enum>
+ <enum name="namedcallgroup">
+ <para>The configured Named Callgroup.</para>
+ </enum>
+ <enum name="namedpickupgroup">
+ <para>The configured Named Pickupgroup.</para>
+ </enum>
<enum name="codecs">
<para>The configured codecs.</para>
</enum>
@@ -1453,6 +1459,7 @@ static char * _sip_show_peers(int fd, int *total, struct mansession *s, const st
static char *sip_show_peers(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a);
static char *sip_show_objects(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a);
static void print_group(int fd, ast_group_t group, int crlf);
+static void print_named_groups(int fd, struct ast_namedgroups *groups, int crlf);
static const char *dtmfmode2str(int mode) attribute_const;
static int str2dtmfmode(const char *str) attribute_unused;
static const char *insecure2str(int mode) attribute_const;
@@ -4907,6 +4914,9 @@ static void sip_destroy_peer(struct sip_peer *peer)
peer->socket.ws_session = NULL;
}
+ peer->named_callgroups = ast_unref_namedgroups(peer->named_callgroups);
+ peer->named_pickupgroups = ast_unref_namedgroups(peer->named_pickupgroups);
+
ast_cc_config_params_destroy(peer->cc_params);
ast_string_field_free_memory(peer);
@@ -5628,6 +5638,10 @@ static int create_addr_from_peer(struct sip_pvt *dialog, struct sip_peer *peer)
ref_proxy(dialog, obproxy_get(dialog, peer));
dialog->callgroup = peer->callgroup;
dialog->pickupgroup = peer->pickupgroup;
+ ast_unref_namedgroups(dialog->named_callgroups);
+ dialog->named_callgroups = ast_ref_namedgroups(peer->named_callgroups);
+ ast_unref_namedgroups(dialog->named_pickupgroups);
+ dialog->named_pickupgroups = ast_ref_namedgroups(peer->named_pickupgroups);
ast_copy_string(dialog->zone, peer->zone, sizeof(dialog->zone));
dialog->allowtransfer = peer->allowtransfer;
dialog->jointnoncodeccapability = dialog->noncodeccapability;
@@ -6219,6 +6233,9 @@ void __sip_destroy(struct sip_pvt *p, int lockowner, int lockdialoglist)
p->peerauth = NULL;
}
+ p->named_callgroups = ast_unref_namedgroups(p->named_callgroups);
+ p->named_pickupgroups = ast_unref_namedgroups(p->named_pickupgroups);
+
p->caps = ast_format_cap_destroy(p->caps);
p->jointcaps = ast_format_cap_destroy(p->jointcaps);
p->peercaps = ast_format_cap_destroy(p->peercaps);
@@ -7570,6 +7587,10 @@ static struct ast_channel *sip_new(struct sip_pvt *i, int state, const char *tit
ast_channel_callgroup_set(tmp, i->callgroup);
ast_channel_pickupgroup_set(tmp, i->pickupgroup);
+
+ ast_channel_named_callgroups_set(tmp, i->named_callgroups);
+ ast_channel_named_pickupgroups_set(tmp, i->named_pickupgroups);
+
ast_channel_caller(tmp)->id.name.presentation = i->callingpres;
ast_channel_caller(tmp)->id.number.presentation = i->callingpres;
if (!ast_strlen_zero(i->parkinglot)) {
@@ -17344,6 +17365,10 @@ static enum check_auth_result check_peer_ok(struct sip_pvt *p, char *of,
p->amaflags = peer->amaflags;
p->callgroup = peer->callgroup;
p->pickupgroup = peer->pickupgroup;
+ ast_unref_namedgroups(p->named_callgroups);
+ p->named_callgroups = ast_ref_namedgroups(peer->named_callgroups);
+ ast_unref_namedgroups(p->named_pickupgroups);
+ p->named_pickupgroups = ast_ref_namedgroups(peer->named_pickupgroups);
ast_format_cap_copy(p->caps, peer->caps);
ast_format_cap_copy(p->jointcaps, peer->caps);
p->prefs = peer->prefs;
@@ -18347,6 +18372,16 @@ static void print_group(int fd, ast_group_t group, int crlf)
ast_cli(fd, crlf ? "%s\r\n" : "%s\n", ast_print_group(buf, sizeof(buf), group) );
}
+/*! \brief Print named call groups and pickup groups */
+static void print_named_groups(int fd, struct ast_namedgroups *group, int crlf)
+{
+ struct ast_str *buf = ast_str_create(1024);
+ if (buf) {
+ ast_cli(fd, crlf ? "%s\r\n" : "%s\n", ast_print_namedgroups(&buf, group) );
+ ast_free(buf);
+ }
+}
+
/*! \brief mapping between dtmf flags and strings */
static const struct _map_x_s dtmfstr[] = {
{ SIP_DTMF_RFC2833, "rfc2833" },
@@ -19002,6 +19037,10 @@ static char *_sip_show_peer(int type, int fd, struct mansession *s, const struct
print_group(fd, peer->callgroup, 0);
ast_cli(fd, " Pickupgroup : ");
print_group(fd, peer->pickupgroup, 0);
+ ast_cli(fd, " Named Callgr : ");
+ print_named_groups(fd, peer->named_callgroups, 0);
+ ast_cli(fd, " Nam. Pickupgr: ");
+ print_named_groups(fd, peer->named_pickupgroups, 0);
peer_mailboxes_to_str(&mailbox_str, peer);
ast_cli(fd, " MOH Suggest : %s\n", peer->mohsuggest);
ast_cli(fd, " Mailbox : %s\n", mailbox_str->str);
@@ -19096,7 +19135,7 @@ static char *_sip_show_peer(int type, int fd, struct mansession *s, const struct
peer = sip_unref_peer(peer, "sip_show_peer: sip_unref_peer: done with peer ptr");
} else if (peer && type == 1) { /* manager listing */
char buffer[256];
- struct ast_str *mailbox_str = ast_str_alloca(512);
+ struct ast_str *tmp_str = ast_str_alloca(512);
astman_append(s, "Channeltype: SIP\r\n");
astman_append(s, "ObjectName: %s\r\n", peer->name);
astman_append(s, "ChanObjectType: peer\r\n");
@@ -19118,9 +19157,15 @@ static char *_sip_show_peer(int type, int fd, struct mansession *s, const struct
astman_append(s, "%s\r\n", ast_print_group(buffer, sizeof(buffer), peer->callgroup));
astman_append(s, "Pickupgroup: ");
astman_append(s, "%s\r\n", ast_print_group(buffer, sizeof(buffer), peer->pickupgroup));
+ astman_append(s, "Named Callgroup: ");
+ astman_append(s, "%s\r\n", ast_print_namedgroups(&tmp_str, peer->named_callgroups));
+ ast_str_reset(tmp_str);
+ astman_append(s, "Named Pickupgroup: ");
+ astman_append(s, "%s\r\n", ast_print_namedgroups(&tmp_str, peer->named_pickupgroups));
+ ast_str_reset(tmp_str);
astman_append(s, "MOHSuggest: %s\r\n", peer->mohsuggest);
- peer_mailboxes_to_str(&mailbox_str, peer);
- astman_append(s, "VoiceMailbox: %s\r\n", mailbox_str->str);
+ peer_mailboxes_to_str(&tmp_str, peer);
+ astman_append(s, "VoiceMailbox: %s\r\n", tmp_str->str);
astman_append(s, "TransferMode: %s\r\n", transfermode2str(peer->allowtransfer));
astman_append(s, "LastMsgsSent: %d\r\n", peer->lastmsgssent);
astman_append(s, "Maxforwards: %d\r\n", peer->maxforwards);
@@ -19287,6 +19332,10 @@ static char *sip_show_user(struct ast_cli_entry *e, int cmd, struct ast_cli_args
print_group(a->fd, user->callgroup, 0);
ast_cli(a->fd, " Pickupgroup : ");
print_group(a->fd, user->pickupgroup, 0);
+ ast_cli(a->fd, " Named Callgr : ");
+ print_named_groups(a->fd, user->named_callgroups, 0);
+ ast_cli(a->fd, " Nam. Pickupgr: ");
+ print_named_groups(a->fd, user->named_pickupgroups, 0);
ast_cli(a->fd, " Callerid : %s\n", ast_callerid_merge(cbuf, sizeof(cbuf), user->cid_name, user->cid_num, "<unspecified>"));
ast_cli(a->fd, " ACL : %s\n", AST_CLI_YESNO(ast_acl_list_is_empty(user->acl) == 0));
ast_cli(a->fd, " Sess-Timers : %s\n", stmode2str(user->stimer.st_mode_oper));
@@ -21039,6 +21088,18 @@ static int function_sippeer(struct ast_channel *chan, const char *cmd, char *dat
ast_print_group(buf, len, peer->callgroup);
} else if (!strcasecmp(colname, "pickupgroup")) {
ast_print_group(buf, len, peer->pickupgroup);
+ } else if (!strcasecmp(colname, "namedcallgroup")) {
+ struct ast_str *tmp_str = ast_str_create(1024);
+ if (tmp_str) {
+ ast_copy_string(buf, ast_print_namedgroups(&tmp_str, peer->named_callgroups), len);
+ ast_free(tmp_str);
+ }
+ } else if (!strcasecmp(colname, "namedpickupgroup")) {
+ struct ast_str *tmp_str = ast_str_create(1024);
+ if (tmp_str) {
+ ast_copy_string(buf, ast_print_namedgroups(&tmp_str, peer->named_pickupgroups), len);
+ ast_free(tmp_str);
+ }
} else if (!strcasecmp(colname, "useragent")) {
ast_copy_string(buf, peer->useragent, len);
} else if (!strcasecmp(colname, "mailbox")) {
@@ -29431,6 +29492,10 @@ static struct sip_peer *build_peer(const char *name, struct ast_variable *v, str
}
}
+ /* clear named callgroup and named pickup group container */
+ peer->named_callgroups = ast_unref_namedgroups(peer->named_callgroups);
+ peer->named_pickupgroups = ast_unref_namedgroups(peer->named_pickupgroups);
+
for (; v || ((v = alt) && !(alt=NULL)); v = v->next) {
if (!devstate_only) {
if (handle_common_options(&peerflags[0], &mask[0], v)) {
@@ -29668,6 +29733,10 @@ static struct sip_peer *build_peer(const char *name, struct ast_variable *v, str
peer->allowtransfer = ast_true(v->value) ? TRANSFER_OPENFORALL : TRANSFER_CLOSED;
} else if (!strcasecmp(v->name, "pickupgroup")) {
peer->pickupgroup = ast_get_group(v->value);
+ } else if (!strcasecmp(v->name, "namedcallgroup")) {
+ peer->named_callgroups = ast_get_namedgroups(v->value);
+ } else if (!strcasecmp(v->name, "namedpickupgroup")) {
+ peer->named_pickupgroups = ast_get_namedgroups(v->value);
} else if (!strcasecmp(v->name, "allow")) {
int error = ast_parse_allow_disallow(&peer->prefs, peer->caps, v->value, TRUE);
if (error) {
diff --git a/channels/misdn/chan_misdn_config.h b/channels/misdn/chan_misdn_config.h
index 270b505ba..c4054a87b 100644
--- a/channels/misdn/chan_misdn_config.h
+++ b/channels/misdn/chan_misdn_config.h
@@ -89,6 +89,8 @@ enum misdn_cfg_elements {
MISDN_CFG_JITTERBUFFER_UPPER_THRESHOLD, /* int */
MISDN_CFG_CALLGROUP, /* ast_group_t */
MISDN_CFG_PICKUPGROUP, /* ast_group_t */
+ MISDN_CFG_NAMEDCALLGROUP, /* ast_namedgroups * */
+ MISDN_CFG_NAMEDPICKUPGROUP, /* ast_namedgroups * */
MISDN_CFG_MAX_IN, /* int */
MISDN_CFG_MAX_OUT, /* int */
MISDN_CFG_L1_TIMEOUT, /* int */
diff --git a/channels/misdn_config.c b/channels/misdn_config.c
index 30e96eca4..32f92c323 100644
--- a/channels/misdn_config.c
+++ b/channels/misdn_config.c
@@ -70,7 +70,8 @@ enum misdn_cfg_type {
MISDN_CTYPE_BOOL,
MISDN_CTYPE_BOOLINT,
MISDN_CTYPE_MSNLIST,
- MISDN_CTYPE_ASTGROUP
+ MISDN_CTYPE_ASTGROUP,
+ MISDN_CTYPE_ASTNAMEDGROUP
};
struct msn_list {
@@ -83,6 +84,7 @@ union misdn_cfg_pt {
int *num;
struct msn_list *ml;
ast_group_t *grp;
+ struct ast_namedgroups *namgrp;
void *any;
};
@@ -330,6 +332,10 @@ static const struct misdn_cfg_spec port_spec[] = {
"Callgroup." },
{ "pickupgroup", MISDN_CFG_PICKUPGROUP, MISDN_CTYPE_ASTGROUP, NO_DEFAULT, NONE,
"Pickupgroup." },
+ { "namedcallgroup", MISDN_CFG_NAMEDCALLGROUP, MISDN_CTYPE_ASTNAMEDGROUP, NO_DEFAULT, NONE,
+ "Named callgroup." },
+ { "namedpickupgroup", MISDN_CFG_NAMEDPICKUPGROUP, MISDN_CTYPE_ASTNAMEDGROUP, NO_DEFAULT, NONE,
+ "Named pickupgroup." },
{ "max_incoming", MISDN_CFG_MAX_IN, MISDN_CTYPE_INT, "-1", NONE,
"Defines the maximum amount of incoming calls per port for this group.\n"
"\tCalls which exceed the maximum will be marked with the channel variable\n"
@@ -541,10 +547,13 @@ static void _free_port_cfg (void)
for (j = 0; free_list[j]; ++j) {
for (i = 0; i < NUM_PORT_ELEMENTS; ++i) {
if (free_list[j][i].any) {
- if (port_spec[i].type == MISDN_CTYPE_MSNLIST)
+ if (port_spec[i].type == MISDN_CTYPE_MSNLIST) {
_free_msn_list(free_list[j][i].ml);
- else
+ } else if (port_spec[i].type == MISDN_CTYPE_ASTNAMEDGROUP) {
+ ast_unref_namedgroups(free_list[j][i].namgrp);
+ } else {
ast_free(free_list[j][i].any);
+ }
}
}
}
@@ -588,6 +597,17 @@ void misdn_cfg_get(int port, enum misdn_cfg_elements elem, void *buf, int bufsiz
} else
memset(buf, 0, bufsize);
break;
+ case MISDN_CTYPE_ASTNAMEDGROUP:
+ if (bufsize >= sizeof(struct ast_namedgroups *)) {
+ if (port_cfg[port][place].namgrp) {
+ *(struct ast_namedgroups **)buf = port_cfg[port][place].namgrp;
+ } else if (port_cfg[0][place].namgrp) {
+ *(struct ast_namedgroups **)buf = port_cfg[0][place].namgrp;
+ } else {
+ *(struct ast_namedgroups **)buf = NULL;
+ }
+ }
+ break;
default:
if (port_cfg[port][place].any)
memcpy(buf, port_cfg[port][place].any, bufsize);
@@ -831,6 +851,25 @@ void misdn_cfg_get_config_string (int port, enum misdn_cfg_elements elem, char*
else
snprintf(buf, bufsize, " -> %s:", port_spec[place].name);
break;
+ case MISDN_CTYPE_ASTNAMEDGROUP:
+ if (port_cfg[port][place].namgrp) {
+ struct ast_str *tmp_str = ast_str_create(1024);
+ if (tmp_str) {
+ snprintf(buf, bufsize, " -> %s: %s", port_spec[place].name,
+ ast_print_namedgroups(&tmp_str, port_cfg[port][place].namgrp));
+ ast_free(tmp_str);
+ }
+ } else if (port_cfg[0][place].namgrp) {
+ struct ast_str *tmp_str = ast_str_create(1024);
+ if (tmp_str) {
+ snprintf(buf, bufsize, " -> %s: %s", port_spec[place].name,
+ ast_print_namedgroups(&tmp_str, port_cfg[0][place].namgrp));
+ ast_free(tmp_str);
+ }
+ } else {
+ snprintf(buf, bufsize, " -> %s:", port_spec[place].name);
+ }
+ break;
case MISDN_CTYPE_MSNLIST:
if (port_cfg[port][place].ml)
iter = port_cfg[port][place].ml;
@@ -984,6 +1023,9 @@ static int _parse (union misdn_cfg_pt *dest, const char *value, enum misdn_cfg_t
}
*(dest->grp) = ast_get_group(value);
break;
+ case MISDN_CTYPE_ASTNAMEDGROUP:
+ dest->namgrp = ast_get_namedgroups(value);
+ break;
}
return re;
diff --git a/channels/sip/include/sip.h b/channels/sip/include/sip.h
index a10d405a9..a821435e9 100644
--- a/channels/sip/include/sip.h
+++ b/channels/sip/include/sip.h
@@ -1062,6 +1062,8 @@ struct sip_pvt {
uint32_t init_icseq; /*!< Initial incoming seqno from first request */
ast_group_t callgroup; /*!< Call group */
ast_group_t pickupgroup; /*!< Pickup group */
+ struct ast_namedgroups *named_callgroups; /*!< Named call group */
+ struct ast_namedgroups *named_pickupgroups; /*!< Named pickup group */
uint32_t lastinvite; /*!< Last seqno of invite */
struct ast_flags flags[3]; /*!< SIP_ flags */
@@ -1328,6 +1330,8 @@ struct sip_peer {
int rtpkeepalive; /*!< Send RTP packets for keepalive */
ast_group_t callgroup; /*!< Call group */
ast_group_t pickupgroup; /*!< Pickup group */
+ struct ast_namedgroups *named_callgroups; /*!< Named call group */
+ struct ast_namedgroups *named_pickupgroups; /*!< Named pickup group */
struct sip_proxy *outboundproxy;/*!< Outbound proxy for this peer */
struct ast_dnsmgr_entry *dnsmgr;/*!< DNS refresh manager for peer */
struct ast_sockaddr addr; /*!< IP address of peer */