Rawsock library  v0.3.4
Library to make the use of raw sockets easier, under Linux. Currently supporting IPv4, UDP and a custom latency measurement protocol (LaMP - supported both in raw and non-raw sockets).
rawsock_lamp.h
Go to the documentation of this file.
1 
17 #ifndef RAWSOCK_LAMP_H_INCLUDED
18 #define RAWSOCK_LAMP_H_INCLUDED
19 
20 #include "rawsock.h"
21 #include <linux/if_packet.h>
22 #include <sys/time.h>
23 
24 #define PROTO_LAMP 0xAA
25 #define PROTO_LAMP_CTRL_MASK 0xA0
27 #define CTRL_PINGLIKE_REQ 0xA0
28 #define CTRL_PINGLIKE_REPLY 0xA1
29 #define CTRL_PINGLIKE_ENDREQ 0xA2
30 #define CTRL_PINGLIKE_ENDREPLY 0xA3
31 #define CTRL_UNIDIR_CONTINUE 0xA4
32 #define CTRL_UNIDIR_STOP 0xA5
33 #define CTRL_UNIDIR_REPORT 0xA6
34 #define CTRL_ACK 0xA7
35 #define CTRL_CONN_INIT 0xA8
36 #define CTRL_PINGLIKE_REQ_TLESS 0xA9
37 #define CTRL_PINGLIKE_REPLY_TLESS 0xAA
38 #define CTRL_PINGLIKE_ENDREQ_TLESS 0xAB
39 #define CTRL_PINGLIKE_ENDREPLY_TLESS 0xAC
40 #define CTRL_FOLLOWUP_CTRL 0xAD
41 #define CTRL_FOLLOWUP_DATA 0xAE
43 // Follow-up types
44 #define FOLLOWUP_REQUEST 0x0000
45 #define FOLLOWUP_DENY 0x0100
46 #define FOLLOWUP_ACCEPT 0x0200
47 #define FOLLOWUP_UNKNOWN 0xFFFF
49 // Follow-up request types
50 #define FOLLOWUP_REQUEST_T_APP 0x0000
51 #define FOLLOWUP_REQUEST_T_KRN_RX 0x0001
52 #define FOLLOWUP_REQUEST_T_KRN 0x0002
53 #define FOLLOWUP_REQUEST_T_HW 0x0003
55 // Macro to check if a given "payload length or packet type" field, specified as 'idx', contains a valid FOLLOWUP_REQUEST or not, no matter the request type
56 #define IS_FOLLOWUP_REQUEST(lenortype_field) ((lenortype_field & 0xFF00)==0x0000)
58 // Macros that accounts for more than one packet at once (to be used inside if-else statements)
59 #define IS_CTRL_PINGLIKE_REQ(ctrl) (ctrl==CTRL_PINGLIKE_REQ || ctrl==CTRL_PINGLIKE_REQ_TLESS)
60 #define IS_CTRL_PINGLIKE_REPLY(ctrl) (ctrl==CTRL_PINGLIKE_REPLY || ctrl==CTRL_PINGLIKE_REPLY_TLESS)
61 #define IS_CTRL_PINGLIKE_ENDREQ(ctrl) (ctrl==CTRL_PINGLIKE_ENDREQ || ctrl==CTRL_PINGLIKE_ENDREQ_TLESS)
62 #define IS_CTRL_PINGLIKE_ENDREPLY(ctrl) (ctrl==CTRL_PINGLIKE_ENDREPLY || ctrl==CTRL_PINGLIKE_ENDREPLY_TLESS)
64 #define INIT_PINGLIKE_INDEX 0x0001
65 #define INIT_UNIDIR_INDEX 0x0002
67 #define IS_INIT_INDEX_VALID(idx) (idx == INIT_PINGLIKE_INDEX || idx == INIT_UNIDIR_INDEX)
68 #define IS_INIT(ctrl) (ctrl == CTRL_CONN_INIT)
69 #define IS_FOLLOWUP_CTRL(ctrl) (ctrl == CTRL_FOLLOWUP_CTRL)
70 #define IS_FOLLOWUP_CTRL_REQ_TYPE_VALID(idx) (idx == FOLLOWUP_REQUEST_T_APP || idx == FOLLOWUP_REQUEST_T_KRN_RX || idx == FOLLOWUP_REQUEST_T_KRN || idx == FOLLOWUP_REQUEST_T_HW || (idx >= 0x00F0 && idx<= 0x00FF))
71 #define IS_FOLLOWUP_CTRL_TYPE_VALID(idx) (idx == FOLLOWUP_REQUEST || idx == FOLLOWUP_DENY || idx == FOLLOWUP_ACCEPT || IS_FOLLOWUP_CTRL_REQ_TYPE_VALID(idx))
72 #define IS_UNIDIR(ctrl) (ctrl == CTRL_UNIDIR_CONTINUE || ctrl == CTRL_UNIDIR_STOP)
73 #define IS_PINGLIKE(ctrl) (ctrl == CTRL_PINGLIKE_REQ || ctrl == CTRL_PINGLIKE_REPLY || ctrl == CTRL_PINGLIKE_ENDREQ || ctrl == CTRL_PINGLIKE_ENDREPLY || ctrl == CTRL_PINGLIKE_REQ_TLESS || ctrl == CTRL_PINGLIKE_REPLY_TLESS || ctrl == CTRL_PINGLIKE_ENDREQ_TLESS || ctrl == CTRL_PINGLIKE_ENDREPLY_TLESS)
74 #define IS_LAMP(reserved, ctrl) (reserved==PROTO_LAMP && (ctrl & PROTO_LAMP_CTRL_MASK)==PROTO_LAMP_CTRL_MASK)
76 #define ETHERTYPE_LAMP ETH_P_802_EX1
77 #define MAX_LAMP_LEN (65535)
79 #define LAMP_HDR_PAYLOAD_SIZE_STR(data) sizeof(struct lamphdr)+strlen(data)
80 #define LAMP_HDR_PAYLOAD_SIZE(size) sizeof(struct lamphdr)+size
81 #define LAMP_HDR_SIZE() sizeof(struct lamphdr)
83 #define TYPE_TO_CTRL(field) (field | PROTO_LAMP_CTRL_MASK)
84 #define CTRL_TO_TYPE(field) (field & 0x0F)
86 #ifndef BYTE_TYPE
87 #define BYTE_TYPE
88 typedef unsigned char byte_t;
89 #endif
90 
99 typedef enum {
107  ACK,
115 } lamptype_t;
116 
132 typedef enum {
136 } endflag_t;
137 
147 struct lamphdr {
148  uint8_t reserved;
149  uint8_t ctrl;
150  uint16_t id;
151  uint16_t seq;
152  uint16_t len;
153  uint64_t sec;
154  uint64_t usec;
155 };
156 
157 void lampHeadPopulate(struct lamphdr *lampHeader, unsigned char ctrl, unsigned short id, unsigned short seq);
158 void lampHeadSetTimestamp(struct lamphdr *lampHeader, struct timeval *tStampPtr); // Sets the LaMP header timestamp (specify NULL as struct timeval *tStampPtr to use the current time instead of a custom timestamp) -> to be used with non-raw sockets, in which rawLampSend() cannot be used
159 void lampEncapsulate(byte_t *packet, struct lamphdr *lampHeader, byte_t *data, size_t payloadsize);
160 void lampSetUnidirStop(struct lamphdr *lampHeader);
161 void lampSetPinglikeEndreq(struct lamphdr *lampHeader);
162 void lampSetPinglikeEndreqTless(struct lamphdr *lampHeader);
163 void lampSetPinglikeEndreqAll(struct lamphdr *lampHeader);
164 void lampHeadSetConnType(struct lamphdr *initLampHeader, uint16_t mode_index);
165 void lampHeadSetFollowupCtrlType(struct lamphdr *followupLampHeader, uint16_t followup_type);
166 
167 void lampHeadIncreaseSeq(struct lamphdr *inpacket_headerptr);
168 int rawLampSend(int descriptor, struct sockaddr_ll addrll, struct lamphdr *inpacket_headerptr, byte_t *ethernetpacket, size_t finalpacketsize, endflag_t end_flag, protocol_t llprot);
169 
170 void lampHeadGetData(byte_t *lampPacket, lamptype_t *type, unsigned short *id, unsigned short *seq, unsigned short *len, struct timeval *timestamp, byte_t *payload);
171 byte_t *lampGetPacketPointers(byte_t *pktbuf,struct lamphdr **lampHeader);
172 #endif
void lampHeadPopulate(struct lamphdr *lampHeader, unsigned char ctrl, unsigned short id, unsigned short seq)
Populate a LaMP header.
Definition: rawsock_lamp.c:34
uint8_t reserved
Definition: rawsock_lamp.h:148
uint16_t len
Definition: rawsock_lamp.h:152
void lampSetUnidirStop(struct lamphdr *lampHeader)
Set the control field of a LaMP header to "Unidirectional stop".
Definition: rawsock_lamp.c:160
void lampEncapsulate(byte_t *packet, struct lamphdr *lampHeader, byte_t *data, size_t payloadsize)
Combine LaMP payload and header.
Definition: rawsock_lamp.c:246
void lampHeadSetConnType(struct lamphdr *initLampHeader, uint16_t mode_index)
Set the INIT type field ("length or packet type") inside a LaMP header.
Definition: rawsock_lamp.c:61
uint64_t sec
Definition: rawsock_lamp.h:153
uint8_t ctrl
Definition: rawsock_lamp.h:149
int rawLampSend(int descriptor, struct sockaddr_ll addrll, struct lamphdr *inpacket_headerptr, byte_t *ethernetpacket, size_t finalpacketsize, endflag_t end_flag, protocol_t llprot)
Send LaMP packet over a raw socket, automatically setting some fields such as the timestamp (when nee...
Definition: rawsock_lamp.c:276
void lampSetPinglikeEndreq(struct lamphdr *lampHeader)
Set the control field of a LaMP header to "Ping-like (bidirectional) end request".
Definition: rawsock_lamp.c:176
protocol_t
Protocol type enumerator.
Definition: rawsock.h:125
void lampHeadSetTimestamp(struct lamphdr *lampHeader, struct timeval *tStampPtr)
Set the timestamp inside a LaMP Header.
Definition: rawsock_lamp.c:109
void lampHeadGetData(byte_t *lampPacket, lamptype_t *type, unsigned short *id, unsigned short *seq, unsigned short *len, struct timeval *timestamp, byte_t *payload)
Extract relevant data from a LaMP packet.
Definition: rawsock_lamp.c:339
void lampHeadIncreaseSeq(struct lamphdr *inpacket_headerptr)
Increase the sequence number inside a LaMP header.
Definition: rawsock_lamp.c:137
void lampSetPinglikeEndreqTless(struct lamphdr *lampHeader)
Set the control field of a LaMP header to "Ping-like (bidirectional) end request (timestampless)".
Definition: rawsock_lamp.c:192
uint8_t byte_t
Definition: rawsock.h:102
Main LaMP packet header structure.
Definition: rawsock_lamp.h:147
uint16_t seq
Definition: rawsock_lamp.h:151
uint64_t usec
Definition: rawsock_lamp.h:154
uint16_t id
Definition: rawsock_lamp.h:150
lamptype_t
LaMP type enumerator.
Definition: rawsock_lamp.h:99
void lampHeadSetFollowupCtrlType(struct lamphdr *followupLampHeader, uint16_t followup_type)
Set the FOLLOWUP_CTRL type field ("length or packet type") inside a LaMP header.
Definition: rawsock_lamp.c:83
byte_t * lampGetPacketPointers(byte_t *pktbuf, struct lamphdr **lampHeader)
Get pointers to header and payload in a LaMP packet.
Definition: rawsock_lamp.c:383
void lampSetPinglikeEndreqAll(struct lamphdr *lampHeader)
Set the control field of a LaMP header to "Ping-like (bidirectional) end request".
Definition: rawsock_lamp.c:214
endflag_t
End flag type.
Definition: rawsock_lamp.h:132