Wireshark-users: Re: [Wireshark-users] Help on MAC-LTE Decoder
From: Madhur Raj N <madhurrajn@xxxxxxxxx>
Date: Tue, 29 Jun 2010 19:14:14 +0530
Attach mac-lte-logger.c. Missed in last email.
On 29 June 2010 19:08, Madhur Raj N <madhurrajn@xxxxxxxxx> wrote:
Hi Martin,
Thanks for the quick response. I have enabled heuristic MAC-LTE over UDP framing, as you have already mentioned in one of the previous list emails. under edit->preference->protocol->mac-lte. I am hereby attaching the pcap file, which I am trying to decode. Please let me know, if anything is missing.
I am using wireshark version 1.3.5.
Regards,
MadhurOn 29 June 2010 18:46, Martin Mathieson <martin.r.mathieson@xxxxxxxxxxxxxx> wrote:
On Tue, Jun 29, 2010 at 1:57 PM, Madhur Raj N <madhurrajn@xxxxxxxxx> wrote:
Hi,
I am trying to use MAC-LTE packet dissector on the eNodeB side. Currently I am finding difficulty in using it. I have gone through many of your support site but things are not looking good at my side.
This is what I have tried.
1. I do not have any catapult DCT2000. Hence I can not capture files in .out format.
2. I am using UDP packets to carry MAC-LTE frames.
OK, did you check the MAC-LTE protocol preference 'Try Heuristic MAC-LTE over UDP framing"?
3. As I can not decode the packets, I have added handler to get the option for " Decode As" inside proto_reg_handoff_mac_lte() function. With this I am able to find the "Decode As" option for MAC-LTE. But whence i try to decode, I am thrownwith following error:
"Can't dissect LTE MAC frame because no per-frame info was attached!"
The heuristic dissector parses the header, populates a struct with the given info and attaches it to the frame (for mac-lte).
If the heuristic dissector didn't match the frame, p_get_proto_data won't contain a filled-in struct.
Can you please help me, as why "p_get_proto_data" is throwing error.
4. Currently to bring up the setup, I am using the sample program "mac_lte_logger.c" file given at wireshark site to generate the packets.
Can you please also let me know any list where I can paste, it might be helpful for others too.
If you've tried the preference setting I mentioned above and its still not working, could you send me the captured file and I'll see what is going wrong with it?
Regards,
Martin
Regards,
Madhur
___________________________________________________________________________
Sent via: Wireshark-users mailing list <wireshark-users@xxxxxxxxxxxxx>
Archives: http://www.wireshark.org/lists/wireshark-users
Unsubscribe: https://wireshark.org/mailman/options/wireshark-users
mailto:wireshark-users-request@xxxxxxxxxxxxx?subject=unsubscribe
___________________________________________________________________________
Sent via: Wireshark-users mailing list <wireshark-users@xxxxxxxxxxxxx>
Archives: http://www.wireshark.org/lists/wireshark-users
Unsubscribe: https://wireshark.org/mailman/options/wireshark-users
mailto:wireshark-users-request@xxxxxxxxxxxxx?subject=unsubscribe
/* mac_lte_logger.c * * Example code for sending MAC LTE frames over UDP * Written by Martin Mathieson, with input from Kiran Kumar * This header file may also be distributed under * the terms of the BSD Licence as follows: * * Copyright (C) 2009 Martin Mathieson. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE */ #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <unistd.h> typedef unsigned char guint8; typedef unsigned short guint16; typedef unsigned int guint32; #include "packet-mac-lte.h" /* Globals where each frame is composed before sending */ static unsigned char g_PDUBuffer[16000]; static unsigned int g_PDUOffset; static unsigned char g_frameBuffer[16000]; static unsigned int g_frameOffset; /* UDP socket used for sending frames */ static int g_sockfd; /* Remote serveraddress (where Wireshark is running) */ static struct sockaddr_in g_serv_addr; /* Compilation MADHUR */ #define MAC_LTE_START_STRING "" #define MAC_LTE_RNTI_TAG 1 #define MAC_LTE_UEID_TAG 1 #define MAC_LTE_SUBFRAME_TAG 1 #define MAC_LTE_CRC_STATUS_TAG 1 #define MAC_LTE_PREDFINED_DATA_TAG 1 #define MAC_LTE_RETX_TAG 1 #define MAC_LTE_PAYLOAD_TAG 1 /* Write an RAR PDU */ static void EncodeDummyMACPDU1(void) { g_PDUOffset = 0; /* RAR */ g_PDUBuffer[g_PDUOffset++] = 0x40; g_PDUBuffer[g_PDUOffset++] = 0x00; g_PDUBuffer[g_PDUOffset++] = 0x00; g_PDUBuffer[g_PDUOffset++] = 0xdc; g_PDUBuffer[g_PDUOffset++] = 0x0c; g_PDUBuffer[g_PDUOffset++] = 0x21; g_PDUBuffer[g_PDUOffset++] = 0x21; } /* Write an uplink PDU (with dummy CCCH payload)*/ static void EncodeDummyMACPDU2(void) { g_PDUOffset = 0; /* RAR */ g_PDUBuffer[g_PDUOffset++] = 0x3f; g_PDUBuffer[g_PDUOffset++] = 0x3f; g_PDUBuffer[g_PDUOffset++] = 0x00; g_PDUBuffer[g_PDUOffset++] = 0xa5; g_PDUBuffer[g_PDUOffset++] = 0xa5; g_PDUBuffer[g_PDUOffset++] = 0xa5; g_PDUBuffer[g_PDUOffset++] = 0x79; g_PDUBuffer[g_PDUOffset++] = 0x79; g_PDUBuffer[g_PDUOffset++] = 0x41; g_PDUBuffer[g_PDUOffset++] = 0x41; g_PDUBuffer[g_PDUOffset++] = 0x36; g_PDUBuffer[g_PDUOffset++] = 0x36; g_PDUBuffer[g_PDUOffset++] = 0x36; } /* Write a (dummy) BCH PDU */ static void EncodeDummyMACPDU3(void) { g_PDUOffset = 0; /* BCH (nonsense data) */ g_PDUBuffer[g_PDUOffset++] = 0x00; g_PDUBuffer[g_PDUOffset++] = 0x00; g_PDUBuffer[g_PDUOffset++] = 0x00; } /*******************************************/ /* Add framing header to MAC PDU and send. */ void SendFrame(guint8 radioType, guint8 direction, guint8 rntiType, guint16 rnti, guint16 ueid, guint16 subframeNumber, guint8 isPredefinedData, guint8 retx, guint8 crcStatus) { ssize_t bytesSent; g_frameOffset = 0; unsigned short tmp16; /********************************************************************/ /* Fixed start to each frame (allowing heuristic dissector to work) */ /* Not NULL terminated */ memcpy(g_frameBuffer+g_frameOffset, MAC_LTE_START_STRING, strlen(MAC_LTE_START_STRING)); g_frameOffset += strlen(MAC_LTE_START_STRING); /******************************************************************************/ /* Now write out fixed fields (the mandatory elements of struct mac_lte_info) */ g_frameBuffer[g_frameOffset++] = radioType; g_frameBuffer[g_frameOffset++] = direction; g_frameBuffer[g_frameOffset++] = rntiType; /*************************************/ /* Now optional fields */ /* RNTI */ g_frameBuffer[g_frameOffset++] = MAC_LTE_RNTI_TAG; tmp16 = htons(rnti); memcpy(g_frameBuffer+g_frameOffset, &tmp16, 2); g_frameOffset += 2; /* UEId */ g_frameBuffer[g_frameOffset++] = MAC_LTE_UEID_TAG; tmp16 = htons(ueid); memcpy(g_frameBuffer+g_frameOffset, &tmp16, 2); g_frameOffset += 2; /* Subframe number */ g_frameBuffer[g_frameOffset++] = MAC_LTE_SUBFRAME_TAG; tmp16 = htons(ueid); memcpy(g_frameBuffer+g_frameOffset, &tmp16, 2); g_frameOffset += 2; g_frameBuffer[g_frameOffset++] = MAC_LTE_CRC_STATUS_TAG; g_frameBuffer[g_frameOffset++] = crcStatus; /***********************************************************/ /* For these optional fields, no need to encode if value is default */ if (!isPredefinedData) { g_frameBuffer[g_frameOffset++] = MAC_LTE_PREDFINED_DATA_TAG; g_frameBuffer[g_frameOffset++] = isPredefinedData; } if (retx != 0) { g_frameBuffer[g_frameOffset++] = MAC_LTE_RETX_TAG; g_frameBuffer[g_frameOffset++] = retx; } /***************************************/ /* Now write the MAC PDU */ g_frameBuffer[g_frameOffset++] = MAC_LTE_PAYLOAD_TAG; /* Append actual PDU */ memcpy(g_frameBuffer+g_frameOffset, g_PDUBuffer, g_PDUOffset); g_frameOffset += g_PDUOffset; /* Send out the data over the UDP socket */ bytesSent = sendto(g_sockfd, g_frameBuffer, g_frameOffset, 0, (const struct sockaddr*)&g_serv_addr, sizeof(g_serv_addr)); if (bytesSent != g_frameOffset) { fprintf(stderr, "sendto() failed - expected %d bytes, got %d (errno=%d)\n", g_frameOffset, bytesSent, errno); exit(1); } } /*************************************************************************/ /* Main function */ /* - set up socket + aserver address */ /* - encode and send some example LTE MAC frames using framing protocol */ int main(int argc, char *argv[]) { struct hostent *hp; if (argc < 3) { fprintf(stderr, "Usage: coclient <server-host> <server-port>\n"); exit(1); } /***********************************/ /* Create local socket */ g_sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (g_sockfd == -1) { fprintf(stderr, "Error trying to create socket (errno=%d)\n", errno); exit(1); } /***************************************************/ /* Get remote IP address from 1st command-line arg */ g_serv_addr.sin_family = AF_INET; hp = gethostbyname(argv[1]); if (hp == (struct hostent *)0) { fprintf(stderr, "Unknown host %s (h_errno=%d)\n", argv[1], h_errno); exit(1); } memcpy((void*)&g_serv_addr.sin_addr, (void*)hp->h_addr, hp->h_length); /****************************************************/ /* Get remote port number from 2nd command-line arg */ g_serv_addr.sin_port = htons(atoi(argv[2])); /****************************************************/ /* Encode and send some frames */ EncodeDummyMACPDU1(); SendFrame(FDD_RADIO, DIRECTION_DOWNLINK, RA_RNTI, 1 /* RNTI */, 101 /* UEId */, 1 /* Subframe number */, 0 /* isPredefined */, 0 /* retx */, 1 /* CRCStatus (i.e. OK) */); EncodeDummyMACPDU2(); SendFrame(FDD_RADIO, DIRECTION_UPLINK, C_RNTI, 50 /* RNTI */, 101 /* UEId */, 2 /* Subframe number */, 0 /* isPredefined */, 1 /* retx */, 1 /* CRCStatus (i.e. OK) */); EncodeDummyMACPDU3(); SendFrame(FDD_RADIO, DIRECTION_DOWNLINK, NO_RNTI, 0 /* RNTI */, 0 /* UEId */, 3 /* Subframe number */, 0 /* isPredefined */, 0 /* retx */, 0 /* CRCStatu (i.e. CRC error) */); /* Close local socket */ close(g_sockfd); return EXIT_SUCCESS; }
- Follow-Ups:
- Re: [Wireshark-users] Help on MAC-LTE Decoder
- From: Martin Mathieson
- Re: [Wireshark-users] Help on MAC-LTE Decoder
- References:
- [Wireshark-users] Help on MAC-LTE Decoder
- From: Madhur Raj N
- Re: [Wireshark-users] Help on MAC-LTE Decoder
- From: Martin Mathieson
- Re: [Wireshark-users] Help on MAC-LTE Decoder
- From: Madhur Raj N
- [Wireshark-users] Help on MAC-LTE Decoder
- Prev by Date: Re: [Wireshark-users] Help on MAC-LTE Decoder
- Next by Date: Re: [Wireshark-users] Help on MAC-LTE Decoder
- Previous by thread: Re: [Wireshark-users] Help on MAC-LTE Decoder
- Next by thread: Re: [Wireshark-users] Help on MAC-LTE Decoder
- Index(es):