36 lampHeader->
ctrl=(uint8_t) ctrl;
37 lampHeader->
id=htons(
id);
38 lampHeader->
seq=htons(seq);
64 initLampHeader->
len=htons(mode_index);
86 followupLampHeader->
len=htons(followup_type);
110 struct timeval currtime;
113 if(tStampPtr==NULL) {
114 gettimeofday(&currtime,NULL);
116 lampHeader->
sec=
hton64((uint64_t) currtime.tv_sec);
117 lampHeader->
usec=
hton64((uint64_t) currtime.tv_usec);
119 lampHeader->
sec=
hton64((uint64_t) tStampPtr->tv_sec);
120 lampHeader->
usec=
hton64((uint64_t) tStampPtr->tv_usec);
138 uint16_t seq=htons(inpacket_headerptr->
seq);
140 if(inpacket_headerptr->
seq==UINT16_MAX) {
145 inpacket_headerptr->
seq=ntohs(seq);
247 lampHeader->
len=htons(payloadsize);
249 memcpy(packet,lampHeader,
sizeof(
struct lamphdr));
250 memcpy(packet+
sizeof(
struct lamphdr),data,payloadsize);
277 struct timeval currtime;
278 struct udphdr *inpacket_headerptr_udp;
279 struct iphdr *inpacket_headerptr_ipv4;
293 gettimeofday(&currtime,NULL);
295 inpacket_headerptr->
sec=
hton64((uint64_t) currtime.tv_sec);
296 inpacket_headerptr->
usec=
hton64((uint64_t) currtime.tv_usec);
303 inpacket_headerptr_udp=(
struct udphdr *) ((
byte_t *)inpacket_headerptr-
sizeof(
struct udphdr));
305 inpacket_headerptr_ipv4=(
struct iphdr *) ((
byte_t *)inpacket_headerptr_udp-
sizeof(
struct iphdr));
307 inpacket_headerptr_udp->check=0;
309 packetsize=
sizeof(
struct udphdr)+LAMP_HDR_SIZE();
311 packetsize=
sizeof(
struct udphdr)+LAMP_HDR_PAYLOAD_SIZE(ntohs(inpacket_headerptr->len));
314 inpacket_headerptr_udp->check=
minirighi_udp_checksum(inpacket_headerptr_udp,packetsize,inpacket_headerptr_ipv4->saddr,inpacket_headerptr_ipv4->daddr);
320 return (sendto(descriptor,ethernetpacket,finalpacketsize,0,(
struct sockaddr *)&addrll,
sizeof(
struct sockaddr_ll))!=finalpacketsize);
343 if(type) *type=(lampHeader->
ctrl) & 0x0F;
344 if(
id) *
id=ntohs(lampHeader->
id);
345 if(seq) *seq=ntohs(lampHeader->
seq);
346 if(len) *len=ntohs(lampHeader->
len);
348 timestamp->tv_sec=(time_t)
ntoh64(lampHeader->
sec);
349 timestamp->tv_usec=(suseconds_t)
ntoh64(lampHeader->
usec);
352 if(payload && lampHeader->
len!=0x00) {
353 memcpy(payload,payloadptr,lampHeader->
len);
386 *lampHeader=(
struct lamphdr*) pktbuf;
387 payload=pktbuf+
sizeof(
struct lamphdr);
void lampHeadPopulate(struct lamphdr *lampHeader, unsigned char ctrl, unsigned short id, unsigned short seq)
Populate a LaMP header.
#define CTRL_PINGLIKE_REQ_TLESS
#define CTRL_FOLLOWUP_CTRL
#define CTRL_PINGLIKE_ENDREPLY_TLESS
void lampSetUnidirStop(struct lamphdr *lampHeader)
Set the control field of a LaMP header to "Unidirectional stop".
#define IS_INIT_INDEX_VALID(idx)
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.
uint64_t ntoh64(uint64_t netu64)
Convert a 64-bit unsigned value between network and host byte order.
#define IS_FOLLOWUP_CTRL_TYPE_VALID(idx)
#define IS_FOLLOWUP_CTRL(ctrl)
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...
uint64_t hton64(uint64_t hostu64)
Convert a 64-bit unsigned value between host and network byte order.
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.
#define CTRL_PINGLIKE_REQ
#define IS_PINGLIKE(ctrl)
uint16_t minirighi_udp_checksum(const void *buff, size_t len, in_addr_t src_addr, in_addr_t dest_addr)
Calculate the UDP checksum (calculated with the whole packet)
#define CTRL_PINGLIKE_REPLY_TLESS
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.
#define CTRL_PINGLIKE_ENDREQ
#define CTRL_PINGLIKE_ENDREQ_TLESS
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".