Skip to content

Commit

Permalink
LRTS: Slightly improve type safety of DgramHeader
Browse files Browse the repository at this point in the history
  • Loading branch information
evan-charmworks committed Jul 6, 2023
1 parent a2690bb commit fe3889d
Show file tree
Hide file tree
Showing 5 changed files with 19 additions and 33 deletions.
14 changes: 5 additions & 9 deletions src/arch/netlrts/machine-dgram.C
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,6 @@
* @{
*/

#define DGRAM_HEADER_SIZE 8

#define CmiMsgNext(msg) (*((void**)(msg)))

#define DGRAM_ROOTPE_MASK (0xFFFFu)
#define DGRAM_SRCPE_MASK (0xFFFF)
#define DGRAM_MAGIC_MASK (0xFF)
Expand All @@ -43,14 +39,17 @@ typedef struct {
unsigned int rootpe:16; /* broadcast root processor */
} DgramHeader;

#define DGRAM_HEADER_SIZE (sizeof(DgramHeader))
static_assert(DGRAM_HEADER_SIZE == 4 * sizeof(uint16_t),
"DgramHeader must be equivalent to 4x uint16_t");

/* the window size needs to be Cmi_window_size + sizeof(unsigned int) bytes) */
typedef struct { DgramHeader head; char window[1024]; } DgramAck;

unsigned char computeCheckSum(unsigned char *data, int len);

#define DgramHeaderMake(ptr, dstrank_, srcpe_, magic_, seqno_, root_) { \
DgramHeader *header = (DgramHeader *)(ptr); \
DgramHeader * header = (ptr); \
header->seqno = seqno_; \
header->srcpe = srcpe_; \
header->dstrank = dstrank_; \
Expand All @@ -59,7 +58,7 @@ unsigned char computeCheckSum(unsigned char *data, int len);
}

#define DgramHeaderBreak(ptr, dstrank_, srcpe_, magic_, seqno_, root_) { \
DgramHeader *header = (DgramHeader *)(ptr); \
const DgramHeader * header = (ptr); \
seqno_ = header->seqno; \
srcpe_ = header->srcpe; \
dstrank_ = header->dstrank; \
Expand Down Expand Up @@ -155,9 +154,6 @@ static void extract_args(char **argv)
Cmi_comm_periodic_delay=(int)(1000*Cmi_delay_retransmit);
if (Cmi_comm_periodic_delay>60) Cmi_comm_periodic_delay=60;
Cmi_comm_clock_delay=(int)(1000*Cmi_ack_delay);
if (sizeof(DgramHeader)!=DGRAM_HEADER_SIZE) {
CmiAbort("DatagramHeader in machine-dgram.C is the wrong size!\n");
}
}


