// See README.txt for information and build instructions.
//
// Note: START and END tags are used in comments to define sections used in
// tutorials.  They are not part of the syntax for Protocol Buffers.
//
// To get an in-depth walkthrough of this file and the related examples, see:
// https://developers.google.com/protocol-buffers/docs/tutorials

// [START declaration]
syntax = "proto3";
//package tutorial;

/*
 * This Contains the Message structures used for PIM MLAG Active-Active support.
 * Mainly there were two types of messages
 *
 *  1. Messages sent from PIM (Node-1) to PIM (Node-2)
 *  2. Messages sent from CLAG to PIM (status Messages)
 *
 * ProtoBuf supports maximum 32 fields, so to make it more generic message
 * encoding is like below.
 *    __________________________________________
 *    |              |                          |
 *    |    Header    |     bytes                |
 *    ___________________________________________
 *
 *
 *  Header carries Information about
 *    1) what Message it is carrying
 *    2) Bytes carries the actual payload encoded with protobuf
 *
 *
 * Limitations
 *=============
 *  Since message-type is 32-bit, there were no real limitations on number of
 *  messages Infra can support, but each message can carry only 32 fields.
 *
 */


// [START messages]
message ZebraMlag_Header {
    enum MessageType {
        ZEBRA_MLAG_NONE = 0; //Invalid message-type
        ZEBRA_MLAG_REGISTER = 1;
        ZEBRA_MLAG_DEREGISTER = 2;
        ZEBRA_MLAG_STATUS_UPDATE = 3;
        ZEBRA_MLAG_MROUTE_ADD = 4;
        ZEBRA_MLAG_MROUTE_DEL = 5;
        ZEBRA_MLAG_DUMP = 6;
        ZEBRA_MLAG_MROUTE_ADD_BULK = 7;
        ZEBRA_MLAG_MROUTE_DEL_BULK = 8;
        ZEBRA_MLAG_PIM_CFG_DUMP = 10;
        ZEBRA_MLAG_VXLAN_UPDATE = 11;
        ZEBRA_MLAG_ZEBRA_STATUS_UPDATE = 12;
    }

    /*
     * tells what type of message this payload carries
     */
    MessageType type = 1;

    /*
     * Length of payload
     */
    uint32      len  = 2;

    /*
     * Actual Encoded payload
     */
    bytes       data = 3;
}


/*
 * ZEBRA_MLAG_REGISTER & ZEBRA_MLAG_DEREGISTER
 *
 * After the MLAGD is up, First Zebra has to register to send any data,
 * otherwise MLAGD will not accept any data from the client.
 * De-register will be used for the Data cleanup at MLAGD
 * These are NULL payload message currently
 */

/*
 * ZEBRA_MLAG_STATUS_UPDATE
 *
 * This message will be posted by CLAGD(an external control plane manager
 * which monitors CLAG failures) to inform peerlink/CLAG Failure
 * to zebra, after the failure Notification Node with primary role will
 * forward the Traffic and Node with standby will drop the traffic
 */

message ZebraMlagStatusUpdate {
    enum ClagState {
        CLAG_STATE_DOWN = 0;
        CLAG_STATE_RUNNING = 1;
    }

    enum ClagRole {
        CLAG_ROLE_NONE = 0;
        CLAG_ROLE_PRIMAY = 1;
        CLAG_ROLE_SECONDARY = 2;
    }

    string    peerlink = 1;
    ClagRole  my_role = 2;
    ClagState peer_state = 3;
}

/*
 * ZEBRA_MLAG_VXLAN_UPDATE
 *
 * This message will be posted by CLAGD(an external control plane Manager
 * which is responsible for MCLAG) to inform zebra obout anycast/local
 * ip updates.
 */
message ZebraMlagVxlanUpdate {
	uint32 anycast_ip = 1;
	uint32 local_ip = 2;
}

/*
 * ZebraMlagZebraStatusUpdate
 *
 * This message will be posted by CLAGD to advertise FRR state
 * Change Information to peer
 */

message ZebraMlagZebraStatusUpdate{
    enum FrrState {
        FRR_STATE_NONE = 0;
        FRR_STATE_DOWN = 1;
        FRR_STATE_UP = 2;
    }

    FrrState peer_frrstate = 1;
}

/*
 * ZEBRA_MLAG_MROUTE_ADD & ZEBRA_MLAG_MROUTE_DEL
 *
 * These messages will be sent from PIM (Node-1) to PIM (Node-2) to perform
 * DF Election for each Mcast flow. Elected DF will forward the traffic
 * towards the host and loser will keep the OIL as empty, so that only single
 * copy will be sent to host
 * This message will be posted with any change in the params.
 *
 * ZEBRA_MLAG_MROUTE_DEL is mainly to delete the record at MLAGD when the
 * mcast flow is deleted.
 * key for the MLAGD lookup is (vrf_id, source_ip & group_ip)
 */

message ZebraMlagMrouteAdd {
    string   vrf_name = 1;
    uint32   source_ip = 2;
    uint32   group_ip = 3;
    /*
     * This is the IGP Cost to reach Configured RP in case of (*,G) or
     * Cost to the source in case of (S,G) entry
     */
    uint32   cost_to_rp = 4;
    uint32   owner_id = 5;
    bool     am_i_DR = 6;
    bool     am_i_Dual_active = 7;
    uint32   vrf_id = 8;
    string   intf_name = 9;
}

message ZebraMlagMrouteDel {
    string   vrf_name = 1;
    uint32   source_ip = 2;
    uint32   group_ip = 3;
    uint32   owner_id = 4;
    uint32   vrf_id = 5;
    string   intf_name = 6;
}

message ZebraMlagMrouteAddBulk {
    repeated ZebraMlagMrouteAdd mroute_add = 1;
}

message ZebraMlagMrouteDelBulk {
    repeated ZebraMlagMrouteDel mroute_del = 1;
}

// [END messages]
