module packet-processing {
    namespace "urn:opendaylight:packet:service";
    prefix flow;

    import opendaylight-inventory {prefix inv;revision-date "2013-08-19";}
    import ietf-yang-types {prefix yang;revision-date "2013-07-15";}
    import opendaylight-match-types {prefix match-type;revision-date "2013-10-26";}
    import opendaylight-table-types {prefix table-type;revision-date "2013-10-26";}
    import opendaylight-action-types {prefix action-type;revision-date "2013-11-12";}
    import opendaylight-flow-types {prefix flow-type;revision-date "2013-10-26";}
    import openflow-protocol { prefix ofproto; revision-date "2013-07-31"; }

    description "Packet processing - sending and receiving.";

    revision "2013-07-09" {
        description "Initial.";
    }

    typedef connection-cookie {
        description "Openflow connection identifier. Outgoing packets should use the same connection they came in.";
        type uint32;
    }

    grouping raw-packet {
        description "Basic packet structure.";
        leaf ingress {
            type inv:node-connector-ref;
        }
        leaf payload {
            type binary;
        }
    }

    grouping packet-in {
        leaf connection-cookie {
            type connection-cookie;
        }

        leaf flow-cookie {
            type flow-type:flow-cookie;
        }

        leaf table-id {
            type table-type:table-id;
        }

        leaf packet-in-reason {
            type identityref {
                base packet-in-reason;
            }
        }

        uses raw-packet;
    }

    grouping ethernet-packet {
        description "Ethernet packet headers structure.";
        leaf source {
            type yang:mac-address;
        }

        leaf destination {
            type yang:mac-address;
        }
    }

    identity packet-in-reason {
        description "Base identity for all the available packet in reasons.";
    }

    identity no-match {
        base packet-in-reason;
        description "No matching flow in the classifier";
    }

    identity send-to-controller {
        base packet-in-reason;
        description "Explicit instruction to send packet to controller";
    }

    identity invalid-ttl {
        base packet-in-reason;
        description "Packet with invalid TTL";
    }

    notification packet-received {
        description "Delivery of incoming packet wrapped in openflow structure.";
        uses packet-in;

        container match {
            uses match-type:match;
        }
    }

    rpc transmit-packet {
        description "Sending packet out through openflow device.";
        input {
            uses inv:node-context-ref;

            leaf connection-cookie {
                type connection-cookie;
            }

            leaf egress {
                type inv:node-connector-ref;
            }
            leaf buffer-id {
                type uint32;
            }

            uses raw-packet;
            uses action-type:action-list;
        }
    }

    container packet-in-message {
        uses packet-in;
        uses ofproto:ofHeader;

        container match {
            uses match-type:match;
        }
    }
}