17 #ifndef RAWSOCK_LAMP_H_INCLUDED 18 #define RAWSOCK_LAMP_H_INCLUDED 21 #include <linux/if_packet.h> 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 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 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) 88 typedef unsigned char byte_t;
void lampHeadPopulate(struct lamphdr *lampHeader, unsigned char ctrl, unsigned short id, unsigned short seq)
Populate a LaMP header.
void lampSetUnidirStop(struct lamphdr *lampHeader)
Set the control field of a LaMP header to "Unidirectional stop".
void lampEncapsulate(byte_t *packet, struct lamphdr *lampHeader, byte_t *data, size_t payloadsize)
Combine LaMP payload and header.
void lampHeadSetConnType(struct lamphdr *initLampHeader, uint16_t mode_index)
Set the INIT type field ("length or packet type") inside a LaMP header.
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...
void lampSetPinglikeEndreq(struct lamphdr *lampHeader)
Set the control field of a LaMP header to "Ping-like (bidirectional) end request".
protocol_t
Protocol type enumerator.
void lampHeadSetTimestamp(struct lamphdr *lampHeader, struct timeval *tStampPtr)
Set the timestamp inside a LaMP Header.
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.
void lampHeadIncreaseSeq(struct lamphdr *inpacket_headerptr)
Increase the sequence number inside a LaMP header.
void lampSetPinglikeEndreqTless(struct lamphdr *lampHeader)
Set the control field of a LaMP header to "Ping-like (bidirectional) end request (timestampless)".
Main LaMP packet header structure.
lamptype_t
LaMP type enumerator.
void lampHeadSetFollowupCtrlType(struct lamphdr *followupLampHeader, uint16_t followup_type)
Set the FOLLOWUP_CTRL type field ("length or packet type") inside a LaMP header.
byte_t * lampGetPacketPointers(byte_t *pktbuf, struct lamphdr **lampHeader)
Get pointers to header and payload in a LaMP packet.
void lampSetPinglikeEndreqAll(struct lamphdr *lampHeader)
Set the control field of a LaMP header to "Ping-like (bidirectional) end request".