47#define DEFAULT_DUMMY_CONTENT_LENGTH 256
53#define BARR_ELBITS (CHAR_BIT * sizeof(BARR_ELTYPE))
60#define BARR_ARRAYSIZE(N) (((N) + BARR_ELBITS - 1) / BARR_ELBITS)
67#define BARR_ELNUM(N) ((N) / BARR_ELBITS)
74#define BARR_BITNUM(N) ((N) % BARR_ELBITS)
81#define BARR_SET(barr, N) \
82 (((BARR_ELTYPE *) (barr))[BARR_ELNUM(N)] |= (BARR_ELTYPE) 1 \
90#define BARR_CLEAR(barr, N) \
91 (((BARR_ELTYPE *) (barr))[BARR_ELNUM(N)] &= \
92 ~((BARR_ELTYPE) 1 << BARR_BITNUM(N)))
99#define BARR_TEST(barr, N) \
100 (((BARR_ELTYPE *) (barr))[BARR_ELNUM(N)] & \
101 ((BARR_ELTYPE) 1 << BARR_BITNUM(N)))
110 : TclClass(
"UW/AL/Packer")
117 return (
new packer(
true));
144 std::cout <<
"Initialization (from constructor) of n_bits for the "
167 std::cout <<
"Re-initialization of n_bits for the UWAL packer "
184 if (strcmp(argv[1],
"packerInit") == 0) {
189 if (strcmp(argv[1],
"printMap") == 0) {
193 if (strcmp(argv[1],
"printAllFields") == 0) {
200 if (strcmp(argv[1],
"addPacker") == 0) {
204 std::cout <<
"Packer added, current payload length: "
206 <<
" [Bytes]. Corresponding MAP: " << std::endl;
212 return TclObject::command(argc, argv);
218 size_t PayloadBinLength = 0;
219 for (std::vector<packer *>::iterator it =
activePackers.begin();
222 PayloadBinLength += (*it)->getMyHdrBinLength();
224 return PayloadBinLength;
236 unsigned char *buf =
new unsigned char[
hdr_length];
253 std::cout <<
"\033[0;0;31m"
255 <<
"\033[0m" << std::endl;
257 cout <<
"in packer::packHdr -> pkt size set to: "
259 <<
", whilst header length is: " <<
hdr_length
266 std::cout <<
"\033[0;0;31m"
268 <<
"\033[0m" << std::endl;
270 cout <<
"in packer::packHdr -> hdr size returned by packer is "
271 <<
hdr_length <<
", higher than MAX_BIN_PKT_ARRAY_LENGTH: "
280 std::cout <<
"\033[0;47;30m"
282 <<
"\033[0m" << std::endl;
283 cout <<
"--> Bin data header generated by packer:"
285 cout <<
"--> Header length (unsigned char):" <<
hdr_length << endl;
308 for (std::vector<packer *>::iterator it =
activePackers.begin();
311 offset = (*it)->packMyHdr(p, buf, offset);
319 std::cout <<
"\033[0;0;31m"
320 <<
" WARNING - REDUCED PACKET"
321 <<
"\033[0m" << std::endl;
323 std::cout <<
"in packer::packPayload -> pkt size set to: "
326 <<
" and payload length is: "
328 <<
" , DEFAULT payload length is "
333 std::cout <<
"\033[0;0;31m"
335 <<
"\033[0m" << std::endl;
337 std::cout <<
"in packer::packPayload -> payload size returned by "
339 << offset <<
", higher than: "
341 <<
" Which is the max pkt length: "
344 <<
". Payload is not serialized." << std::endl;
377 std::cout <<
"\033[0;0;31m"
379 <<
"\033[0m" << std::endl;
380 std::cout <<
"in packer::packPayload -> payload activePackers "
381 "empty but payload_length: "
389 std::cout <<
"\033[0;47;30m"
391 <<
"\033[0m" << std::endl;
392 std::cout <<
"--> Bin data payload generated by packer:"
395 std::cout <<
"--> Payload length (unsigned char):"
418 std::cout <<
"\033[0;47;30m"
420 <<
"\033[0m" << std::endl;
421 std::cout <<
"<-- Bin data header received by packer:"
438 std::cout <<
"\033[0;47;30m"
440 <<
"\033[0m" << std::endl;
444 hdr_cmn *ch = HDR_CMN(p);
445 std::cout <<
"<-- Bin data payload received by packer:"
452 std::cout <<
"\033[0;0;31m"
454 <<
"\033[0m" << std::endl;
455 std::cout <<
"in packer::unpackPayload -> payload activePackers "
456 "empty but binary payload: "
459 <<
". Packet in ERROR is returned" << std::endl;
460 hdr_cmn *ch = HDR_CMN(p);
468 std::cout <<
"\033[0;0;31m"
470 <<
"\033[0m" << std::endl;
471 std::cout <<
"in packer::unpackPayload -> the payload size "
472 "computed from the HDR_UWAL corresponding fields is: "
474 <<
" which is not the DEFAULT expected size: "
485 for (std::vector<packer *>::iterator it =
activePackers.begin();
488 offset = (*it)->unpackMyHdr(
496 HDR_CMN(p)->size() = offset / (
sizeof(char) * 8);
498 std::cout <<
"ch->size() after unpack is: " << HDR_CMN(p)->size()
508 std::cout <<
"\n\033[0;47;30m"
510 <<
"\033[0m" << std::endl;
511 std::cout <<
"Header length: " <<
hdr_length <<
" [Bytes]" << std::endl;
515 for (std::vector<packer *>::iterator it =
activePackers.begin();
518 (*it)->printMyHdrMap();
538 std::cout <<
"\033[0;47;30m"
539 <<
" TX AL packer hdr"
540 <<
"\033[0m" << std::endl;
572 std::cout <<
"\033[0;47;30m"
573 <<
" RX AL packer hdr"
574 <<
"\033[0m" << std::endl;
584 std::cout <<
"\033[0;47;30m"
587 <<
" UWAL" << std::endl;
588 std::cout <<
"\033[0;47;30m 1st field "
590 <<
" src ID: " <<
SRC_ID_Bits <<
" bits" << std::endl;
591 std::cout <<
"\033[0;47;30m 2st field "
593 <<
" pkt IkD: " <<
PKT_ID_Bits <<
" bits" << std::endl;
594 std::cout <<
"\033[0;47;30m 3st field "
597 std::cout <<
"\033[0;47;30m 4st field "
599 <<
" M bit: " <<
M_BIT_Bits <<
" bits" << std::endl;
600 std::cout <<
"\033[0;47;30m 5st field "
610 for (
int i = 0, l =
n_bits.size(); i < l; i++) {
627 std::cout <<
"\033[0;47;30m src ID:\033[0m "
628 <<
static_cast<uint32_t
>(alh->
srcID()) <<
" "
632 std::cout <<
"\033[0;47;30m pkt ID:\033[0m "
633 <<
static_cast<uint32_t
>(alh->
pktID()) <<
" "
637 std::cout <<
"\033[0;47;30m frame offset:\033[0m "
643 std::cout <<
"\033[0;47;30m M bit:\033[0m "
644 <<
static_cast<uint32_t
>(alh->
Mbit()) <<
" "
648 std::cout <<
"\033[0;47;30m dummy content:\033[0m "
652 std::cout <<
"\033[0;41;30m WARNING \033[0m, Field number "
654 <<
" does not exist or its printing is not implemented"
664 size_t total_bits = 0;
666 for (
int i = 0, l =
n_bits.size(); i < l; i++)
673packer::get(
unsigned char *buffer,
size_t offset,
void *val,
size_t h)
675 for (
size_t j = 0; j < h; j++)
685packer::put(
unsigned char *buffer,
size_t offset,
void *val,
size_t h)
687 for (
size_t j = 0; j < h; j++)
699 const char *data = str.c_str();
700 size_t len = str.size();
708 std::string str_out =
"";
710 for (
size_t i = 0; i < len; i++) {
711 if (std::isalnum(data[i]) || std::ispunct(data[i]))
714 std::stringstream sstr(
"");
718 sstr << std::hex << (
unsigned int) (
unsigned char) data[i]
720 str_out += sstr.str();
729 const char *data = str.c_str();
730 size_t len = str.size();
737 std::string str_out =
"";
739 for (
size_t i = 0; i < len; i++) {
740 std::stringstream sstr(
"");
744 sstr << std::hex << (
unsigned int) (
unsigned char) data[i] << std::dec
746 str_out += sstr.str();
754 unsigned char *p = (
unsigned char *) &value;
755 std::stringstream sstr(
"");
758 for (
int i = 0; i <
sizeof(value); i++) {
761 sstr << std::hex << static_cast<uint32_t>(p[i]);
763 sstr << std::dec <<
"]";
771 unsigned char *p = (
unsigned char *) &value;
772 std::stringstream sstr(
"");
775 for (
int i = 0; i <
sizeof(value); i++) {
778 sstr << std::hex << static_cast<uint32_t>(p[i]);
780 sstr << std::dec <<
"]";
788 assert(len_bits <=
sizeof(value) * 8);
789 const int BINARY_MASK = 0xff;
790 const int num_bytes = ceil(len_bits / 8.0);
791 std::stringstream sstr(
"");
800 sstr << std::hex << (value & BINARY_MASK);
803 sstr << std::dec << std::endl;
815 assert(len_bits <=
sizeof(value) * 8);
816 const int8_t BINARY_MASK = 0xff;
817 const uint32_t num_bytes = ceil(len_bits / 8.0);
818 std::stringstream sstr(
"");
827 sstr << std::hex << (value & BINARY_MASK);
830 sstr << std::dec << std::endl;
842 assert(len_bits <=
sizeof(value) * 8);
843 const int16_t BINARY_MASK = 0x00ff;
844 const uint32_t num_bytes = ceil(len_bits / 8.0);
845 std::stringstream sstr(
"");
854 sstr << std::hex << ((value >> 8) & BINARY_MASK);
858 sstr << std::hex << (value & BINARY_MASK);
861 sstr << std::dec << std::endl;
873 assert(len_bits <=
sizeof(value) * 8);
874 const int32_t BINARY_MASK = 0x000000ff;
875 const uint32_t num_bytes = ceil(len_bits / 8.0);
876 std::stringstream sstr(
"");
884 sstr << std::hex << ((value >> 24) & BINARY_MASK);
888 sstr << std::hex << ((value >> 16) & BINARY_MASK);
892 sstr << std::hex << ((value >> 8) & BINARY_MASK);
896 sstr << std::hex << (value & BINARY_MASK);
899 sstr << std::dec << std::endl;
911 assert(len_bits <=
sizeof(value) * 8);
912 const int64_t BINARY_MASK = 0x00000000000000ff;
913 const uint32_t num_bytes = ceil(len_bits / 8.0);
914 std::stringstream sstr(
"");
922 sstr << std::hex << ((value >> 56) & BINARY_MASK);
926 sstr << std::hex << ((value >> 48) & BINARY_MASK);
930 sstr << std::hex << ((value >> 40) & BINARY_MASK);
934 sstr << std::hex << ((value >> 32) & BINARY_MASK);
938 sstr << std::hex << ((value >> 24) & BINARY_MASK);
942 sstr << std::hex << ((value >> 16) & BINARY_MASK);
946 sstr << std::hex << ((value >> 8) & BINARY_MASK);
950 sstr << std::hex << (value & BINARY_MASK);
953 sstr << std::dec << std::endl;
965 assert(len_bits <=
sizeof(value) * 8);
966 const uint8_t BINARY_MASK = 0xff;
967 const uint32_t num_bytes = ceil(len_bits / 8.0);
968 std::stringstream sstr(
"");
977 sstr << std::hex << (value & BINARY_MASK);
980 sstr << std::dec << std::endl;
992 assert(len_bits <=
sizeof(value) * 8);
993 const uint16_t BINARY_MASK = 0x00ff;
994 const uint32_t num_bytes = ceil(len_bits / 8.0);
995 std::stringstream sstr(
"");
1000 switch (num_bytes) {
1004 sstr << std::hex << ((value >> 8) & BINARY_MASK);
1008 sstr << std::hex << (value & BINARY_MASK);
1011 sstr << std::dec << std::endl;
1023 assert(len_bits <=
sizeof(value) * 8);
1024 const uint32_t BINARY_MASK = 0x000000ff;
1025 const uint32_t num_bytes = ceil(len_bits / 8.0);
1026 std::stringstream sstr(
"");
1030 switch (num_bytes) {
1034 sstr << std::hex << ((value >> 24) & BINARY_MASK);
1038 sstr << std::hex << ((value >> 16) & BINARY_MASK);
1042 sstr << std::hex << ((value >> 8) & BINARY_MASK);
1046 sstr << std::hex << (value & BINARY_MASK);
1049 sstr << std::dec << std::endl;
1061 assert(len_bits <=
sizeof(value) * 8);
1062 const uint64_t BINARY_MASK = 0x00000000000000ff;
1063 const uint32_t num_bytes = ceil(len_bits / 8.0);
1064 std::stringstream sstr(
"");
1068 switch (num_bytes) {
1072 sstr << std::hex << ((value >> 56) & BINARY_MASK);
1076 sstr << std::hex << ((value >> 48) & BINARY_MASK);
1080 sstr << std::hex << ((value >> 40) & BINARY_MASK);
1084 sstr << std::hex << ((value >> 32) & BINARY_MASK);
1088 sstr << std::hex << ((value >> 24) & BINARY_MASK);
1092 sstr << std::hex << ((value >> 16) & BINARY_MASK);
1096 sstr << std::hex << ((value >> 8) & BINARY_MASK);
1100 sstr << std::hex << (value & BINARY_MASK);
1103 sstr << std::dec << std::endl;
1115 size_t len = str.size();
1116 const char *data = str.c_str();
1124 std::string str_out =
"";
1125 std::string str_tmp;
1127 for (
size_t i = 0; i < len; i++) {
1129 for (
int j = 0; j < CHAR_BIT; j++) {
1135 str_out += (
"[" + str_tmp +
"]");
Class to create the Otcl shadow object for an object of the class packer.
TclObject * create(int, const char *const *)
Class exploited by the Uwal module to map an NS-Miracle packet into a bit stream, and vice-versa.
std::vector< size_t > n_bits
Vector of elements containing the indication of the number of bits to consider for each header field.
virtual size_t packMyHdr(Packet *, unsigned char *, size_t)
static std::string hexdump_nice(std::string)
Function used for log and debug purposes (in order to print binary strings, even if they contain spec...
virtual void printMyHdrMap()
virtual void printMyHdrFields(Packet *)
Packet * unpackHdr(Packet *)
int command(int, const char *const *)
Method to map tcl commands into c++ methods.
size_t PKT_ID_Bits
Bit length of the srcID_ field to be put in the header stream of bits.
size_t put(unsigned char *buffer, size_t offset, void *val, size_t h)
Method used to map in a certain number of bits, contained in a buffer of chars, a given variable.
std::vector< packer * > activePackers
Vector of elements containing the pointers to the active packers (i.e., the derived classed of packer...
size_t DUMMY_CONTENT_Bits
Bit length of the Mbit_ field to be put in the header stream of bits.
~packer()
Class destructor.
static std::string bindump(std::string)
size_t M_BIT_Bits
Bit length of the frameID_ field to be put in the header stream of bits.
std::string packPayload(Packet *)
Method to map an NS-Miracle packet into a legal modem payload (i.e., a string of binary characters) w...
packer(bool)
Class constructor.
size_t FRAME_OFFSET_Bits
Bit length of the pktID_ field to be put in the header stream of bits.
static std::string hex_bytes(float)
size_t get(unsigned char *buffer, size_t offset, void *val, size_t h)
Method used to retrieve a given variable from a certain number of bits contained in a buffer of chars...
size_t getMyHdrBinLength()
size_t hdr_length
The minimum number of elements that a buffer of char must have in order to store the header fields of...
static std::string hexdump(std::string)
int debug_
Flag to enable debug messages.
size_t payload_length
The minimum number of elements that a buffer of char must have in order to store the fields to be cod...
Packet * unpackPayload(Packet *)
Method to de-map a legal modem payload (i.e., a string of binary characters) into an NS-Miracle packe...
virtual void printMyHdrField(Packet *, int)
size_t getPayloadBinLength()
std::string packHdr(Packet *)
virtual size_t unpackMyHdr(unsigned char *, size_t, Packet *)
#define BARR_SET(barr, N)
#define BARR_TEST(barr, N)
#define MAX_BIN_PKT_ARRAY_LENGTH
#define MAX_DUMMY_STRING_LENGTH
#define BARR_ARRAYSIZE(N)
MACRO to compute the minimum number of elements that a buffer of BARR_ELTYPEs must have in order to s...
unsigned char BARR_ELTYPE
#define BARR_CLEAR(barr, N)
MACRO to set to 0 the bit N of a buffer of BARR_ELTYPEs.
PackerClass class_module_packer
#define DEFAULT_DUMMY_CONTENT_LENGTH
Header of the class responsible to map an NS-Miracle packet into a bit stream, and vice-versa.
hdr_uwal describes the packet header used by Uwal objects.
char * dummyStr()
Return the pointer to the dummyStr_ array.
uint8_t & Mbit()
Reference to the Mbit_ variable.
uint32_t & binHdrLength()
Reference to the binHdrLength_ variable.
uint16_t & framePayloadOffset()
Reference to the frameOffset_ variable.
char dummyStr_[MAX_DUMMY_STRING_LENGTH]
array containing a dummy string.
unsigned int & pktID()
Reference to the pktID_ variable.
char * binPkt()
Return to the binPkt_ array pointer.
uint8_t srcID_
ID of the packet's source node.
unsigned int pktID_
ID of the packet.
uint16_t framePayloadOffset_
Offset of the frame payload.
uint8_t & srcID()
Reference to the srcID_ variable.
uint32_t & binPktLength()
Reference to the binPktLength_ variable.
uint8_t Mbit_
M bit: if set to 0 the current frame is the last or the only one; if set to 1 the current frame is no...