/** * Gether the message information about SST from the current message * being processed. * * @param msg The current message to parse. * @param minfo The SST information found in the message. * * @return 0 on success, -1 on a parsing error. */ static int parse_msg_for_sst_info(struct sip_msg *msg, sst_msg_info_t *minfo) { int rtn = 0; struct session_expires se = {0,0}; if (!msg || !minfo) { return (-1); } /* * parse the supported infor */ minfo->supported = 0; /*Clear it */ minfo->se = 0; minfo->refresher = sst_refresher_unspecified; minfo->min_se = 0; /* * The parse_supported() will return 0 if found and parsed OK, -1 * if not found or an error parsing the one it did find! So assume * it is not found if unsuccessfull. */ if ((rtn = parse_supported(msg)) == 0) { if ((((struct option_tag_body*)msg->supported->parsed)->option_tags_all & F_OPTION_TAG_TIMER)) { minfo->supported = 1; } } /* * Parse the Min-SE: header next. */ minfo->min_se = 0; if ((rtn = parse_min_se(msg, &minfo->min_se)) != parse_sst_success) { minfo->min_se = 0; /* Make sure it statys clean */ } minfo->se = 0; if ((rtn = parse_session_expires(msg, &se)) == parse_sst_success) { minfo->se = se.interval; minfo->refresher = se.refresher; } return(0); }
/** * The sstCheckMin() script command handler. Return 1 (true) if the * MIN-SE: of the message is too small compared to the sst_min_se * value. This will allow the script to reply to this INVITE with a * "422 Session Timer Too Small" response. if sst_min_se was never set * the recommended value of 1800 seconds will be used. * * If the flag (str1) is set to 1, the 422 reply will be sent with the * sst MIN_SE value in the header. If the flag is not set or is NULL, * no reply is sent. * @param msg - The sip message from the script (INVITE only) * @param flag - Reply mode Flag. 0/NULL do not send reply, 1 send 422 * reply if Session-Expires is to small with the MIN-SE * header in the reply * @param str2 - Not used. * * @return 1 if the MIN-SE is too small, -1 if it is OK, or It could * not be checked. * * NOTE: returning 0 == drop message, 1 == true, -1 == false in the * script. */ int sst_check_min(struct sip_msg *msg, char *flag, char *str2) { enum parse_sst_result result; struct session_expires se = {0,0}; unsigned minse = 0; /* * Only look in INVITES. We can't reply with a 422 to a 2xx reply * now can we. This check can ONLY be done on the INVITE/UPDATE. */ if (msg->first_line.type == SIP_REQUEST && msg->first_line.u.request.method_value == METHOD_INVITE) { /* * First see if there is an Session-Expires: header. If there * is, also look for a MIN-SE: header. If there is, use the * minimum value of the two to compare with srt1. All MUST not * be less then 90 and 1800 is recomended. See RCF section 4. */ if ((result = parse_session_expires(msg, &se)) != parse_sst_success) { if (result != parse_sst_header_not_found) { LM_ERR("failed to parse Session-Expires headers.\n"); return 0; /* Error drop the message */ } /* Session-Expires not supported/stated */ LM_DBG("No Session-Expires header found. retuning false (-1)\n"); /* * NOTE: 0 == drop message, 1 == true, -1 == false */ return -1; } /* * We have a Session_expire header. Now look for the MIN-SE. */ if ((result = parse_min_se(msg, &minse)) != parse_sst_success) { if (result != parse_sst_header_not_found) { /* * This is an error. The header was found but could * not parse it. */ LM_ERR("failed to parse MIN-SE header.\n"); return -1; } /* * If not stated, use the value from the session-expires * header */ LM_DBG("No MIN-SE header found.\n"); minse = 90 /*this is the recommended value*/ /*se.interval*/; } LM_DBG("Session-Expires: %d; MIN-SE: %d\n", se.interval, minse); /* * Now compare our MIN-SE with the messages and see if it is * too small. We will take the smaller of the messages * Session-expires and min-se if stated. */ if (sst_min_se > MIN(minse, se.interval)) { /* * Too small. See if we need to send the 422 and are able * to send it. */ if (flag) { char minse_hdr[3+1+2+1+1+11+CRLF_LEN+2+1]; int hdr_len = 3+1+2+1+1+11+CRLF_LEN+2; memset(minse_hdr, 0, hdr_len+1); hdr_len = snprintf(minse_hdr, hdr_len, "%s%d%s", "MIN-SE: ", sst_min_se,CRLF); LM_DBG("Sending 422: %.*s\n", hdr_len, minse_hdr); if (send_response(msg, 422, &sst_422_rpl, minse_hdr, hdr_len)){ LM_ERR("Error sending 422 reply.\n"); } } LM_DBG("Done returning true (1)\n"); return 1; /* return true */ } } LM_DBG("Done returning false (-1)\n"); /* * All is good. */ return -1; /* return false */ }