# HG changeset patch # User Sebastien Decugis # Date 1260253474 -32400 # Node ID 6a294d9778789b7595ca073801564be4b5402746 # Parent 3b6174b6b35b22c5d0ae2fd85cc0f73caf23eab3 Default to add Session-Id in answers diff -r 3b6174b6b35b -r 6a294d977878 extensions/app_test/atst_serv.c --- a/extensions/app_test/atst_serv.c Tue Dec 08 14:53:26 2009 +0900 +++ b/extensions/app_test/atst_serv.c Tue Dec 08 15:24:34 2009 +0900 @@ -67,17 +67,6 @@ CHECK_FCT( fd_msg_new_answer_from_req ( fd_g_config->cnf_dict, msg, 0 ) ); ans = *msg; - /* Set the Session-Id AVP */ - { - char * sid; - CHECK_FCT( fd_sess_getsid ( sess, &sid ) ); - CHECK_FCT( fd_msg_avp_new ( atst_sess_id, 0, &avp ) ); - val.os.data = sid; - val.os.len = strlen(sid); - CHECK_FCT( fd_msg_avp_setvalue( avp, &val ) ); - CHECK_FCT( fd_msg_avp_add( ans, MSG_BRW_FIRST_CHILD, avp ) ); - - } /* Set the Test-AVP AVP */ { struct avp * src = NULL; diff -r 3b6174b6b35b -r 6a294d977878 freeDiameter/dispatch.c --- a/freeDiameter/dispatch.c Tue Dec 08 14:53:26 2009 +0900 +++ b/freeDiameter/dispatch.c Tue Dec 08 15:24:34 2009 +0900 @@ -191,7 +191,7 @@ } /* Create an answer with the error code and message */ - CHECK_FCT_DO( fd_msg_new_answer_from_req ( fd_g_config->cnf_dict, &msg, MSGFL_ANSW_ERROR ), goto fatal_error ); + CHECK_FCT_DO( fd_msg_new_answer_from_req ( fd_g_config->cnf_dict, &msg, 0 ), goto fatal_error ); CHECK_FCT_DO( fd_msg_rescode_set(msg, (char *)ec, (char *)em, NULL, 1 ), goto fatal_error ); case DISP_ACT_SEND: diff -r 3b6174b6b35b -r 6a294d977878 freeDiameter/p_dp.c --- a/freeDiameter/p_dp.c Tue Dec 08 14:53:26 2009 +0900 +++ b/freeDiameter/p_dp.c Tue Dec 08 15:24:34 2009 +0900 @@ -97,8 +97,7 @@ /* Now reply with a DPA */ CHECK_FCT( fd_msg_new_answer_from_req ( fd_g_config->cnf_dict, msg, 0 ) ); - CHECK_FCT( fd_msg_rescode_set( *msg, "DIAMETER_SUCCESS", NULL, NULL, 0 ) ); - CHECK_FCT( fd_msg_add_origin ( *msg, 0 ) ); + CHECK_FCT( fd_msg_rescode_set( *msg, "DIAMETER_SUCCESS", NULL, NULL, 1 ) ); /* Move to CLOSING state to failover outgoing messages (and avoid failing the DPA...) */ CHECK_FCT( fd_psm_change_state(peer, STATE_CLOSING) ); diff -r 3b6174b6b35b -r 6a294d977878 include/freeDiameter/libfreeDiameter.h --- a/include/freeDiameter/libfreeDiameter.h Tue Dec 08 14:53:26 2009 +0900 +++ b/include/freeDiameter/libfreeDiameter.h Tue Dec 08 15:24:34 2009 +0900 @@ -1722,7 +1722,8 @@ /* Some flags used in the functions bellow */ #define MSGFL_ALLOC_ETEID 0x01 /* When creating a message, a new end-to-end ID is allocated and set in the message */ #define MSGFL_ANSW_ERROR 0x02 /* When creating an answer message, set the 'E' bit and use the generic error ABNF instead of command-specific ABNF */ -#define MSGFL_MAX MSGFL_ANSW_ERROR /* The biggest valid flag value */ +#define MSGFL_ANSW_NOSID 0x04 /* When creating an answer message, do not add the Session-Id even if present in request */ +#define MSGFL_MAX MSGFL_ANSW_NOSID /* The biggest valid flag value */ /**************************************************/ /* Message creation, manipulation, disposal */ diff -r 3b6174b6b35b -r 6a294d977878 libfreeDiameter/messages.c --- a/libfreeDiameter/messages.c Tue Dec 08 14:53:26 2009 +0900 +++ b/libfreeDiameter/messages.c Tue Dec 08 15:24:34 2009 +0900 @@ -286,6 +286,7 @@ { struct dict_object * model = NULL; struct msg *qry, *ans; + struct session * sess = NULL; TRACE_ENTRY("%p %x", msg, flags); @@ -294,6 +295,11 @@ qry = *msg; CHECK_PARAMS( CHECK_MSG(qry) && (qry->msg_public.msg_flags & CMD_FLAG_REQUEST) ); + if (! (flags & MSGFL_ANSW_NOSID)) { + /* Get the session of the message */ + CHECK_FCT_DO( fd_msg_sess_get(dict, qry, &sess, NULL), /* ignore an error */ ); + } + /* Find the model for the answer */ if (flags & MSGFL_ANSW_ERROR) { /* The model is the generic error format */ @@ -315,8 +321,23 @@ ans->msg_public.msg_eteid = qry->msg_public.msg_eteid; ans->msg_public.msg_hbhid = qry->msg_public.msg_hbhid; + /* Add the Session-Id AVP if session is known */ + if (sess && dict) { + struct dict_object * sess_id_avp; + char * sid; + struct avp * avp; + union avp_value val; + + CHECK_FCT( fd_dict_search( dict, DICT_AVP, AVP_BY_NAME, "Session-Id", &sess_id_avp, ENOENT) ); + CHECK_FCT( fd_sess_getsid ( sess, &sid ) ); + CHECK_FCT( fd_msg_avp_new ( sess_id_avp, 0, &avp ) ); + val.os.data = sid; + val.os.len = strlen(sid); + CHECK_FCT( fd_msg_avp_setvalue( avp, &val ) ); + CHECK_FCT( fd_msg_avp_add( ans, MSG_BRW_FIRST_CHILD, avp ) ); + } + /* associate with query */ - /* may do CHECK_FCT( msg_answ_associate( *msg, (msg_t *)qry ) ); but this is quicker */ ans->msg_query = qry; /* Done */