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(){}
    };

>>>