FreeCalypso > hg > fc-magnetite
diff src/g23m-gprs/llc/llc_uitxf.c @ 183:219afcfc6250
src/g23m-gprs: initial import from TCS3.2/LoCosto
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 13 Oct 2016 04:24:13 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/g23m-gprs/llc/llc_uitxf.c Thu Oct 13 04:24:13 2016 +0000 @@ -0,0 +1,244 @@ +/* ++----------------------------------------------------------------------------- +| Project : +| Modul : ++----------------------------------------------------------------------------- +| Copyright 2002 Texas Instruments Berlin, AG +| All rights reserved. +| +| This file is confidential and a trade secret of Texas +| Instruments Berlin, AG +| The receipt of or possession of this file does not convey +| any rights to reproduce or disclose its contents or to +| manufacture, use, or sell anything it may describe, in +| whole, or in part, without the specific written consent of +| Texas Instruments Berlin, AG. ++----------------------------------------------------------------------------- +| Purpose : This modul is part of the entity LLC and implements all +| procedures and functions as described in the +| SDL-documentation (UITX-statemachine) ++----------------------------------------------------------------------------- +*/ + +#ifndef LLC_UITXF_C +#define LLC_UITXF_C +#endif + +#define ENTITY_LLC + +/*==== INCLUDES =============================================================*/ + +#include "typedefs.h" /* to get Condat data types */ +#include "vsi.h" /* to get a lot of macros */ +#include "macdef.h" +#include "gprs.h" +#include "gsm.h" /* to get a lot of macros */ +#include "cnf_llc.h" /* to get cnf-definitions */ +#include "mon_llc.h" /* to get mon-definitions */ +#include "prim.h" /* to get the definitions of used SAP and directions */ +#include "llc.h" /* to get the global entity definitions */ + +/*==== CONST ================================================================*/ + +/*==== LOCAL VARS ===========================================================*/ + +/*==== PRIVATE FUNCTIONS ====================================================*/ + +/*==== PUBLIC FUNCTIONS =====================================================*/ + + + +/* ++------------------------------------------------------------------------------ +| Function : uitx_init ++------------------------------------------------------------------------------ +| Description : This procedure initialises all necessary variables of +| ui_frames_tx for all SAPIs. +| +| Parameters : +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void uitx_init (void) +{ + TRACE_FUNCTION( "uitx_init" ); + + /* + * Initialise every incarnation of UITX with state TLLI_UNASSIGNED_NOT_READY. + */ + SWITCH_SERVICE (llc, uitx, 0); + INIT_STATE (UITX_0, UITX_TLLI_UNASSIGNED_NOT_READY); + + SWITCH_SERVICE (llc, uitx, 1); + INIT_STATE (UITX_1, UITX_TLLI_UNASSIGNED_NOT_READY); + + SWITCH_SERVICE (llc, uitx, 2); + INIT_STATE (UITX_2, UITX_TLLI_UNASSIGNED_NOT_READY); + + SWITCH_SERVICE (llc, uitx, 3); + INIT_STATE (UITX_3, UITX_TLLI_UNASSIGNED_NOT_READY); + + SWITCH_SERVICE (llc, uitx, 4); + INIT_STATE (UITX_4, UITX_TLLI_UNASSIGNED_NOT_READY); + + SWITCH_SERVICE (llc, uitx, 5); + INIT_STATE (UITX_5, UITX_TLLI_UNASSIGNED_NOT_READY); + + return; +} /* uitx_init() */ + + + +/* ++------------------------------------------------------------------------------ +| Function : uitx_init_sapi ++------------------------------------------------------------------------------ +| Description : This procedure initialises all necessary variables of +| ui_frames_tx for the given SAPI. +| +| Parameters : +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void uitx_init_sapi (void) +{ + TRACE_FUNCTION( "uitx_init_sapi" ); + + /* + * <R.LLC.TLLI_ASS.A.007>, <R.LLC.TLLI_ASS.A.008> + */ + llc_data->uitx->vu = 0; + + return; +} /* uitx_init_sapi() */ + + + +/* ++------------------------------------------------------------------------------ +| Function : uitx_build_ui_header ++------------------------------------------------------------------------------ +| Description : This procedure inserts the address and control field of an UI +| frame in the given sdu. sdu already contains the user data. +| The variable cipher indicates the setting of the E bit. The +| variable relclass contains the information if the frame shall +| be transmitted in protected or unprotected mode, which is +| needed in this function to set the PM bit properly. +| +| Parameters : sdu - a valid pointer to a T_sdu variable, must contain enough +| spare octets at the beginning for the LLC header fields +| (address + control field = 3 octets for UI frames) +| cr_bit - C/R bit +| sapi - a valid SAPI for unacknowledged operation +| nu - N(U) +| cipher - ciphering indicator (see LL SAP: LL-UNITDATA-REQ) +| relclass - QoS reliability class (see LL SAP), must not be set +| to LL_RELCLASS_SUB +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void uitx_build_ui_header +( +#ifdef LL_DESC + T_desc_list3* desc_list3, +#else + T_sdu *sdu, +#endif + T_BIT cr_bit, + UBYTE sapi, + T_FRAME_NUM nu, + UBYTE cipher, + UBYTE relclass +) + +{ + +#ifdef LL_DESC + T_desc3 *desc3 = (T_desc3*)(desc_list3->first); + UBYTE *buf = (UBYTE*)(desc3->buffer); +#endif + + TRACE_FUNCTION( "uitx_build_ui_header" ); + +#ifdef LL_DESC + /* + * set new offset (3 octets earlier) and new length of desc_list3 + */ + desc3->offset -= UI_CTRL_MIN_OCTETS; + desc3->len += UI_CTRL_MIN_OCTETS; + desc_list3->list_len += UI_CTRL_MIN_OCTETS; + /* + * insert address field (PD is always 0) + */ + buf[desc3->offset] = ((UBYTE)cr_bit << 6) | sapi; + + /* + * insert 1st octet of control field + * (UI code + 3 most significant bits of N(U)) + */ + buf[desc3->offset+1]= 0xC0 | (UBYTE)(nu >> 6); + + /* + * insert 2nd octet of control field + * (6 least significant bits of N(U) + E bit + PM bit) + */ + buf[desc3->offset+2]= (((UBYTE)nu & 0x3F) << 2); + + if (cipher == LL_CIPHER_ON) + { + buf[desc3->offset+2] |= 0x02; + } + + /* + * all reliability classes except LL_NO_REL request protected data + */ + if (relclass != LL_NO_REL) + { + buf[desc3->offset+2] |= 0x01; + } + + return; + +#else + + /* + * set new offset (3 octets earlier) and new length of sdu + */ + sdu->o_buf -= UI_CTRL_MIN_OCTETS * 8; + sdu->l_buf += UI_CTRL_MIN_OCTETS * 8; + + /* + * insert address field (PD is always 0) + */ + sdu->buf[sdu->o_buf/8] = ((UBYTE)cr_bit << 6) | sapi; + + /* + * insert 1st octet of control field + * (UI code + 3 most significant bits of N(U)) + */ + sdu->buf[(sdu->o_buf/8)+1] = 0xC0 | (UBYTE)(nu >> 6); + + /* + * insert 2nd octet of control field + * (6 least significant bits of N(U) + E bit + PM bit) + */ + sdu->buf[(sdu->o_buf/8)+2] = (((UBYTE)nu & 0x3F) << 2); + + if (cipher == LL_CIPHER_ON) + { + sdu->buf[(sdu->o_buf/8)+2] |= 0x02; + } + + /* + * all reliability classes except LL_NO_REL request protected data + */ + if (relclass != LL_NO_REL) + { + sdu->buf[(sdu->o_buf/8)+2] |= 0x01; + } + + return; + +#endif /* LL_DESC */ + +} /* uitx_build_ui_header() */