Bgp entities

include bgp_type

object endpoint_id = {
    type this = {speaker}
}
BGP speaker A router that implements BGP.

object bgp_speaker = {

    type this

    module speaker(address: ip.addr, id: bgp_id, as: as_number) = {
        variant this of bgp_speaker = struct { }

        individual ep        : ip.endpoint
        individual bgpid     : bgp_id
        individual bas_number : as_number
individual mode :

        after init {
            ep.protocol := ip.tcp;
            ep.addr := address;
            ep.port := 179;
            bgpid := id;
            bas_number := as;

            if ep.addr = 0x7f000001 {
                ep.interface := ip.lo;
            } else {
                ep.interface := ip.ivy;
            }
        }

        action set_ep(e:ip.endpoint) = {
            ep := e;
        }

        action behavior(s:net.socket, src:bgp_id, pkts:bm.arr) = {
            var dst := socket_endpoint(s);  # because net API doesn't tell us the dst
            var idx := pkts.begin;
            while idx < pkts.end {
                var ppkt := pkts.value(idx);
Do some stuff
                call show_packet(s, src, dst, ppkt);
                call is_generating(_generating);
                var pkt := bgp_message_serdes.from_bytes(ppkt);
                call bgp_header_message_event(dst, src, pkt);
                idx := idx.next;
            };
        }

        import action show_packet(s:net.socket, src:bgp_id, dst:bgp_id, ppkt:stream_data)
        import action is_generating(b:bool)
    }

}