Cleanup of flags used in struct sip_request, moving them to
authorLuigi Rizzo <rizzo@icir.org>
Sun, 22 Jul 2007 18:41:57 +0000 (18:41 +0000)
committerLuigi Rizzo <rizzo@icir.org>
Sun, 22 Jul 2007 18:41:57 +0000 (18:41 +0000)
individual variables. Apart from SIP_PKT_IGNORE which was used
a zillion times, the other two are used seldom.

On passing:
- move the arrays to the end of struct sip_request, so a (small)
  buffer overflow is less likely to overwrite the other fields;
- note that the 'ignore' argument to handle_invite_replaces() is not
  used and should be removed (will be done in a separate commit).

Nothing to backport in this change.

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@76365 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_sip.c

index e71c1c5..4030fd3 100644 (file)
@@ -631,7 +631,14 @@ static int *sipsock_read_id;            /*!< ID of IO entry for sipsock FD */
 #define DEC_CALL_RINGING 2
 #define INC_CALL_RINGING 3
 
-/*! \brief sip_request: The data grabbed from the UDP socket */
+/* SIP packet flags - note, they do NOT go in struct sip_pkt but
+ * in struct sip_request. */
+#define SIP_PKT_IGNORE                 (1 << 2)        /*!< This is a re-transmit, ignore it */
+
+/*! \brief sip_request: The data grabbed from the UDP socket
+ * data[] contains the packet itself, additional fields are set
+ * after parsing.
+ */
 struct sip_request {
        char *rlPart1;          /*!< SIP Method Name or "SIP/2.0" protocol version */
        char *rlPart2;          /*!< The Request URI or Response Status */
@@ -639,12 +646,14 @@ struct sip_request {
        int headers;            /*!< # of SIP Headers */
        int method;             /*!< Method of this request */
        int lines;              /*!< Body Content */
-       unsigned int flags;     /*!< SIP_PKT Flags for this packet */
+       unsigned int sdp_start; /*!< the line number where the SDP begins */
+       unsigned int sdp_end;   /*!< the line number where the SDP ends */
+       char debug;             /*!< print extra debugging if non zero */
+       char has_to_tag;        /*!< non-zero if packet has To: tag */
+       char ignore;            /*!< if non-zero This is a re-transmit, ignore it */
        char *header[SIP_MAX_HEADERS];
        char *line[SIP_MAX_LINES];
        char data[SIP_MAX_PACKET];
-       unsigned int sdp_start; /*!< the line number where the SDP begins */
-       unsigned int sdp_end;   /*!< the line number where the SDP ends */
 };
 
 /*
@@ -830,10 +839,6 @@ struct sip_auth {
        SIP_PAGE2_T38SUPPORT | SIP_PAGE2_RFC2833_COMPENSATE | SIP_PAGE2_BUGGY_MWI | \
        SIP_PAGE2_TEXTSUPPORT )
 
-/* SIP packet flags */
-#define SIP_PKT_DEBUG          (1 << 0)        /*!< Debug this packet */
-#define SIP_PKT_WITH_TOTAG     (1 << 1)        /*!< This packet has a to-tag */
-#define SIP_PKT_IGNORE                 (1 << 2)        /*!< This is a re-transmit, ignore it */
 
 /* T.38 set of flags */
 #define T38FAX_FILL_BIT_REMOVAL                (1 << 0)        /*!< Default: 0 (unset)*/
@@ -1831,7 +1836,7 @@ static void initialize_initreq(struct sip_pvt *p, struct sip_request *req)
        /* Use this as the basis */
        copy_request(&p->initreq, req);
        parse_request(&p->initreq);
-       if (ast_test_flag(req, SIP_PKT_DEBUG))
+       if (req->debug)
                ast_verbose("Initreq: %d headers, %d lines\n", p->initreq.headers, p->initreq.lines);
 }
 
