Handling the arrival of new physical frames
EVENT_HANDLER(physical_ready)
{
FRAME f;
size_t len;
int link, checksum;
len = sizeof(FRAME);
CHECK(CNET_read_physical(&link, &f, &len));
checksum = f.checksum;
f.checksum = 0;
if(CNET_ccitt((unsigned char *)&f, (int)len) != checksum) {
printf("\t\t\t\tBAD checksum - frame ignored\n");
return; // bad checksum, ignore frame
}
switch(f.kind) {
case DL_ACK : {
if(f.seq == ackexpected) {
printf("\t\t\t\tACK received, seq=%d\n", f.seq);
CNET_stop_timer(lasttimer);
ackexpected = 1-ackexpected;
CNET_enable_application(ALLNODES);
}
break;
}
case DL_DATA : {
printf("\t\t\t\tDATA received, seq=%d, ", f.seq);
if(f.seq == dataexpected) {
printf("up to application\n");
len = f.len;
CHECK(CNET_write_application(&f.msg, &len));
dataexpected = 1-dataexpected;
}
else
printf("ignored\n");
transmit_frame((MSG *)NULL, DL_ACK, 0, f.seq);
break;
}
}
}
|
There it is; a complete stop-and-wait Datalink Layer protocol,
addressing frame corruption and loss between two nodes.
CITS3002 Computer Networks, Lecture 3, Data Link Layer protocols, p21, 13th March 2024.
|