Index: channels/chan_sip.c =================================================================== --- channels/chan_sip.c (revision 140809) +++ channels/chan_sip.c (working copy) @@ -796,10 +796,11 @@ #define SIP_PAGE2_BUGGY_MWI (1 << 26) /*!< 26: Buggy CISCO MWI fix */ #define SIP_PAGE2_OUTGOING_CALL (1 << 27) /*!< 27: Is this an outgoing call? */ #define SIP_PAGE2_UDPTL_DESTINATION (1 << 28) /*!< 28: Use source IP of RTP as destination if NAT is enabled */ +#define SIP_PAGE2_GIZMO (1 << 29) /*!< 29: TODO */ #define SIP_PAGE2_FLAGS_TO_COPY \ (SIP_PAGE2_ALLOWSUBSCRIBE | SIP_PAGE2_ALLOWOVERLAP | SIP_PAGE2_VIDEOSUPPORT | \ - SIP_PAGE2_T38SUPPORT | SIP_PAGE2_RFC2833_COMPENSATE | SIP_PAGE2_BUGGY_MWI | SIP_PAGE2_UDPTL_DESTINATION) + SIP_PAGE2_T38SUPPORT | SIP_PAGE2_RFC2833_COMPENSATE | SIP_PAGE2_BUGGY_MWI | SIP_PAGE2_UDPTL_DESTINATION | SIP_PAGE2_GIZMO) /* SIP packet flags */ #define SIP_PKT_DEBUG (1 << 0) /*!< Debug this packet */ @@ -8460,7 +8461,7 @@ const char *usednonce = p->randdata; struct ast_dynamic_str *buf; int res; - + /* table of recognised keywords, and their value in the digest */ enum keys { K_RESP, K_URI, K_USER, K_NONCE, K_LAST }; struct x { @@ -8473,7 +8474,11 @@ [K_NONCE] = { "nonce=", "" }, [K_LAST] = { NULL, NULL} }; - + + /* Always OK if this peer is trusty */ + struct sip_peer *peer = find_peer(0, &p->sa, 1, 0); + if (peer && ast_test_flag(&peer->flags[1], SIP_PAGE2_GIZMO)) + return AUTH_SUCCESSFUL; /* Always OK if no secret */ if (ast_strlen_zero(secret) && ast_strlen_zero(md5secret)) return AUTH_SUCCESSFUL; @@ -10583,6 +10588,7 @@ for (v = peer->chanvars ; v ; v = v->next) ast_cli(fd, " %s = %s\n", v->name, v->value); } + ast_cli(fd, " Gizmo : %s\n", ast_test_flag(&peer->flags[1], SIP_PAGE2_GIZMO) ? "Yes" : "No"); ast_cli(fd,"\n"); ASTOBJ_UNREF(peer,sip_destroy_peer); } else if (peer && type == 1) { /* manager listing */ @@ -14293,7 +14299,7 @@ if (!p->lastinvite && !ast_test_flag(req, SIP_PKT_IGNORE) && !p->owner) { /* This is a new invite */ /* Handle authentication if this is our first invite */ - res = check_user(p, req, SIP_INVITE, e, XMIT_RELIABLE, sin); + res = check_user(p, req, SIP_INVITE, e, XMIT_RELIABLE, sin); if (res == AUTH_CHALLENGE_SENT) { p->invitestate = INV_COMPLETED; /* Needs to restart in another INVITE transaction */ return 0; @@ -16660,6 +16666,9 @@ } else if (!strcasecmp(v->name, "t38pt_usertpsource")) { ast_set_flag(&mask[1], SIP_PAGE2_UDPTL_DESTINATION); ast_set2_flag(&flags[1], ast_true(v->value), SIP_PAGE2_UDPTL_DESTINATION); + } else if (!strcasecmp(v->name, "gizmo")) { + ast_set_flag(&mask[1], SIP_PAGE2_GIZMO); + ast_set2_flag(&flags[1], ast_true(v->value), SIP_PAGE2_GIZMO); } else res = 0;