Option needed for Q931_IE_TIME_DATE to be optional in CONNECT message.

The NEC SV8300 rejects the Q931_IE_TIME_DATE for Q.SIG.

Add option to specify if and how much of the current time is put in
Q931_IE_TIME_DATE.
* Send date/time ie never.
* Send date/time ie date only.
* Send date/time ie date and hour.
* Send date/time ie date, hour, and minute.
* Send date/time ie date, hour, minute, and second.
* Send date/time ie default: Libpri will send date and hhmm only when in
NT PTMP mode to support ISDN phones.

(closes issue #19221)
Reported by: kenner

JIRA SWP-3396


git-svn-id: https://origsvn.digium.com/svn/libpri/branches/1.4@2266 2fbb986a-6c06-0410-b554-c9c1f0a7f128
This commit is contained in:
Richard Mudgett 2011-05-17 20:13:10 +00:00
parent 239f8186ef
commit 092811da55
4 changed files with 110 additions and 25 deletions

View File

@ -2102,6 +2102,27 @@ void pri_cc_status(struct pri *ctrl, long cc_id, int status);
int pri_cc_call(struct pri *ctrl, long cc_id, q931_call *call, struct pri_sr *req); int pri_cc_call(struct pri *ctrl, long cc_id, q931_call *call, struct pri_sr *req);
void pri_cc_cancel(struct pri *ctrl, long cc_id); void pri_cc_cancel(struct pri *ctrl, long cc_id);
/* Date/time ie send policy option values. */
#define PRI_DATE_TIME_SEND_DEFAULT 0 /*!< Send date/time ie default. */
#define PRI_DATE_TIME_SEND_NO 1 /*!< Send date/time ie never. */
#define PRI_DATE_TIME_SEND_DATE 2 /*!< Send date/time ie date only. */
#define PRI_DATE_TIME_SEND_DATE_HH 3 /*!< Send date/time ie date and hour. */
#define PRI_DATE_TIME_SEND_DATE_HHMM 4 /*!< Send date/time ie date, hour, and minute. */
#define PRI_DATE_TIME_SEND_DATE_HHMMSS 5 /*!< Send date/time ie date, hour, minute, and second. */
/*!
* \brief Set the date/time ie send policy option.
*
* \param ctrl D channel controller.
* \param option Policy option to set.
*
* \note
* Only valid in NT mode.
*
* \return Nothing
*/
void pri_date_time_send_option(struct pri *ctrl, int option);
/* Get/Set PRI Timers */ /* Get/Set PRI Timers */
#define PRI_GETSET_TIMERS #define PRI_GETSET_TIMERS
int pri_set_timer(struct pri *pri, int timer, int value); int pri_set_timer(struct pri *pri, int timer, int value);

49
pri.c
View File

@ -344,6 +344,27 @@ static unsigned long pri_display_options_receive_default(struct pri *ctrl)
return flags; return flags;
} }
/*!
* \internal
* \brief Determine the default date/time send option default.
*
* \param ctrl D channel controller.
*
* \return Default date/time send option.
*/
static int pri_date_time_send_default(struct pri *ctrl)
{
int date_time_send;
if (BRI_NT_PTMP(ctrl)) {
date_time_send = PRI_DATE_TIME_SEND_DATE_HHMM;
} else {
date_time_send = PRI_DATE_TIME_SEND_NO;
}
return date_time_send;
}
/*! /*!
* \brief Destroy the given link. * \brief Destroy the given link.
* *
@ -565,6 +586,7 @@ static struct pri *pri_ctrl_new(int fd, int node, int switchtype, pri_io_cb rd,
tei); tei);
break; break;
} }
ctrl->date_time_send = pri_date_time_send_default(ctrl);
if (dummy_ctrl) { if (dummy_ctrl) {
/* Initialize the dummy call reference call record. */ /* Initialize the dummy call reference call record. */
ctrl->link.dummy_call = &dummy_ctrl->dummy_call; ctrl->link.dummy_call = &dummy_ctrl->dummy_call;
@ -2174,3 +2196,30 @@ int pri_display_text(struct pri *ctrl, q931_call *call, const struct pri_subcmd_
} }
return q931_display_text(ctrl, call, display); return q931_display_text(ctrl, call, display);
} }
void pri_date_time_send_option(struct pri *ctrl, int option)
{
if (!ctrl) {
return;
}
switch (option) {
case PRI_DATE_TIME_SEND_DEFAULT:
ctrl->date_time_send = pri_date_time_send_default(ctrl);
break;
default:
case PRI_DATE_TIME_SEND_NO:
ctrl->date_time_send = PRI_DATE_TIME_SEND_NO;
break;
case PRI_DATE_TIME_SEND_DATE:
case PRI_DATE_TIME_SEND_DATE_HH:
case PRI_DATE_TIME_SEND_DATE_HHMM:
case PRI_DATE_TIME_SEND_DATE_HHMMSS:
if (NT_MODE(ctrl)) {
/* Only networks may send date/time ie. */
ctrl->date_time_send = option;
} else {
ctrl->date_time_send = PRI_DATE_TIME_SEND_NO;
}
break;
}
}

