Bgp utils
a fake deserializer for BGP
object bgp_deser = {}
<<< member
class `bgp_deser`;
>>>
<<< impl
class `bgp_deser` : public ivy_binary_deser_128 {
enum {bgp_s_init,
bgp_s_len,
bgp_s_type,
bgp_s_payload} state;
int token_length = 4;
long frame_type;
int fence=0;
int current_bgp_size = 0;
int payload_length = 12;
public:
bgp_deser(const std::vector<char> &inp) : ivy_binary_deser_128(inp),state(bgp_s_init) {
}
virtual void get(int128_t &res) {
switch (state) {
case bgp_s_init:
{
std::cerr << "bgp_s_init get 16 bytes marker 1\n";
getn(res,16);
state = bgp_s_len;
}
break;
case bgp_s_len:
{
std::cerr << "bgp_s_len 1\n";
getn(res,2);
payload_length = res;
std::cerr << "payload_length = " << payload_length << "\n";
payload_length -= 19;
std::cerr << "payload_length = " << payload_length << "\n";
state = bgp_s_type;
}
break;
case bgp_s_type:
{
std::cerr << "bgp_s_type 1\n";
getn(res,1);
state = bgp_s_payload;
std::cerr << "payload_length = " << payload_length << "\n";
}
break;
case bgp_s_payload:
{
std::cerr << "bgp_s_payload 1\n";
getn(res,1);
std::cerr << "payload_length = " << payload_length << "\n";
}
break;
default:
std::cerr << "bgp_deser 3\n";
throw deser_err();
}
}
int128_t reverse_bytes(int128_t bytes)
{
int128_t aux = 0;
uint8_t byte;
int i;
for(i = 0; i < 128; i+=8)
{
byte = (bytes >> i) & 0xff;
aux |= byte << (128 - 8 - i);
}
return aux;
}
virtual int open_tag(const std::vector<std::string> &tags) {
std::cerr << "state = " << state << "\n";
std::cerr << "bgp_deser 2\n";
throw deser_err();
}
virtual bool open_list_elem() {
if (state == bgp_s_payload) {
std::cerr << "bgp_s_payload bgp_deser 2\n";
return payload_length--> 0;
}
std::cerr << "bgp_deser 1\n";
throw deser_err();
}
void open_list() {
}
void close_list() {
if (state == bgp_s_payload) {
state = bgp_s_init;
}
}
void close_list_elem() {}
virtual void close_tag() {
state = bgp_s_payload;
}
~bgp_deser(){}
};
>>>