uhd/tools/uhd_dump/uhd_dump.h
2014-04-21 13:52:10 -07:00

252 lines
5.7 KiB
C

//
// Copyright 2013-2014 Ettus Research LLC
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
#ifndef _UHD_DUMP_H_
#define _UHD_DUMP_H_
#define FALSE 0
#define TRUE 1
#define UNKNOWN 2
// Define directions for Host->USRP & USRP->Host
#define H2U 0
#define U2H 1
// Endpoint encodings for USRP3 from SID LSB's
#define RADIO 0
#define RADIO_CTRL 1
#define SRC_FLOW_CTRL 2
#define RESERVED 3
/* // VRT Type definitions */
/* #define IF_DATA_NO_SID 0 */
/* #define IF_DATA_WITH_SID 1 */
/* #define EXT_DATA_NO_SID 2 */
/* #define EXT_DATA_WITH_SID 3 */
/* #define IF_CONTEXT 4 */
/* #define EXT_CONTEXT 5 */
// CHDR bit masks
#define EXT_CONTEXT 1<<31
#define HAS_TIME 1<<29
#define EOB 1<<28
#define SIZE (1<<16)-1
// UDP used as source for all CHDR comms.
#define CHDR_PORT 49153
typedef unsigned char bool;
typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned int u32;
typedef unsigned long u64;
union ip_addr_decoder {
unsigned long s_addr;
unsigned char octet[4];
};
/*
Ethernet header structure
*/
struct ethernet_header {
u8 eth_dst[6]; // MAC addr of destination
u8 eth_src[6]; // MAC addr of source
u16 eth_typ; // Payload protocol type
};
#define ETH_SIZE 14
/*
IP Header strcture
NOTE: Network byte order (Big Endian)
*/
struct ip_header {
u8 ip_vhl; // [7:4] Version, [3:0] Header Length
u8 ip_tos; // Type of Service/DIff Serv/ECN
u16 ip_len; // Total Length
u16 ip_id; // Identification
u16 ip_off; // [15:14] Flags, [13:0] Fragment Offset
u8 ip_ttl; // Time To Live
u8 ip_pro; // Protocol
u16 ip_sum; // Checksum
struct in_addr ip_src; // IP Source address
struct in_addr ip_dst; // IP Destination address
};
#define IP_SIZE 20
/*
UDP Header Structure
NOTE: Network byte order (Big Endian)
*/
struct udp_header {
u16 udp_src; // Source Port
u16 udp_dst; // Destination Port
u16 udp_len; // Length
u16 udp_sum; // Checksum
};
#define UDP_SIZE 8
/* /\* */
/* VITA49 VRLP Header */
/* NOTE: Network byte order (Big Endian) */
/* *\/ */
/* struct vrlp_header { */
/* u32 vrlp_start; // Hardcoded to ASCII "VRLP" */
/* u32 vrlp_size; // [31:20] Frame Count, [19:0] Frame Size */
/* }; */
/* #define VRLP_SIZE 8 */
/* #define VRLP_SEQID(x) (((x & 0xff)<<4) | ((x & 0xf000) >> 12)) */
/* /\* */
/* VITA49 VRLP Trailer */
/* NOTE: Network byte order (Big Endian) */
/* *\/ */
/* struct vrlp_trailer { */
/* u32 vrlp_end; // Hardcoded to ASCII "VEND" */
/* }; */
/* #define VRLP_TRAILER_SIZE 4 */
/* /\* */
/* VITA49 VRT Header */
/* NOTE: Network byte order (Big Endian) */
/* *\/ */
/* struct vrt_header { */
/* u8 vrt_type; // [7:4] type, [3] Class ID flag, [2] Trailer flag, [1] SOB, [0] EOB */
/* u8 vrt_count; // [7:6] TSI, [5:4] TSF, [3:0] Packet Count modulo 16 */
/* u16 vrt_size; // Number of 32bit words in VRT packet including headers and payload. */
/* u32 vrt_sid; // Stream ID */
/* }; */
/* #define VRT_SIZE 8 */
/*
Ettus Research CHDR header
NOTE: Little endian byte order (must be unswizzled)
*/
struct chdr_header {
u32 chdr_type;// [31] Ext Context, [30] RSVD, [29] Has_time, [28] EOB], [27:16] SEQ_ID, [15:0] Size
u32 chdr_sid; // Stream ID
};
#define CHDR_SIZE 8
/*
Break down SID into CHDR defined fields
*/
struct chdr_sid {
u8 src_device;
u8 src_endpoint;
u8 dst_device;
u8 dst_endpoint;
};
struct radio_ctrl_payload {
u32 addr;
u32 data;
};
struct radio_response {
u64 data;
};
struct tx_response {
u32 error_code;
u32 seq_id;
};
#define TX_ACK 0x00
#define TX_EOB 0x01
#define TX_UNDERRUN 0x02
#define TX_SEQ_ERROR 0x04
#define TX_TIME_ERROR 0x08
#define TX_MIDBURST_SEQ_ERROR 0x20
struct src_flow_ctrl {
u32 unused;
u32 seq_id;
};
struct vita_time {
u64 time;
};
#define VITA_TIME_SIZE 8
#define RADIO_CTRL_SIZE 8
#define RADIO_RESPONSE_SIZE 4
/*
Packet storage
*/
struct pbuf {
struct pbuf *next;
struct pbuf *last;
struct timeval ts;
int size; // Size stored in pcap file
int orig_size; // Original capture size on the wire
char *payload;
};
struct pbuf_info {
struct pbuf *start;
struct pbuf *current;
struct pbuf *end;
};
struct radio_ctrl_names {
u32 addr;
char *name;
};
//
// Prototypes
//
unsigned long swaplong (unsigned long);
unsigned int swapint (unsigned int);
unsigned short swapshort (unsigned short);
char *format_gmt(const struct timeval *, char *);
double timeval2double(struct timeval *);
double relative_time(struct timeval *, struct timeval *);
void get_packet(struct pbuf_info * , const struct pcap_pkthdr *, const u_char *);
void get_start_time(struct timeval * , const struct pcap_pkthdr *, const u_char *);
void get_udp_port_from_file(u16, const char *, struct pbuf_info *, struct timeval *);
void get_everything_from_file(const char *, struct pbuf_info *, struct timeval *);
void get_connection_endpoints( struct pbuf_info *, struct in_addr *, struct in_addr *);
void print_direction(const struct pbuf_info *, const struct in_addr *, const struct in_addr *);
void print_size( const struct pbuf_info *);
void print_sid( const struct pbuf_info *);
void print_vita_header( const struct pbuf_info *, const struct in_addr *);
#endif