Expand Down
9 changes: 3 additions & 6 deletions src/arch/netlrts/machine-eth.C
Original file line number Diff line number Diff line change
Expand Up @@ -115,12 +115,10 @@ void TransmitAckDatagram(OtherNode node)
{
DgramAck ack; int i, seqno, slot; ExplicitDgram dg;
int retval;

DgramHeader *head;

seqno = node->recv_next;
MACHSTATE2(3," TransmitAckDgram [seq %d to 'pe' %d]",seqno,node->nodestart)
DgramHeaderMake(&ack, DGRAM_ACKNOWLEDGE, Cmi_nodestartGlobal, Cmi_net_magic, seqno, 0);
DgramHeaderMake(&ack.head, DGRAM_ACKNOWLEDGE, Cmi_nodestartGlobal, Cmi_net_magic, seqno, 0);
LOG(Cmi_clock, Cmi_nodestartGlobal, 'A', node->nodestart, seqno);
for (i=0; i<Cmi_window_size; i++) {
slot = seqno % Cmi_window_size;
Expand All @@ -133,8 +131,7 @@ void TransmitAckDatagram(OtherNode node)
node->send_ack_seqno = ((node->send_ack_seqno + 1) & DGRAM_SEQNO_MASK);
retval = (-1);
#if CMK_ERROR_CHECKING
head = (DgramHeader *)(&ack);
head->magic ^= computeCheckSum((unsigned char*)&ack, DGRAM_HEADER_SIZE + Cmi_window_size + sizeof(unsigned int));
ack.head.magic ^= computeCheckSum((unsigned char*)&ack, DGRAM_HEADER_SIZE + Cmi_window_size + sizeof(unsigned int));
#endif
while(retval==(-1))
retval = sendto(dataskt, (char *)&ack,
Expand Down Expand Up @@ -654,7 +651,7 @@ void ReceiveDatagram(void)
#endif

if (ok >= DGRAM_HEADER_SIZE) {
DgramHeaderBreak(dg->data, dg->rank, dg->srcpe, magic, dg->seqno, dg->broot);
DgramHeaderBreak((const DgramHeader *)dg->data, dg->rank, dg->srcpe, magic, dg->seqno, dg->broot);
MACHSTATE3(2," recv dgram [seq %d, for rank %d, from pe %d]",
dg->seqno,dg->rank,dg->srcpe)
#if CMK_ERROR_CHECKING
Expand Down
2 changes: 1 addition & 1 deletion src/arch/netlrts/machine-tcp.C
Original file line number Diff line number Diff line change
Expand Up @@ -315,7 +315,7 @@ static void IntegrateMessageDatagram(char **msg, int len)
int size;

if (len >= DGRAM_HEADER_SIZE) {
DgramHeaderBreak(*msg, rank, srcpe, magic, seqno, broot);
DgramHeaderBreak((const DgramHeader *)*msg, rank, srcpe, magic, seqno, broot);
if (magic == (Cmi_charmrun_pid&DGRAM_MAGIC_MASK)) {
OtherNode node = nodes_by_pe[srcpe];
newmsg = node->asm_msg;
Expand Down
17 changes: 5 additions & 12 deletions src/arch/verbs/machine-dgram.C
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,6 @@
#include <infiniband/verbs.h>
#endif

#define DGRAM_HEADER_SIZE 8

#define CmiMsgNext(msg) (*((void**)(msg)))

#define DGRAM_ROOTPE_MASK (0xFFFFu)
#define DGRAM_SRCPE_MASK (0xFFFF)
#define DGRAM_MAGIC_MASK (0xFF)
Expand All @@ -48,14 +44,14 @@ typedef struct {
unsigned int rootpe:16; /* broadcast root processor */
} DgramHeader;


/* the window size needs to be Cmi_window_size + sizeof(unsigned int) bytes) */
typedef struct { DgramHeader head; char window[1024]; } DgramAck;
#define DGRAM_HEADER_SIZE (sizeof(DgramHeader))
static_assert(DGRAM_HEADER_SIZE == 4 * sizeof(uint16_t),
"DgramHeader must be equivalent to 4x uint16_t");

unsigned char computeCheckSum(unsigned char *data, int len);

#define DgramHeaderMake(ptr, dstrank_, srcpe_, magic_, seqno_, root_) { \
DgramHeader *header = (DgramHeader *)(ptr); \
DgramHeader * header = (ptr); \
header->seqno = seqno_; \
header->srcpe = srcpe_; \
header->dstrank = dstrank_; \
Expand All @@ -64,7 +60,7 @@ unsigned char computeCheckSum(unsigned char *data, int len);
}

#define DgramHeaderBreak(ptr, dstrank_, srcpe_, magic_, seqno_, root_) { \
DgramHeader *header = (DgramHeader *)(ptr); \
const DgramHeader * header = (ptr); \
seqno_ = header->seqno; \
srcpe_ = header->srcpe; \
dstrank_ = header->dstrank; \
Expand Down Expand Up @@ -160,9 +156,6 @@ static void extract_args(char **argv)
Cmi_comm_periodic_delay=(int)(1000*Cmi_delay_retransmit);
if (Cmi_comm_periodic_delay>60) Cmi_comm_periodic_delay=60;
Cmi_comm_clock_delay=(int)(1000*Cmi_ack_delay);
if (sizeof(DgramHeader)!=DGRAM_HEADER_SIZE) {
CmiAbort("DatagramHeader in machine-dgram.C is the wrong size!\n");
}
}


Expand Down
10 changes: 5 additions & 5 deletions src/arch/verbs/machine-ibverbs.C
Original file line number Diff line number Diff line change
Expand Up @@ -1302,7 +1302,7 @@ void DeliverViaNetwork(OutgoingMsg ogm, OtherNode node, int rank, unsigned int b
MACHSTATE3(3,"Sending ogm %p of size %d to %d",ogm,size,node->infiData->nodeNo);
//First packet has dgram header, other packets dont

DgramHeaderMake(data, rank, ogm->src, Cmi_charmrun_pid, 1, broot);
DgramHeaderMake((DgramHeader *)data, rank, ogm->src, Cmi_charmrun_pid, 1, broot);

CMI_MSG_SIZE(ogm->data)=ogm->size;

Expand Down Expand Up @@ -1690,8 +1690,8 @@ static inline void processMessage(int nodeNo,int len,char *msg,const int toBuffe
{
int size;
int rank, srcpe, seqno, magic, i;
unsigned int broot;
DgramHeaderBreak(msg, rank, srcpe, magic, seqno, broot);
int broot;
DgramHeaderBreak((const DgramHeader *)msg, rank, srcpe, magic, seqno, broot);
size = CMI_MSG_SIZE(msg);
MACHSTATE2(3,"START of a new message from node %d of total size %d",nodeNo,size);
// CmiAssert(size > 0);
Expand Down Expand Up @@ -2096,9 +2096,9 @@ static inline void processRdmaWC(struct ibv_wc *rdmaWC,const int toBuffer){
{
int size;
int rank, srcpe, seqno, magic, i;
unsigned int broot;
int broot;
char *msg = buffer->buf;
DgramHeaderBreak(msg, rank, srcpe, magic, seqno, broot);
DgramHeaderBreak((const DgramHeader *)msg, rank, srcpe, magic, seqno, broot);
size = CMI_MSG_SIZE(msg);
/* CmiAssert(size == buffer->size);*/
handoverMessage(buffer->buf,size,rank,broot,toBuffer);
Expand Down

0 comments on commit fe3889d

Please sign in to comment.