@@ -4889,7 +4894,7 @@ static struct sip_pvt *find_call(struct sip_request *req, struct sockaddr_in *si
                   in sip.conf
                   */
                if (gettag(req, "To", totag, sizeof(totag)))
-                       ast_set_flag(req, SIP_PKT_WITH_TOTAG);  /* Used in handle_request/response */
+                       req->has_to_tag = 1;    /* Used in handle_request/response */
                gettag(req, "From", fromtag, sizeof(fromtag));
 
                tag = (req->method == SIP_RESPONSE) ? totag : fromtag;
@@ -9039,7 +9044,7 @@ static enum check_auth_result register_verify(struct sip_pvt *p, struct sockaddr
                } else {
                        ast_copy_flags(&p->flags[0], &peer->flags[0], SIP_NAT);
                        transmit_response(p, "100 Trying", req);
-                       if (!(res = check_auth(p, req, peer->name, peer->secret, peer->md5secret, SIP_REGISTER, uri, XMIT_UNRELIABLE, ast_test_flag(req, SIP_PKT_IGNORE)))) {
+                       if (!(res = check_auth(p, req, peer->name, peer->secret, peer->md5secret, SIP_REGISTER, uri, XMIT_UNRELIABLE, req->ignore))) {
                                sip_cancel_destroy(p);
 
                                /* We have a successful registration attempt with proper authentication,
@@ -9806,7 +9811,7 @@ static enum check_auth_result check_user_ok(struct sip_pvt *p, char *of,
        replace_cid(p, rpid_num, calleridname);
        do_setnat(p, ast_test_flag(&p->flags[0], SIP_NAT_ROUTE) );
 
-       if (!(res = check_auth(p, req, user->name, user->secret, user->md5secret, sipmethod, uri2, reliable, ast_test_flag(req, SIP_PKT_IGNORE)))) {
+       if (!(res = check_auth(p, req, user->name, user->secret, user->md5secret, sipmethod, uri2, reliable, req->ignore))) {
                sip_cancel_destroy(p);
                ast_copy_flags(&p->flags[0], &user->flags[0], SIP_FLAGS_TO_COPY);
                ast_copy_flags(&p->flags[1], &user->flags[1], SIP_PAGE2_FLAGS_TO_COPY);
@@ -9932,7 +9937,7 @@ static enum check_auth_result check_peer_ok(struct sip_pvt *p, char *of,
                ast_string_field_free(p, peersecret);
                ast_string_field_free(p, peermd5secret);
        }
-       if (!(res = check_auth(p, req, peer->name, p->peersecret, p->peermd5secret, sipmethod, uri2, reliable, ast_test_flag(req, SIP_PKT_IGNORE)))) {
+       if (!(res = check_auth(p, req, peer->name, p->peersecret, p->peermd5secret, sipmethod, uri2, reliable, req->ignore))) {
                ast_copy_flags(&p->flags[0], &peer->flags[0], SIP_FLAGS_TO_COPY);
                ast_copy_flags(&p->flags[1], &peer->flags[1], SIP_PAGE2_FLAGS_TO_COPY);
                /* If we have a call limit, set flag */
@@ -12687,15 +12692,15 @@ static void handle_response_invite(struct sip_pvt *p, int resp, char *rest, stru
        switch (resp) {
        case 100:       /* Trying */
        case 101:       /* Dialog establishment */
-               if (!ast_test_flag(req, SIP_PKT_IGNORE))
+               if (!req->ignore)
                        sip_cancel_destroy(p);
                check_pendings(p);
                break;
 
        case 180:       /* 180 Ringing */
-               if (!ast_test_flag(req, SIP_PKT_IGNORE))
+               if (!req->ignore)
                        sip_cancel_destroy(p);
-               if (!ast_test_flag(req, SIP_PKT_IGNORE) && p->owner) {
+               if (!req->ignore && p->owner) {
                        ast_queue_control(p->owner, AST_CONTROL_RINGING);
                        if (p->owner->_state != AST_STATE_UP) {
                                ast_setstate(p->owner, AST_STATE_RINGING);
@@ -12704,7 +12709,7 @@ static void handle_response_invite(struct sip_pvt *p, int resp, char *rest, stru
                if (find_sdp(req)) {
                        p->invitestate = INV_EARLY_MEDIA;
                        res = process_sdp(p, req);
-                       if (!ast_test_flag(req, SIP_PKT_IGNORE) && p->owner) {
+                       if (!req->ignore && p->owner) {
                                /* Queue a progress frame only if we have SDP in 180 */
                                ast_queue_control(p->owner, AST_CONTROL_PROGRESS);
                        }
@@ -12713,13 +12718,13 @@ static void handle_response_invite(struct sip_pvt *p, int resp, char *rest, stru
                break;
 
        case 183:       /* Session progress */
-               if (!ast_test_flag(req, SIP_PKT_IGNORE))
+               if (!req->ignore)
                        sip_cancel_destroy(p);
                /* Ignore 183 Session progress without SDP */
                if (find_sdp(req)) {
                        p->invitestate = INV_EARLY_MEDIA;
                        res = process_sdp(p, req);
-                       if (!ast_test_flag(req, SIP_PKT_IGNORE) && p->owner) {
+                       if (!req->ignore && p->owner) {
                                /* Queue a progress frame */
                                ast_queue_control(p->owner, AST_CONTROL_PROGRESS);
                        }
@@ -12728,11 +12733,11 @@ static void handle_response_invite(struct sip_pvt *p, int resp, char *rest, stru
                break;
 
        case 200:       /* 200 OK on invite - someone's answering our call */
-               if (!ast_test_flag(req, SIP_PKT_IGNORE))
+               if (!req->ignore)
                        sip_cancel_destroy(p);
                p->authtries = 0;
                if (find_sdp(req)) {
-                       if ((res = process_sdp(p, req)) && !ast_test_flag(req, SIP_PKT_IGNORE))
+                       if ((res = process_sdp(p, req)) && !req->ignore)
                                if (!reinvite)
                                        /* This 200 OK's SDP is not acceptable, so we need to ack, then hangup */
                                        /* For re-invites, we try to recover */
@@ -12753,7 +12758,7 @@ static void handle_response_invite(struct sip_pvt *p, int resp, char *rest, stru
                                        should we care about resolving the contact
                                        or should we just send it?
                                */
-                               if (!ast_test_flag(req, SIP_PKT_IGNORE))
+                               if (!req->ignore)
                                        ast_set_flag(&p->flags[0], SIP_PENDINGBYE);     
                        } 
 
@@ -12804,7 +12809,7 @@ static void handle_response_invite(struct sip_pvt *p, int resp, char *rest, stru
                        ast_debug(1, "T38 changed state to %d on channel %s\n", p->t38.state, p->owner ? p->owner->name : "<none>");
                }
 
-               if (!ast_test_flag(req, SIP_PKT_IGNORE) && p->owner) {
+               if (!req->ignore && p->owner) {
                        if (!reinvite) {
                                ast_queue_control(p->owner, AST_CONTROL_ANSWER);
                                if (global_callevents)
@@ -12818,7 +12823,7 @@ static void handle_response_invite(struct sip_pvt *p, int resp, char *rest, stru
                         /* It's possible we're getting an 200 OK after we've tried to disconnect
                                  by sending CANCEL */
                        /* First send ACK, then send bye */
-                       if (!ast_test_flag(req, SIP_PKT_IGNORE))
+                       if (!req->ignore)
                                ast_set_flag(&p->flags[0], SIP_PENDINGBYE);     
                }
                /* If I understand this right, the branch is different for a non-200 ACK only */
@@ -12836,7 +12841,7 @@ static void handle_response_invite(struct sip_pvt *p, int resp, char *rest, stru
 
                /* Then we AUTH */
                ast_string_field_free(p, theirtag);     /* forget their old tag, so we don't match tags when getting response */
-               if (!ast_test_flag(req, SIP_PKT_IGNORE)) {
+               if (!req->ignore) {
                        if (p->authtries < MAX_AUTHTRIES)
                                p->invitestate = INV_CALLING;
                        if (p->authtries == MAX_AUTHTRIES || do_proxy_auth(p, req, resp, SIP_INVITE, 1)) {
@@ -12853,7 +12858,7 @@ static void handle_response_invite(struct sip_pvt *p, int resp, char *rest, stru
                /* First we ACK */
                xmitres = transmit_request(p, SIP_ACK, seqno, XMIT_UNRELIABLE, FALSE);
                ast_log(LOG_WARNING, "Received response: \"Forbidden\" from '%s'\n", get_header(&p->initreq, "From"));
-               if (!ast_test_flag(req, SIP_PKT_IGNORE) && p->owner)
+               if (!req->ignore && p->owner)
                        ast_queue_control(p->owner, AST_CONTROL_CONGESTION);
                p->needdestroy = 1;
                sip_alreadygone(p);
@@ -12861,7 +12866,7 @@ static void handle_response_invite(struct sip_pvt *p, int resp, char *rest, stru
 
        case 404: /* Not found */
                xmitres = transmit_request(p, SIP_ACK, seqno, XMIT_UNRELIABLE, FALSE);
-               if (p->owner && !ast_test_flag(req, SIP_PKT_IGNORE))
+               if (p->owner && !req->ignore)
                        ast_queue_control(p->owner, AST_CONTROL_CONGESTION);
                sip_alreadygone(p);
                break;
@@ -12880,10 +12885,10 @@ static void handle_response_invite(struct sip_pvt *p, int resp, char *rest, stru
                        This transaction is already scheduled to be killed by sip_hangup().
                */
                xmitres = transmit_request(p, SIP_ACK, seqno, XMIT_UNRELIABLE, FALSE);
-               if (p->owner && !ast_test_flag(req, SIP_PKT_IGNORE)) {
+               if (p->owner && !req->ignore) {
                        ast_queue_hangup(p->owner);
                        append_history(p, "Hangup", "Got 487 on CANCEL request from us. Queued AST hangup request");
-               } else if (!ast_test_flag(req, SIP_PKT_IGNORE)) {
+               } else if (!req->ignore) {
                        update_call_counter(p, DEC_CALL_LIMIT);
                        append_history(p, "Hangup", "Got 487 on CANCEL request from us on call without owner. Killing this dialog.");
                        p->needdestroy = 1;
@@ -12907,12 +12912,12 @@ static void handle_response_invite(struct sip_pvt *p, int resp, char *rest, stru
                           sides here? 
                        */
                        /* While figuring that out, hangup the call */
-                       if (p->owner && !ast_test_flag(req, SIP_PKT_IGNORE))
+                       if (p->owner && !req->ignore)
                                ast_queue_control(p->owner, AST_CONTROL_CONGESTION);
                        p->needdestroy = 1;
                } else {
                        /* We can't set up this call, so give up */
-                       if (p->owner && !ast_test_flag(req, SIP_PKT_IGNORE))
+                       if (p->owner && !req->ignore)
                                ast_queue_control(p->owner, AST_CONTROL_CONGESTION);
                        p->needdestroy = 1;
                }
@@ -12922,7 +12927,7 @@ static void handle_response_invite(struct sip_pvt *p, int resp, char *rest, stru
                        /* We should support the retry-after at some point */
                /* At this point, we treat this as a congestion */
                xmitres = transmit_request(p, SIP_ACK, seqno, XMIT_UNRELIABLE, FALSE);
-               if (p->owner && !ast_test_flag(req, SIP_PKT_IGNORE))
+               if (p->owner && !req->ignore)
                        ast_queue_control(p->owner, AST_CONTROL_CONGESTION);
                p->needdestroy = 1;
                break;
@@ -13459,7 +13464,7 @@ static void handle_response(struct sip_pvt *p, int resp, char *rest, struct sip_
                                        p->needdestroy = 1;
                        } else if ((resp >= 100) && (resp < 200)) {
                                if (sipmethod == SIP_INVITE) {
-                                       if (!ast_test_flag(req, SIP_PKT_IGNORE))
+                                       if (!req->ignore)
                                                sip_cancel_destroy(p);
                                        if (find_sdp(req))
                                                process_sdp(p, req);
@@ -13474,7 +13479,7 @@ static void handle_response(struct sip_pvt *p, int resp, char *rest, struct sip_
        } else {        
                /* Responses to OUTGOING SIP requests on INCOMING calls 
                   get handled here. As well as out-of-call message responses */
-               if (ast_test_flag(req, SIP_PKT_DEBUG))
+               if (req->debug)
                        ast_verbose("SIP Response message for INCOMING dialog %s arrived\n", msg);
 
                if (sipmethod == SIP_INVITE && resp == 200) {
@@ -13558,7 +13563,7 @@ static void handle_response(struct sip_pvt *p, int resp, char *rest, struct sip_
                default:        /* Errors without handlers */
                        if ((resp >= 100) && (resp < 200)) {
                                if (sipmethod == SIP_INVITE) {  /* re-invite */
-                                       if (!ast_test_flag(req, SIP_PKT_IGNORE))
+                                       if (!req->ignore)
                                                sip_cancel_destroy(p);
                                }
                        }
@@ -14006,7 +14011,10 @@ static int handle_request_options(struct sip_pvt *p, struct sip_request *req)
 }
 
 /*! \brief Handle the transfer part of INVITE with a replaces: header, 
-    meaning a target pickup or an attended transfer */
+    meaning a target pickup or an attended transfer.
+    Used only once.
+       XXX 'ignore' is unused.
+ */
 static int handle_invite_replaces(struct sip_pvt *p, struct sip_request *req, int debug, int ignore, int seqno, struct sockaddr_in *sin)
 {
        struct ast_frame *f;
@@ -14038,7 +14046,7 @@ static int handle_invite_replaces(struct sip_pvt *p, struct sip_request *req, in
        else
                ast_debug(4, "SIP transfer: Invite Replace incoming channel should replace and hang up channel %s (one call leg)\n", replacecall->name); 
 
-       if (ast_test_flag(req, SIP_PKT_IGNORE)) {
+       if (req->ignore) {
                ast_log(LOG_NOTICE, "Ignoring this INVITE with replaces in a stupid way.\n");
                /* We should answer something here. If we are here, the
                        call we are replacing exists, so an accepted 
@@ -14209,7 +14217,7 @@ static int handle_request_invite(struct sip_pvt *p, struct sip_request *req, int
                return 0;
        }
        
-       if (!ast_test_flag(req, SIP_PKT_IGNORE) && p->pendinginvite) {
+       if (!req->ignore && p->pendinginvite) {
                /* We already have a pending invite. Sorry. You are on hold. */
                transmit_response(p, "491 Request Pending", req);
                ast_debug(1, "Got INVITE on call where we already have pending INVITE, deferring that - %s\n", p->callid);
@@ -14326,7 +14334,7 @@ static int handle_request_invite(struct sip_pvt *p, struct sip_request *req, int
        /* Check if this is an INVITE that sets up a new dialog or
           a re-invite in an existing dialog */
 
-       if (!ast_test_flag(req, SIP_PKT_IGNORE)) {
+       if (!req->ignore) {
                int newcall = (p->initreq.headers ? TRUE : FALSE);
 
                sip_cancel_destroy(p);
@@ -14364,7 +14372,7 @@ static int handle_request_invite(struct sip_pvt *p, struct sip_request *req, int
                ast_verbose("Ignoring this INVITE request\n");
 
        
-       if (!p->lastinvite && !ast_test_flag(req, SIP_PKT_IGNORE) && !p->owner) {
+       if (!p->lastinvite && !req->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);
@@ -14464,7 +14472,7 @@ static int handle_request_invite(struct sip_pvt *p, struct sip_request *req, int
                }
        } else {
                if (sipdebug) {
-                       if (!ast_test_flag(req, SIP_PKT_IGNORE))
+                       if (!req->ignore)
                                ast_debug(2, "Got a SIP re-invite for call %s\n", p->callid);
                        else
                                ast_debug(2, "Got a SIP re-transmit of INVITE for call %s\n", p->callid);
@@ -14473,14 +14481,14 @@ static int handle_request_invite(struct sip_pvt *p, struct sip_request *req, int
                c = p->owner;
        }
 
-       if (!ast_test_flag(req, SIP_PKT_IGNORE) && p)
+       if (!req->ignore && p)
                p->lastinvite = seqno;
 
        if (replace_id) {       /* Attended transfer or call pickup - we're the target */
                /* Go and take over the target call */
                if (sipdebug)
                        ast_debug(4, "Sending this call to the invite/replcaes handler %s\n", p->callid);
-               return handle_invite_replaces(p, req, debug, ast_test_flag(req, SIP_PKT_IGNORE), seqno, sin);
+               return handle_invite_replaces(p, req, debug, req->ignore, seqno, sin);
        }
 
 
@@ -14500,7 +14508,7 @@ static int handle_request_invite(struct sip_pvt *p, struct sip_request *req, int
                                case AST_PBX_FAILED:
                                        ast_log(LOG_WARNING, "Failed to start PBX :(\n");
                                        p->invitestate = INV_COMPLETED;
-                                       if (ast_test_flag(req, SIP_PKT_IGNORE))
+                                       if (req->ignore)
                                                transmit_response(p, "503 Unavailable", req);
                                        else
                                                transmit_response_reliable(p, "503 Unavailable", req);
@@ -14508,7 +14516,7 @@ static int handle_request_invite(struct sip_pvt *p, struct sip_request *req, int
                                case AST_PBX_CALL_LIMIT:
                                        ast_log(LOG_WARNING, "Failed to start PBX (call limit reached) \n");
                                        p->invitestate = INV_COMPLETED;
-                                       if (ast_test_flag(req, SIP_PKT_IGNORE))
+                                       if (req->ignore)
                                                transmit_response(p, "480 Temporarily Unavailable", req);
                                        else
                                                transmit_response_reliable(p, "480 Temporarily Unavailable", req);
@@ -14532,7 +14540,7 @@ static int handle_request_invite(struct sip_pvt *p, struct sip_request *req, int
                                *nounlock = 1;
                                if (ast_pickup_call(c)) {
                                        ast_log(LOG_NOTICE, "Nothing to pick up for %s\n", p->callid);
-                                       if (ast_test_flag(req, SIP_PKT_IGNORE))
+                                       if (req->ignore)
                                                transmit_response(p, "503 Unavailable", req);   /* OEJ - Right answer? */
                                        else
                                                transmit_response_reliable(p, "503 Unavailable", req);
@@ -14581,7 +14589,7 @@ static int handle_request_invite(struct sip_pvt *p, struct sip_request *req, int
                                                                bridgepvt->t38.state = T38_DISABLED;
                                                                sip_pvt_unlock(bridgepvt);
                                                                ast_debug(2,"T38 state changed to %d on channel %s\n", bridgepvt->t38.state, bridgepeer->name);
-                                                               if (ast_test_flag(req, SIP_PKT_IGNORE))
+                                                               if (req->ignore)
                                                                        transmit_response(p, "488 Not acceptable here", req);
                                                                else
                                                                        transmit_response_reliable(p, "488 Not acceptable here", req);
@@ -14595,7 +14603,7 @@ static int handle_request_invite(struct sip_pvt *p, struct sip_request *req, int
                                                }
                                        } else {
                                                /* Other side is not a SIP channel */
-                                               if (ast_test_flag(req, SIP_PKT_IGNORE))
+                                               if (req->ignore)
                                                        transmit_response(p, "488 Not acceptable here", req);
                                                else
                                                        transmit_response_reliable(p, "488 Not acceptable here", req);
@@ -14625,7 +14633,7 @@ static int handle_request_invite(struct sip_pvt *p, struct sip_request *req, int
                                                if (bridgepvt->t38.state == T38_ENABLED) {
                                                        ast_log(LOG_WARNING, "RTP re-invite after T38 session not handled yet !\n");
                                                        /* Insted of this we should somehow re-invite the other side of the bridge to RTP */
-                                                       if (ast_test_flag(req, SIP_PKT_IGNORE))
+                                                       if (req->ignore)
                                                                transmit_response(p, "488 Not Acceptable Here (unsupported)", req);
                                                        else
                                                                transmit_response_reliable(p, "488 Not Acceptable Here (unsupported)", req);
@@ -14637,7 +14645,7 @@ static int handle_request_invite(struct sip_pvt *p, struct sip_request *req, int
                                /* Respond to normal re-invite */
                                if (sendok)
                                        /* If this is not a re-invite or something to ignore - it's critical */
-                                       transmit_response_with_sdp(p, "200 OK", req, (reinvite || ast_test_flag(req, SIP_PKT_IGNORE)) ?  XMIT_UNRELIABLE : XMIT_CRITICAL);
+                                       transmit_response_with_sdp(p, "200 OK", req, (reinvite || req->ignore) ?  XMIT_UNRELIABLE : XMIT_CRITICAL);
                        }
                        p->invitestate = INV_TERMINATED;
                        break;
@@ -14656,7 +14664,7 @@ static int handle_request_invite(struct sip_pvt *p, struct sip_request *req, int
                                ast_log(LOG_NOTICE, "Unable to create/find SIP channel for this INVITE\n");
                                msg = "503 Unavailable";
                        }
-                       if (ast_test_flag(req, SIP_PKT_IGNORE))
+                       if (req->ignore)
                                transmit_response(p, msg, req);
                        else
                                transmit_response_reliable(p, msg, req);
@@ -14835,7 +14843,7 @@ static int handle_request_refer(struct sip_pvt *p, struct sip_request *req, int
 
        int res = 0;
 
-       if (ast_test_flag(req, SIP_PKT_DEBUG))
+       if (req->debug)
                ast_verbose("Call %s got a SIP call transfer from %s: (REFER)!\n", p->callid, ast_test_flag(&p->flags[0], SIP_OUTGOING) ? "callee" : "caller");
 
        if (!p->owner) {
@@ -14843,7 +14851,7 @@ static int handle_request_refer(struct sip_pvt *p, struct sip_request *req, int
                /* We can't handle that, so decline it */
                ast_debug(3, "Call %s: Declined REFER, outside of dialog...\n", p->callid);
                transmit_response(p, "603 Declined (No dialog)", req);
-               if (!ast_test_flag(req, SIP_PKT_IGNORE)) {
+               if (!req->ignore) {
                        append_history(p, "Xfer", "Refer failed. Outside of dialog.");
                        sip_alreadygone(p);
                        p->needdestroy = 1;
@@ -14861,7 +14869,7 @@ static int handle_request_refer(struct sip_pvt *p, struct sip_request *req, int
                return 0;
        }
 
-       if(!ast_test_flag(req, SIP_PKT_IGNORE) && ast_test_flag(&p->flags[0], SIP_GOTREFER)) {
+       if (!req->ignore && ast_test_flag(&p->flags[0], SIP_GOTREFER)) {
                /* Already have a pending REFER */      
                transmit_response(p, "491 Request pending", req);
                append_history(p, "Xfer", "Refer failed. Request pending.");
@@ -14884,13 +14892,13 @@ static int handle_request_refer(struct sip_pvt *p, struct sip_request *req, int
                case -2:        /* Syntax error */
                        transmit_response(p, "400 Bad Request (Refer-to missing)", req);
                        append_history(p, "Xfer", "Refer failed. Refer-to missing.");
-                       if (ast_test_flag(req, SIP_PKT_DEBUG))
+                       if (req->debug)
                                ast_debug(1, "SIP transfer to black hole can't be handled (no refer-to: )\n");
                        break;
                case -3:
                        transmit_response(p, "603 Declined (Non sip: uri)", req);
                        append_history(p, "Xfer", "Refer failed. Non SIP uri");
-                       if (ast_test_flag(req, SIP_PKT_DEBUG))
+                       if (req->debug)
                                ast_debug(1, "SIP transfer to non-SIP uri denied\n");
                        break;
                default:
@@ -14899,7 +14907,7 @@ static int handle_request_refer(struct sip_pvt *p, struct sip_request *req, int
                        append_history(p, "Xfer", "Refer failed. Bad extension.");
                        transmit_notify_with_sipfrag(p, seqno, "404 Not found", TRUE);
                        ast_clear_flag(&p->flags[0], SIP_GOTREFER);     
-                       if (ast_test_flag(req, SIP_PKT_DEBUG))
+                       if (req->debug)
                                ast_debug(1, "SIP transfer to bad extension: %s\n", p->refer->refer_to);
                        break;
                } 
@@ -14922,7 +14930,7 @@ static int handle_request_refer(struct sip_pvt *p, struct sip_request *req, int
        
        /* Is this a repeat of a current request? Ignore it */
        /* Don't know what else to do right now. */
-       if (ast_test_flag(req, SIP_PKT_IGNORE)) 
+       if (req->ignore) 
                return res;
 
        /* If this is a blind transfer, we have the following
@@ -15219,7 +15227,7 @@ static int handle_request_bye(struct sip_pvt *p, struct sip_request *req)
        struct ast_channel *bridged_to;
        
        /* If we have an INCOMING invite that we haven't answered, terminate that transaction */
-       if (p->pendinginvite && !ast_test_flag(&p->flags[0], SIP_OUTGOING) && !ast_test_flag(req, SIP_PKT_IGNORE) && !p->owner) 
+       if (p->pendinginvite && !ast_test_flag(&p->flags[0], SIP_OUTGOING) && !req->ignore && !p->owner) 
                transmit_response_reliable(p, "487 Request Terminated", &p->initreq);
 
        p->invitestate = INV_TERMINATED;
@@ -15295,8 +15303,8 @@ static int handle_request_bye(struct sip_pvt *p, struct sip_request *req)
 /*! \brief Handle incoming MESSAGE request */
 static int handle_request_message(struct sip_pvt *p, struct sip_request *req)
 {
-       if (!ast_test_flag(req, SIP_PKT_IGNORE)) {
-               if (ast_test_flag(req, SIP_PKT_DEBUG))
+       if (!req->ignore) {
+               if (req->debug)
                        ast_verbose("Receiving message!\n");
                receive_message(p, req);
        } else
@@ -15325,7 +15333,7 @@ static int handle_request_subscribe(struct sip_pvt *p, struct sip_request *req,
                        /* Do not destroy session, since we will break the call if we do */
                        ast_debug(1, "Got a subscription within the context of another call, can't handle that - %s (Method %s)\n", p->callid, sip_methods[p->initreq.method].text);
                        return 0;
-               } else if (ast_test_flag(req, SIP_PKT_DEBUG)) {
+               } else if (req->debug) {
                        if (resubscribe)
                                ast_debug(1, "Got a re-subscribe on existing subscription %s\n", p->callid);
                        else
@@ -15342,16 +15350,16 @@ static int handle_request_subscribe(struct sip_pvt *p, struct sip_request *req,
                return 0;
        }
 
-       if (!ast_test_flag(req, SIP_PKT_IGNORE) && !resubscribe) {      /* Set up dialog, new subscription */
+       if (!req->ignore && !resubscribe) {     /* Set up dialog, new subscription */
                /* Use this as the basis */
-               if (ast_test_flag(req, SIP_PKT_DEBUG))
+               if (req->debug)
                        ast_verbose("Creating new subscription\n");
 
                copy_request(&p->initreq, req);
                if (sipdebug)
                        ast_debug(4, "Initializing initreq for method %s - callid %s\n", sip_methods[req->method].text, p->callid);
                check_via(p, req);
-       } else if (ast_test_flag(req, SIP_PKT_DEBUG) && ast_test_flag(req, SIP_PKT_IGNORE))
+       } else if (req->debug && req->ignore)
                ast_verbose("Ignoring this SUBSCRIBE request\n");
 
        /* Find parameters to Event: header value and remove them for now */
@@ -15518,7 +15526,7 @@ static int handle_request_subscribe(struct sip_pvt *p, struct sip_request *req,
                p->stateid = ast_extension_state_add(p->context, p->exten, cb_extensionstate, p);
        }
 
-       if (!ast_test_flag(req, SIP_PKT_IGNORE) && p)
+       if (!req->ignore && p)
                p->lastinvite = seqno;
        if (p && !p->needdestroy) {
                p->expiry = atoi(get_header(req, "Expires"));
@@ -15705,7 +15713,7 @@ static int handle_request(struct sip_pvt *p, struct sip_request *req, struct soc
                } else if (p->ocseq != seqno) {
                        /* ignore means "don't do anything with it" but still have to 
                           respond appropriately  */
-                       ast_set_flag(req, SIP_PKT_IGNORE);
+                       req->ignore = 1;
                        append_history(p, "Ignore", "Ignoring this retransmit\n");
                } else if (e) {
                        e = ast_skip_blanks(e);
@@ -15744,7 +15752,7 @@ static int handle_request(struct sip_pvt *p, struct sip_request *req, struct soc
                /* ignore means "don't do anything with it" but still have to 
                   respond appropriately.  We do this if we receive a repeat of
                   the last sequence number  */
-               ast_set_flag(req, SIP_PKT_IGNORE);
+               req->ignore = 1;
                ast_debug(3, "Ignoring SIP message because of retransmit (%s Seqno %d, ours %d)\n", sip_methods[p->method].text, p->icseq, seqno);
        }
                
@@ -15768,9 +15776,9 @@ static int handle_request(struct sip_pvt *p, struct sip_request *req, struct soc
                        correct according to RFC 3261  */
                /* Check if this a new request in a new dialog with a totag already attached to it,
                        RFC 3261 - section 12.2 - and we don't want to mess with recovery  */
-               if (!p->initreq.headers && ast_test_flag(req, SIP_PKT_WITH_TOTAG)) {
+               if (!p->initreq.headers && req->has_to_tag) {
                        /* If this is a first request and it got a to-tag, it is not for us */
-                       if (!ast_test_flag(req, SIP_PKT_IGNORE) && req->method == SIP_INVITE) {
+                       if (!req->ignore && req->method == SIP_INVITE) {
                                transmit_response_reliable(p, "481 Call/Transaction Does Not Exist", req);
                                /* Will cease to exist after ACK */
                        } else if (req->method != SIP_ACK) {
@@ -15816,9 +15824,9 @@ static int handle_request(struct sip_pvt *p, struct sip_request *req, struct soc
                res = handle_request_register(p, req, sin, e);
                break;
        case SIP_INFO:
-               if (ast_test_flag(req, SIP_PKT_DEBUG))
+               if (req->debug)
                        ast_verbose("Receiving INFO!\n");
-               if (!ast_test_flag(req, SIP_PKT_IGNORE)) 
+               if (!req->ignore) 
                        handle_request_info(p, req);
                else  /* if ignoring, transmit response */
                        transmit_response(p, "200 OK", req);
@@ -15889,16 +15897,16 @@ static int sipsock_read(int *id, int fd, short events, void *ignore)
                req.data[res] = '\0';
        req.len = res;
        if(sip_debug_test_addr(&sin))   /* Set the debug flag early on packet level */
-               ast_set_flag(&req, SIP_PKT_DEBUG);
+               req.debug = 1;
        if (pedanticsipchecking)
                req.len = lws2sws(req.data, req.len);   /* Fix multiline headers */
-       if (ast_test_flag(&req, SIP_PKT_DEBUG))
+       if (req.debug)
                ast_verbose("\n<--- SIP read from %s:%d --->\n%s\n<------------->\n", ast_inet_ntoa(sin.sin_addr), ntohs(sin.sin_port), req.data);
 
        parse_request(&req);
        req.method = find_sip_method(req.rlPart1);
 
-       if (ast_test_flag(&req, SIP_PKT_DEBUG))
+       if (req.debug)
                ast_verbose("--- (%d headers %d lines)%s ---\n", req.headers, req.lines, (req.headers + req.lines == 0) ? " Nat keepalive" : "");
 
        if (req.headers < 2)    /* Must have at least two headers */