Handle Detach and Service request, make it possible to set direction on link(UL/DL).
svn path=/trunk/; revision=28648
This commit is contained in:
parent
64432ed12b
commit
c2509b0b3f
|
@ -236,7 +236,18 @@ MAX_VAL = asn1_param_get_integer(%(ACTX)s,"upperBound")
|
|||
/* IPv6 */
|
||||
proto_tree_add_item(subtree, hf_s1ap_transportLayerAddressIPv6, tvb, 0, tvb_len, FALSE);
|
||||
}
|
||||
#.FN_HDR InitialUEMessage
|
||||
/* Set the direction of the message */
|
||||
actx->pinfo->link_dir=P2P_DIR_UL;
|
||||
|
||||
#.FN_HDR DownlinkNASTransport
|
||||
/* Set the direction of the message */
|
||||
actx->pinfo->link_dir=P2P_DIR_DL;
|
||||
|
||||
#.FN_HDR UplinkNASTransport
|
||||
/* Set the direction of the message */
|
||||
actx->pinfo->link_dir=P2P_DIR_UL;
|
||||
|
||||
#.TYPE_ATTR
|
||||
ProtocolExtensionID TYPE = FT_UINT8 DISPLAY = BASE_DEC STRINGS = VALS(s1ap_ProtocolIE_ID_vals)
|
||||
|
||||
|
|
|
@ -149,6 +149,11 @@ static int hf_nas_eps_emm_apn_ambr_ul_ext = -1;
|
|||
static int hf_nas_eps_emm_apn_ambr_dl_ext = -1;
|
||||
static int hf_nas_eps_emm_apn_ambr_ul_ext2 = -1;
|
||||
static int hf_nas_eps_emm_apn_ambr_dl_ext2 = -1;
|
||||
|
||||
static int hf_nas_eps_emm_switch_off = -1;
|
||||
static int hf_nas_eps_emm_detach_type_UL = -1;
|
||||
static int hf_nas_eps_emm_detach_type_DL = -1;
|
||||
|
||||
static int hf_nas_eps_qci = -1;
|
||||
static int hf_nas_eps_mbr_ul = -1;
|
||||
static int hf_nas_eps_mbr_dl = -1;
|
||||
|
@ -657,42 +662,42 @@ de_emm_csfb_resp(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_,
|
|||
*/
|
||||
/*
|
||||
* 9.9.3.7 Detach type
|
||||
* Coded inline
|
||||
*/
|
||||
/*
|
||||
Type of detach (octet 1)
|
||||
static const value_string nas_eps_emm_switch_off_vals[] = {
|
||||
{ 0x0, "Normal detach"},
|
||||
{ 0x1, "Switch off"},
|
||||
{ 0, NULL }
|
||||
};
|
||||
/* Type of detach (octet 1)
|
||||
* In the UE to network direction:
|
||||
*/
|
||||
static const value_string nas_eps_emm_type_of_dtatch_UL_vals[] = {
|
||||
{ 0x1, "EPS detach"},
|
||||
{ 0x2, "IMSI detach"},
|
||||
{ 0x3, "Combined EPS/IMSI detach"},
|
||||
{ 0x4, "Combined EPS/IMSI detach"}, /* All other values are interpreted as "combined EPS/IMSI detach" in this version of the protocol.*/
|
||||
{ 0x5, "Combined EPS/IMSI detach"}, /* -"- */
|
||||
{ 0x6, "Reserved"},
|
||||
{ 0x7, "Reserved"},
|
||||
{ 0, NULL }
|
||||
};
|
||||
|
||||
In the UE to network direction:
|
||||
Bits
|
||||
3 2 1
|
||||
0 0 1 EPS detach
|
||||
0 1 0 IMSI detach
|
||||
0 1 1 combined EPS/IMSI detach
|
||||
1 1 0 reserved
|
||||
1 1 1 reserved
|
||||
/*
|
||||
* In the network to UE direction:
|
||||
*/
|
||||
|
||||
All other values are interpreted as "combined EPS/IMSI detach" in this version of the protocol.
|
||||
static const value_string nas_eps_emm_type_of_dtatch_DL_vals[] = {
|
||||
{ 0x1, "Re-attach required"},
|
||||
{ 0x2, "Re-attach not required"},
|
||||
{ 0x3, "IMSI detach"},
|
||||
{ 0x4, "IMSI detach"}, /* All other values are interpreted as "re-attach not required" in this version of the protocol.*/
|
||||
{ 0x5, "IMSI detach"}, /* -"- */
|
||||
{ 0x6, "Reserved"},
|
||||
{ 0x7, "Reserved"},
|
||||
{ 0, NULL }
|
||||
};
|
||||
|
||||
In the network to UE direction:
|
||||
Bits
|
||||
3 2 1
|
||||
0 0 1 re-attach required
|
||||
0 1 0 re-attach not required
|
||||
0 1 1 IMSI detach
|
||||
1 1 0 reserved
|
||||
1 1 1 reserved
|
||||
|
||||
All other values are interpreted as "re-attach not required" in this version of the protocol.
|
||||
|
||||
Switch off (octet 1)
|
||||
|
||||
In the UE to network direction:
|
||||
Bit
|
||||
4
|
||||
0 normal detach
|
||||
1 switch off
|
||||
|
||||
In the network to UE direction bit 4 is spare. The network shall set this bit to zero.
|
||||
*/
|
||||
/*
|
||||
* 9.9.3.8 DRX parameter
|
||||
* See subclause 10.5.5.6 in 3GPP TS 24.008 [13].
|
||||
|
@ -945,6 +950,18 @@ de_emm_nas_imeisv_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len
|
|||
/*
|
||||
* 9.9.3.19 KSI and sequence number
|
||||
*/
|
||||
static guint16
|
||||
de_emm_nas_ksi_and_seq_no(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len _U_, gchar *add_string _U_, int string_len _U_)
|
||||
{
|
||||
guint32 curr_offset;
|
||||
|
||||
curr_offset = offset;
|
||||
|
||||
proto_tree_add_text(tree, tvb, curr_offset, 1 , "KSI and sequence number");
|
||||
curr_offset++;
|
||||
|
||||
return(curr_offset - offset);
|
||||
}
|
||||
|
||||
/*
|
||||
* 9.9.3.20 MS network capability
|
||||
|
@ -2050,7 +2067,7 @@ guint16 (*emm_elem_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint
|
|||
NULL, /* 9.9.3.16 GPRS timer ,See subclause 10.5.7.3 in 3GPP TS 24.008 [6]. (packet-gsm_a_gm.c)*/
|
||||
NULL, /* 9.9.3.17 Identity type 2 ,See subclause 10.5.5.9 in 3GPP TS 24.008 [6]. */
|
||||
de_emm_nas_imeisv_req, /* 9.9.3.18 IMEISV request ,See subclause 10.5.5.10 in 3GPP TS 24.008 [6]. */
|
||||
NULL, /* 9.9.3.19 KSI and sequence number */
|
||||
de_emm_nas_ksi_and_seq_no, /* 9.9.3.19 KSI and sequence number */
|
||||
NULL, /* 9.9.3.20 MS network capability ,See subclause 10.5.5.12 in 3GPP TS 24.008 [6].(packet-gsm_a_gm.c) */
|
||||
de_emm_nas_key_set_id, /* 9.9.3.21 NAS key set identifier (Coded Inline) */
|
||||
de_emm_nas_msg_cont, /* 9.9.3.22 NAS message container */
|
||||
|
@ -2420,19 +2437,97 @@ nas_emm_cs_serv_not(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
|
|||
/*
|
||||
* 8.2.11 Detach request
|
||||
* 8.2.11.1 Detach request (UE originating detach)
|
||||
* Detach type Detach type 9.9.3.6 M V 1/2
|
||||
* Spare half octet Spare half octet 9.9.2.7 M V 1/2
|
||||
* GUTI or IMSI EPS mobile identity 9.9.3.12 M LV 5-12
|
||||
*ELEM_MAND_LV(NAS_PDU_TYPE_EMM, DE_EMM_EPS_MID, " - GUTI or IMSI");
|
||||
*/
|
||||
/*
|
||||
* 8.2.11.2 Detach request (UE terminated detach)
|
||||
* Detach type Detach type 9.9.3.6 M V 1/2
|
||||
* Spare half octet Spare half octet 9.9.2.7 M V 1/2
|
||||
* EMM cause EMM cause 9.9.3.9 O TV 2
|
||||
* ELEM_OPT_TV(0x53, NAS_PDU_TYPE_EMM, DE_EMM_CAUSE, "");
|
||||
*/
|
||||
|
||||
static void
|
||||
nas_emm_detach_req_UL(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
|
||||
{
|
||||
guint32 curr_offset,bit_offset;
|
||||
guint32 consumed;
|
||||
guint curr_len;
|
||||
|
||||
curr_offset = offset;
|
||||
curr_len = len;
|
||||
|
||||
proto_tree_add_text(tree, tvb, curr_offset, len,"Up link");
|
||||
/* Spare half octet Spare half octet 9.9.2.7 M V 1/2 */
|
||||
bit_offset = curr_offset<<3;
|
||||
proto_tree_add_bits_item(tree, hf_nas_eps_spare_bits, tvb, bit_offset, 4, FALSE);
|
||||
bit_offset+=4;
|
||||
/* Detach type Detach type 9.9.3.6 M V 1/2 */
|
||||
proto_tree_add_bits_item(tree, hf_nas_eps_emm_switch_off, tvb, bit_offset, 1, FALSE);
|
||||
bit_offset++;
|
||||
proto_tree_add_bits_item(tree, hf_nas_eps_emm_detach_type_UL, tvb, bit_offset, 3, FALSE);
|
||||
bit_offset+=3;
|
||||
|
||||
/* Fix the lengths */
|
||||
curr_len--;
|
||||
curr_offset++;
|
||||
|
||||
/* GUTI or IMSI EPS mobile identity 9.9.3.12 M LV 5-12 */
|
||||
ELEM_MAND_LV(NAS_PDU_TYPE_EMM, DE_EMM_EPS_MID, " - GUTI or IMSI");
|
||||
|
||||
return;
|
||||
}
|
||||
/*
|
||||
* 8.2.11.2 Detach request (UE terminated detach)
|
||||
*/
|
||||
static void
|
||||
nas_emm_detach_req_DL(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
|
||||
{
|
||||
guint32 curr_offset, bit_offset;
|
||||
guint32 consumed;
|
||||
guint curr_len;
|
||||
|
||||
curr_offset = offset;
|
||||
curr_len = len;
|
||||
|
||||
proto_tree_add_text(tree, tvb, curr_offset, len,"Down link");
|
||||
/* Spare half octet Spare half octet 9.9.2.7 M V 1/2 */
|
||||
bit_offset = curr_offset<<3;
|
||||
proto_tree_add_bits_item(tree, hf_nas_eps_spare_bits, tvb, bit_offset, 4, FALSE);
|
||||
bit_offset+=4;
|
||||
/* Detach type Detach type 9.9.3.6 M V 1/2 */
|
||||
/* In the network to UE direction bit 4 is spare. The network shall set this bit to zero. */
|
||||
proto_tree_add_bits_item(tree, hf_nas_eps_spare_bits, tvb, bit_offset, 1, FALSE);
|
||||
bit_offset++;
|
||||
proto_tree_add_bits_item(tree, hf_nas_eps_emm_detach_type_DL, tvb, bit_offset, 3, FALSE);
|
||||
bit_offset+=3;
|
||||
|
||||
/* Fix the lengths */
|
||||
curr_len--;
|
||||
curr_offset++;
|
||||
|
||||
/* EMM cause EMM cause 9.9.3.9 O TV 2 */
|
||||
ELEM_OPT_TV(0x53, NAS_PDU_TYPE_EMM, DE_EMM_CAUSE, "");
|
||||
|
||||
EXTRANEOUS_DATA_CHECK(curr_len, 0);
|
||||
|
||||
return;
|
||||
}
|
||||
static void
|
||||
nas_emm_detach_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
|
||||
{
|
||||
guint32 curr_offset;
|
||||
guint curr_len;
|
||||
|
||||
curr_offset = offset;
|
||||
curr_len = len;
|
||||
|
||||
if (gpinfo){
|
||||
if(gpinfo->link_dir==P2P_DIR_UL){
|
||||
nas_emm_detach_req_UL(tvb, tree, offset, len);
|
||||
return;
|
||||
}else if(gpinfo->link_dir==P2P_DIR_DL){
|
||||
nas_emm_detach_req_DL(tvb, tree, offset, len);
|
||||
return;
|
||||
}
|
||||
}
|
||||
proto_tree_add_text(tree, tvb, curr_offset, len,"UL/DL not known, can't properly dissect");
|
||||
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
* 8.2.12 Downlink NAS Transport
|
||||
|
@ -2752,11 +2847,32 @@ nas_emm_serv_rej(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
|
|||
* This message is sent by the UE to the network to request the establishment
|
||||
* of a NAS signalling connection and of the radio and S1 bearers.
|
||||
* Its structure does not follow the structure of a standard layer 3 message. See table 8.2.22.1.
|
||||
* Protocol discriminator Protocol discriminator 9.2 M V 1/2
|
||||
* Security header type Security header type 9.3.1 M V 1/2
|
||||
* KSI and sequence number KSI and sequence number 9.9.3.17 M V 1
|
||||
* Message authentication code (short) Short MAC 9.9.3.25 M V 2
|
||||
*/
|
||||
/* Table 8.2.22.1
|
||||
* Protocol discriminator Protocol discriminator 9.2 M V 1/2
|
||||
* Security header type Security header type 9.3.1 M V 1/2
|
||||
* KSI and sequence number KSI and sequence number 9.9.3.19 M V 1
|
||||
* Message authentication code (short) Short MAC 9.9.3.28 M V 2
|
||||
*/
|
||||
static void
|
||||
nas_emm_service_req(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len)
|
||||
{
|
||||
guint32 curr_offset;
|
||||
guint32 consumed;
|
||||
guint curr_len;
|
||||
|
||||
curr_offset = offset;
|
||||
curr_len = len;
|
||||
|
||||
/* KSI and sequence number 9.9.3.19 M V 1 */
|
||||
ELEM_MAND_V(NAS_PDU_TYPE_EMM, DE_EMM_KSI_AND_SEQ_NO);
|
||||
|
||||
/* Short MAC 9.9.3.28 M V 2 */
|
||||
ELEM_MAND_V(NAS_PDU_TYPE_EMM, DE_EMM_SHORT_MAC);
|
||||
|
||||
EXTRANEOUS_DATA_CHECK(curr_len, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
* 8.2.26 Tracking area update accept
|
||||
*/
|
||||
|
@ -3528,8 +3644,8 @@ static void (*nas_msg_emm_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offset
|
|||
nas_emm_attach_acc, /* Attach accept */
|
||||
nas_emm_attach_comp, /* Attach complete */
|
||||
nas_emm_attach_rej, /* Attach reject */
|
||||
NULL, /* Detach request */
|
||||
NULL, /* 8.2.10 Detach accept */
|
||||
nas_emm_detach_req, /* Detach request */
|
||||
NULL, /* 8.2.10 Detach accept */
|
||||
|
||||
nas_emm_trac_area_upd_req, /* Tracking area update request */
|
||||
nas_emm_trac_area_upd_acc, /* Tracking area update accept */
|
||||
|
@ -3761,6 +3877,11 @@ dissect_nas_eps(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
|
|||
return;
|
||||
}
|
||||
}else{
|
||||
/* SERVICE REQUEST (12) is not a plain NAS message treat separately */
|
||||
if (security_header_type == 12){
|
||||
nas_emm_service_req(tvb, tree, offset, len-offset);
|
||||
return;
|
||||
}
|
||||
/* Message authentication code */
|
||||
proto_tree_add_item(nas_eps_tree, hf_nas_eps_msg_auth_code, tvb, offset, 4, FALSE);
|
||||
offset+=4;
|
||||
|
@ -4296,6 +4417,21 @@ void proto_register_nas_eps(void) {
|
|||
FT_UINT8,BASE_DEC, NULL, 0x0,
|
||||
NULL, HFILL }
|
||||
},
|
||||
{ &hf_nas_eps_emm_switch_off,
|
||||
{ "Switch off","nas_eps.emm.switch_off",
|
||||
FT_UINT8,BASE_DEC, VALS(nas_eps_emm_switch_off_vals), 0x0,
|
||||
NULL, HFILL }
|
||||
},
|
||||
{ &hf_nas_eps_emm_detach_type_UL,
|
||||
{ "Detach Type","nas_eps.emm.detach_type_ul",
|
||||
FT_UINT8,BASE_DEC, VALS(nas_eps_emm_type_of_dtatch_UL_vals), 0x0,
|
||||
NULL, HFILL }
|
||||
},
|
||||
{ &hf_nas_eps_emm_detach_type_DL,
|
||||
{ "Detach Type","nas_eps.emm.detach_type_dl",
|
||||
FT_UINT8,BASE_DEC, VALS(nas_eps_emm_type_of_dtatch_DL_vals), 0x0,
|
||||
NULL, HFILL }
|
||||
},
|
||||
{ &hf_nas_eps_qci,
|
||||
{ "Quality of Service Class Identifier (QCI)","nas_eps.emm.qci",
|
||||
FT_UINT8,BASE_DEC, VALS(nas_eps_qci_vals), 0x0,
|
||||
|
|
|
@ -2462,7 +2462,6 @@ dissect_s1ap_TransportLayerAddress(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t
|
|||
}
|
||||
|
||||
|
||||
|
||||
return offset;
|
||||
}
|
||||
|
||||
|
@ -4699,6 +4698,11 @@ static const per_sequence_t DownlinkNASTransport_sequence[] = {
|
|||
|
||||
static int
|
||||
dissect_s1ap_DownlinkNASTransport(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
|
||||
#line 244 "s1ap.cnf"
|
||||
/* Set the direction of the message */
|
||||
actx->pinfo->link_dir=P2P_DIR_DL;
|
||||
|
||||
|
||||
offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
|
||||
ett_s1ap_DownlinkNASTransport, DownlinkNASTransport_sequence);
|
||||
|
||||
|
@ -4713,6 +4717,11 @@ static const per_sequence_t InitialUEMessage_sequence[] = {
|
|||
|
||||
static int
|
||||
dissect_s1ap_InitialUEMessage(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
|
||||
#line 240 "s1ap.cnf"
|
||||
/* Set the direction of the message */
|
||||
actx->pinfo->link_dir=P2P_DIR_UL;
|
||||
|
||||
|
||||
offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
|
||||
ett_s1ap_InitialUEMessage, InitialUEMessage_sequence);
|
||||
|
||||
|
@ -4727,6 +4736,11 @@ static const per_sequence_t UplinkNASTransport_sequence[] = {
|
|||
|
||||
static int
|
||||
dissect_s1ap_UplinkNASTransport(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
|
||||
#line 248 "s1ap.cnf"
|
||||
/* Set the direction of the message */
|
||||
actx->pinfo->link_dir=P2P_DIR_UL;
|
||||
|
||||
|
||||
offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
|
||||
ett_s1ap_UplinkNASTransport, UplinkNASTransport_sequence);
|
||||
|
||||
|
|
|
@ -320,6 +320,7 @@ dissect_packet(epan_dissect_t *edt, union wtap_pseudo_header *pseudo_header,
|
|||
edt->pi.sccp_info = NULL;
|
||||
edt->pi.clnp_srcref = 0;
|
||||
edt->pi.clnp_dstref = 0;
|
||||
edt->pi.link_dir = LINK_DIR_UNKNOWN;
|
||||
|
||||
EP_CHECK_CANARY(("before dissecting frame %d",fd->num));
|
||||
|
||||
|
|
|
@ -34,6 +34,11 @@
|
|||
#define P2P_DIR_SENT 0
|
||||
#define P2P_DIR_RECV 1
|
||||
|
||||
/* Link direction */
|
||||
#define LINK_DIR_UNKNOWN -1
|
||||
#define P2P_DIR_UL 0
|
||||
#define P2P_DIR_DL 1
|
||||
|
||||
#define PINFO_SOF_FIRST_FRAME 0x1
|
||||
#define PINFO_SOF_SOFF 0x2
|
||||
#define PINFO_EOF_LAST_FRAME 0x80
|
||||
|
@ -211,6 +216,9 @@ typedef struct _packet_info {
|
|||
guint8 zbee_stack_vers; /* ZigBee stack version number, present in the ZigBee network layer, but
|
||||
* impacts the packet format at all layers of the ZigBee stack.
|
||||
*/
|
||||
int link_dir; /* 3GPP messages are sometime different UP link(UL) or Downlink(DL)
|
||||
*
|
||||
*/
|
||||
} packet_info;
|
||||
|
||||
#endif /* __PACKET_INFO_H__ */
|
||||
|
|
Loading…
Reference in New Issue