Quic deser vn
a fake deserializer for quic
object quic_deser_vn = {}
<<< member
class `quic_deser_vn`;
>>>
<<< impl
//TODO
//int scid_h = 8;
//int dcid_h = 8;
class `quic_deser_vn` : public ivy_binary_deser_128 {
//class `quic_deser_vn` : public ivy_binary_deser {
enum {quic_s_init,
quic_s_type,
quic_s_version,
quic_s_dcil,
quic_s_scil,
quic_s_dcid,
quic_s_scid,
quic_s_supported_version
} state;
bool long_format;
char hdr_type;
int dcil_long;
int dcil;
int scil;
long frame_type;
int data_remaining;
int128_t ack_blocks_expected;
int128_t ack_block_count;
//long long ack_blocks_expected;
//long long ack_block_count;
int payload_length;
int fence;
bool have_scid = false;
int version_count = 0;
int n_version;
public:
quic_deser_vn(const std::vector<char> &inp) : ivy_binary_deser_128(inp),state(quic_s_init) {
//quic_deser_vn(const std::vector<char> &inp) : ivy_binary_deser(inp),state(quic_s_init) {
// pos = 42; // skip 42 bytes of IP and UDP header
fence = 0;
}
virtual void get(int128_t &res) {
//virtual void get(long long &res) {
switch (state) {
case quic_s_init:
{
std::cerr << "state " << state << "\n";
std::cerr << "res " << res << "\n";
std::cerr << "pos " << pos << "\n";
std::cerr << "fence " << fence << "\n";
std::cerr << "data_remaining " << data_remaining << "\n";
std::cerr << "inp.size " << inp.size() << "\n";
getn(res,1);
long_format = (res & 0x80) ? true : false;
//0x7f is 0111 1111 in binary. This means the lower 7 bits of res are significant.
//0x30 0011 0000
hdr_type = res & 0x7f; //0x7f;
//This is then shifted by 4 so that only the original 0xxx 0000 (3) bits are significant.
res = long_format ? ((hdr_type & 0x30) >> 4) : 3;
state = quic_s_version;
}
break;
case quic_s_version:
{
std::cerr << "state " << state << "\n";
std::cerr << "res " << res << "\n";
std::cerr << "pos " << pos << "\n";
std::cerr << "fence " << fence << "\n";
std::cerr << "data_remaining " << data_remaining << "\n";
std::cerr << "inp.size " << inp.size() << "\n";
if (long_format) {
ivy_binary_deser_128::getn(res,4);
//ivy_binary_deser::getn(res,4);
}
else
res = 0;
state = quic_s_dcid;
}
break;
case quic_s_dcid:
{
std::cerr << "state " << state << "\n";
std::cerr << "res " << res << "\n";
std::cerr << "pos " << pos << "\n";
std::cerr << "fence " << fence << "\n";
std::cerr << "data_remaining " << data_remaining << "\n";
std::cerr << "inp.size " << inp.size() << "\n";
if (long_format) {
int128_t cil;
//long long cil;
getn(cil,1);
std::cerr << "dstID size " << cil << "\n";
dcil = cil;
dcid_h = cil;
} else {
dcil = dcid_h; //dcil_long
}
getn(res,(dcil));
std::cerr << "dstID res " << res << "\n";
state = quic_s_scid;
}
break;
case quic_s_scid:
{
std::cerr << "state " << state << "\n";
std::cerr << "res " << res << "\n";
std::cerr << "pos " << pos << "\n";
std::cerr << "fence " << fence << "\n";
std::cerr << "data_remaining " << data_remaining << "\n";
std::cerr << "inp.size " << inp.size() << "\n";
if (long_format) {
int128_t cil;
//long long cil;
getn(cil,1);
std::cerr << "sourceID size " << cil << "\n";
if(cil > 0)
have_scid = true;
else
have_scid = false;
scil = cil;
scid_h = cil;
} else {
scil = 0;
}
getn(res,scil);
/*if(scil != 8) { //tricks
tls_field_bytes_map["scid"] = scil;
}*/
std::cerr << "sourceID res " << res << "\n";
//data_remaining = 4;
std::cerr << "sourceID data_remaining " << data_remaining << "\n";
std::cerr << "scid " << res << "\n";
state = quic_s_supported_version;
}
break;
case quic_s_supported_version:
{
int packet_size = inp.size();
std::cerr << "packet_size " << packet_size << "\n";
int versions = (packet_size - 1 - dcil - 1 - scil - 1 - 4)/4;
std::cerr << "nb version " << versions << "\n";
/*if(version_count == 0)
n_version = versions;
std::cerr << "version_count " << version_count << "\n";
if(version_count < n_version){
getn(res,4);
version_count += 1;
state = quic_s_supported_version; //useless ?
}*/
//while (pos < inp.size())
getn(res,4);
std::cerr << "vn version " << res << "\n";
//getn(res,4);
std::cerr << "vn state " << state << "\n";
std::cerr << "vn res " << res << "\n";
std::cerr << "vn pos " << pos << "\n";
std::cerr << "vn fence " << fence << "\n";
std::cerr << "vn data_remaining " << data_remaining << "\n";
std::cerr << "vn inp.size " << inp.size() << "\n";
//data_remaining = 8;
//pos += 4;
//state = quic_s_supported_version;
}
break;
default:
{
std::cerr << "state " << state << "\n";
std::cerr << "quic_deser_vn 3\n";
throw deser_err();
}
}
}
void get_var_int(int128_t &res) {
//void get_var_int(long long &res) {
static int lens[4] = {0,1,3,7};
int128_t lobyte;
ivy_binary_deser_128::getn(lobyte,1);
//long long lobyte;
//ivy_binary_deser::getn(lobyte,1);
int bytes = lens[(lobyte & 0xc0) >> 6];
ivy_binary_deser_128::getn(res,bytes);
//ivy_binary_deser::getn(res,bytes);
res |= (lobyte & 0x3f) << (bytes << 3);
}
void get_pkt_num(int128_t &res) {
ivy_binary_deser_128::getn(res,(hdr_type & 3)+1);
// void get_pkt_num(long long &res) {
// ivy_binary_deser::getn(res,(hdr_type & 3)+1);
return;
static int lens[4] = {0,0,1,3};
int128_t lobyte;
ivy_binary_deser_128::getn(lobyte,1);
//long long lobyte;
//ivy_binary_deser::getn(lobyte,1);
int bytes = lens[(lobyte & 0xc0) >> 6];
if (bytes == 0) {
res = lobyte;
return;
}
ivy_binary_deser_128::getn(res,bytes);
//ivy_binary_deser::getn(res,bytes);
res |= (lobyte & 0x3f) << (bytes << 3);
}
virtual int open_tag(const std::vector<std::string> &tags) {
std::cerr << "quic_deser_vn 6\n";
throw deser_err();
}
virtual bool open_list_elem() {
if (state == quic_s_supported_version) {
// We must use/take in count the padding frame since Picoquic client sometimes send packet
// only with 1 padding frame which make fails the requirement saying that a
// packet cannot be empty
//while ((fence == 0 || pos < fence) && more(1) && inp[pos] == 0)
// pos++; // skip padding frames
//return (fence == 0 || pos < fence) && more(1);
return pos < inp.size()-4; //version_count < n_version;
}
if (state == quic_s_init)
return more(1);
//if (state == quic_crypto_data)
// return data_remaining--> 0;
std::cerr << "quic_deser_vn 1\n";
throw deser_err();
}
void open_list() {
}
void close_list() {
if (state == quic_s_supported_version) {
//state = quic_s_init;
//pos += QUIC_DESER_FAKE_CHECKSUM_LENGTH; // skip the fake checksum
}
}
void close_list_elem() {}
virtual void close_tag() {
state = quic_s_supported_version;
}
~quic_deser_vn(){}
};
>>>
<<< init
transport_error_name_map(transport_error_codes,transport_error_codes_map);
>>>