Index: channels/chan_sip.c =================================================================== --- channels/chan_sip.c (revision 162992) +++ channels/chan_sip.c (working copy) @@ -4332,6 +4332,16 @@ if (peer->call_limit) ast_set_flag(&dialog->flags[0], SIP_CALL_LIMIT); + struct ast_variable *p_cur = peer->chanvars; + struct ast_variable *d_cur = NULL; + + for (; p_cur; p_cur = p_cur->next) { + struct ast_variable *d_new = ast_variable_new(p_cur->name, p_cur->value, ""); + d_new->next = d_cur; + d_cur = d_new; + } + dialog->chanvars = d_cur; + return 0; } @@ -20990,6 +21000,7 @@ const char *srvlookup = NULL; static int deprecation_warning = 1; struct ast_str *fullcontact = ast_str_alloca(sizeof(peer->fullcontact)); + int chanvar_no = 0; // chanvar counter if (!realtime || ast_test_flag(&global_flags[1], SIP_PAGE2_RTCACHEFRIENDS)) { /* Note we do NOT use find_peer here, to avoid realtime recursion */ @@ -21279,6 +21290,15 @@ } } else if (!strcasecmp(v->name, "setvar")) { peer->chanvars = add_var(v->value, peer->chanvars); + } else if (!strcasecmp(v->name, "hfield")) { + char varbuf[30]; + struct ast_variable *newvar; + snprintf(varbuf, sizeof(varbuf), "__SIPADDHEADER%.2d", chanvar_no); + newvar = ast_variable_new(varbuf, v->value, ""); + newvar->next = peer->chanvars; + peer->chanvars = newvar; + + chanvar_no++; } else if (!strcasecmp(v->name, "qualify")) { if (!strcasecmp(v->value, "no")) { peer->maxms = 0;