View File

@ -189,6 +189,8 @@ struct pri {
/*! Receive display text policy option flags. */ /*! Receive display text policy option flags. */
unsigned long receive; unsigned long receive;
} display_flags; } display_flags;
/*! Configured date/time ie send policy option. */
int date_time_send;
}; };
/*! \brief Maximum name length plus null terminator (From ECMA-164) */ /*! \brief Maximum name length plus null terminator (From ECMA-164) */

47
q931.c
View File

@ -3082,16 +3082,44 @@ static int transmit_time_date(int full_ie, struct pri *ctrl, q931_call *call, in
{ {
time_t now; time_t now;
struct tm timedate; struct tm timedate;
int ie_len;
/* Send the current time. */ do {
if (ctrl->date_time_send < PRI_DATE_TIME_SEND_DATE) {
ie_len = 0;
break;
}
/* Send the current date/time. */
time(&now); time(&now);
localtime_r(&now, &timedate); localtime_r(&now, &timedate);
ie->data[0] = timedate.tm_year - 100; /* 1900+ */ ie->data[0] = timedate.tm_year - 100; /* 1900+ */
ie->data[1] = timedate.tm_mon + 1; ie->data[1] = timedate.tm_mon + 1;
ie->data[2] = timedate.tm_mday; ie->data[2] = timedate.tm_mday;
ie_len = 2 + 3;
if (ctrl->date_time_send < PRI_DATE_TIME_SEND_DATE_HH) {
break;
}
/* Add optional hour. */
ie->data[3] = timedate.tm_hour; ie->data[3] = timedate.tm_hour;
++ie_len;
if (ctrl->date_time_send < PRI_DATE_TIME_SEND_DATE_HHMM) {
break;
}
/* Add optional minutes. */
ie->data[4] = timedate.tm_min; ie->data[4] = timedate.tm_min;
return 7; ++ie_len;
if (ctrl->date_time_send < PRI_DATE_TIME_SEND_DATE_HHMMSS) {
break;
}
/* Add optional seconds. */
ie->data[5] = timedate.tm_sec;
++ie_len;
} while (0);
return ie_len;
} }
static void dump_keypad_facility(int full_ie, struct pri *ctrl, q931_ie *ie, int len, char prefix) static void dump_keypad_facility(int full_ie, struct pri *ctrl, q931_ie *ie, int len, char prefix)
@ -5597,16 +5625,6 @@ static void pri_disconnect_timeout(void *data)
} }
static int connect_ies[] = { static int connect_ies[] = {
Q931_CHANNEL_IDENT,
Q931_IE_FACILITY,
Q931_PROGRESS_INDICATOR,
Q931_DISPLAY,
Q931_IE_CONNECTED_NUM,
Q931_IE_CONNECTED_SUBADDR,
-1
};
static int connect_net_ies[] = {
Q931_CHANNEL_IDENT, Q931_CHANNEL_IDENT,
Q931_IE_FACILITY, Q931_IE_FACILITY,
Q931_PROGRESS_INDICATOR, Q931_PROGRESS_INDICATOR,
@ -5675,12 +5693,7 @@ int q931_connect(struct pri *ctrl, q931_call *c, int channel, int nonisdn)
} else { } else {
q931_display_clear(c); q931_display_clear(c);
} }
if (ctrl->localtype == PRI_NETWORK) {
/* networks may send date/time */
return send_message(ctrl, c, Q931_CONNECT, connect_net_ies);
} else {
return send_message(ctrl, c, Q931_CONNECT, connect_ies); return send_message(ctrl, c, Q931_CONNECT, connect_ies);
}
} }
static int release_ies[] = { Q931_CAUSE, Q931_IE_FACILITY, Q931_IE_USER_USER, -1 }; static int release_ies[] = { Q931_CAUSE, Q931_IE_FACILITY, Q931_IE_USER_USER, -1 };