# -*- Mode: Python -*-
# vim: filetype=python

##
# = Rocker switch device
##

##
# @RockerSwitch:
#
# Rocker switch information.
#
# @name: switch name
#
# @id: switch ID
#
# @ports: number of front-panel ports
#
# Since: 2.4
##
{ 'struct': 'RockerSwitch',
  'data': { 'name': 'str', 'id': 'uint64', 'ports': 'uint32' } }

##
# @query-rocker:
#
# Return rocker switch information.
#
# Returns: @Rocker information
#
# Since: 2.4
#
# Example:
#
#     -> { "execute": "query-rocker", "arguments": { "name": "sw1" } }
#     <- { "return": {"name": "sw1", "ports": 2, "id": 1327446905938}}
##
{ 'command': 'query-rocker',
  'data': { 'name': 'str' },
  'returns': 'RockerSwitch' }

##
# @RockerPortDuplex:
#
# An eumeration of port duplex states.
#
# @half: half duplex
#
# @full: full duplex
#
# Since: 2.4
##
{ 'enum': 'RockerPortDuplex', 'data': [ 'half', 'full' ] }

##
# @RockerPortAutoneg:
#
# An eumeration of port autoneg states.
#
# @off: autoneg is off
#
# @on: autoneg is on
#
# Since: 2.4
##
{ 'enum': 'RockerPortAutoneg', 'data': [ 'off', 'on' ] }

##
# @RockerPort:
#
# Rocker switch port information.
#
# @name: port name
#
# @enabled: port is enabled for I/O
#
# @link-up: physical link is UP on port
#
# @speed: port link speed in Mbps
#
# @duplex: port link duplex
#
# @autoneg: port link autoneg
#
# Since: 2.4
##
{ 'struct': 'RockerPort',
  'data': { 'name': 'str', 'enabled': 'bool', 'link-up': 'bool',
            'speed': 'uint32', 'duplex': 'RockerPortDuplex',
            'autoneg': 'RockerPortAutoneg' } }

##
# @query-rocker-ports:
#
# Return rocker switch port information.
#
# Returns: a list of @RockerPort information
#
# Since: 2.4
#
# Example:
#
#     -> { "execute": "query-rocker-ports", "arguments": { "name": "sw1" } }
#     <- { "return": [ {"duplex": "full", "enabled": true, "name": "sw1.1",
#                       "autoneg": "off", "link-up": true, "speed": 10000},
#                      {"duplex": "full", "enabled": true, "name": "sw1.2",
#                       "autoneg": "off", "link-up": true, "speed": 10000}
#        ]}
##
{ 'command': 'query-rocker-ports',
  'data': { 'name': 'str' },
  'returns': ['RockerPort'] }

##
# @RockerOfDpaFlowKey:
#
# Rocker switch OF-DPA flow key
#
# @priority: key priority, 0 being lowest priority
#
# @tbl-id: flow table ID
#
# @in-pport: physical input port
#
# @tunnel-id: tunnel ID
#
# @vlan-id: VLAN ID
#
# @eth-type: Ethernet header type
#
# @eth-src: Ethernet header source MAC address
#
# @eth-dst: Ethernet header destination MAC address
#
# @ip-proto: IP Header protocol field
#
# @ip-tos: IP header TOS field
#
# @ip-dst: IP header destination address
#
# .. note:: Optional members may or may not appear in the flow key
#    depending if they're relevant to the flow key.
#
# Since: 2.4
##
{ 'struct': 'RockerOfDpaFlowKey',
  'data' : { 'priority': 'uint32', 'tbl-id': 'uint32', '*in-pport': 'uint32',
             '*tunnel-id': 'uint32', '*vlan-id': 'uint16',
             '*eth-type': 'uint16', '*eth-src': 'str', '*eth-dst': 'str',
             '*ip-proto': 'uint8', '*ip-tos': 'uint8', '*ip-dst': 'str' } }

##
# @RockerOfDpaFlowMask:
#
# Rocker switch OF-DPA flow mask
#
# @in-pport: physical input port
#
# @tunnel-id: tunnel ID
#
# @vlan-id: VLAN ID
#
# @eth-src: Ethernet header source MAC address
#
# @eth-dst: Ethernet header destination MAC address
#
# @ip-proto: IP Header protocol field
#
# @ip-tos: IP header TOS field
#
# .. note:: Optional members may or may not appear in the flow mask
#    depending if they're relevant to the flow mask.
#
# Since: 2.4
##
{ 'struct': 'RockerOfDpaFlowMask',
  'data' : { '*in-pport': 'uint32', '*tunnel-id': 'uint32',
             '*vlan-id': 'uint16', '*eth-src': 'str', '*eth-dst': 'str',
             '*ip-proto': 'uint8', '*ip-tos': 'uint8' } }

##
# @RockerOfDpaFlowAction:
#
# Rocker switch OF-DPA flow action
#
# @goto-tbl: next table ID
#
# @group-id: group ID
#
# @tunnel-lport: tunnel logical port ID
#
# @vlan-id: VLAN ID
#
# @new-vlan-id: new VLAN ID
#
# @out-pport: physical output port
#
# .. note:: Optional members may or may not appear in the flow action
#    depending if they're relevant to the flow action.
#
# Since: 2.4
##
{ 'struct': 'RockerOfDpaFlowAction',
  'data' : { '*goto-tbl': 'uint32', '*group-id': 'uint32',
             '*tunnel-lport': 'uint32', '*vlan-id': 'uint16',
             '*new-vlan-id': 'uint16', '*out-pport': 'uint32' } }

##
# @RockerOfDpaFlow:
#
# Rocker switch OF-DPA flow
#
# @cookie: flow unique cookie ID
#
# @hits: count of matches (hits) on flow
#
# @key: flow key
#
# @mask: flow mask
#
# @action: flow action
#
# Since: 2.4
##
{ 'struct': 'RockerOfDpaFlow',
  'data': { 'cookie': 'uint64', 'hits': 'uint64', 'key': 'RockerOfDpaFlowKey',
            'mask': 'RockerOfDpaFlowMask', 'action': 'RockerOfDpaFlowAction' } }

##
# @query-rocker-of-dpa-flows:
#
# Return rocker OF-DPA flow information.
#
# @name: switch name
#
# @tbl-id: flow table ID.  If tbl-id is not specified, returns flow
#     information for all tables.
#
# Returns: rocker OF-DPA flow information
#
# Since: 2.4
#
# Example:
#
#     -> { "execute": "query-rocker-of-dpa-flows",
#          "arguments": { "name": "sw1" } }
#     <- { "return": [ {"key": {"in-pport": 0, "priority": 1, "tbl-id": 0},
#                       "hits": 138,
#                       "cookie": 0,
#                       "action": {"goto-tbl": 10},
#                       "mask": {"in-pport": 4294901760}
#                      },
#                      {...},
#        ]}
##
{ 'command': 'query-rocker-of-dpa-flows',
  'data': { 'name': 'str', '*tbl-id': 'uint32' },
  'returns': ['RockerOfDpaFlow'] }

##
# @RockerOfDpaGroup:
#
# Rocker switch OF-DPA group
#
# @id: group unique ID
#
# @type: group type
#
# @vlan-id: VLAN ID
#
# @pport: physical port number
#
# @index: group index, unique with group type
#
# @out-pport: output physical port number
#
# @group-id: next group ID
#
# @set-vlan-id: VLAN ID to set
#
# @pop-vlan: pop VLAN headr from packet
#
# @group-ids: list of next group IDs
#
# @set-eth-src: set source MAC address in Ethernet header
#
# @set-eth-dst: set destination MAC address in Ethernet header
#
# @ttl-check: perform TTL check
#
# .. note:: Optional members may or may not appear in the group depending
#    if they're relevant to the group type.
#
# Since: 2.4
##
{ 'struct': 'RockerOfDpaGroup',
  'data': { 'id': 'uint32',  'type': 'uint8', '*vlan-id': 'uint16',
            '*pport': 'uint32', '*index': 'uint32', '*out-pport': 'uint32',
            '*group-id': 'uint32', '*set-vlan-id': 'uint16',
            '*pop-vlan': 'uint8', '*group-ids': ['uint32'],
            '*set-eth-src': 'str', '*set-eth-dst': 'str',
            '*ttl-check': 'uint8' } }

##
# @query-rocker-of-dpa-groups:
#
# Return rocker OF-DPA group information.
#
# @name: switch name
#
# @type: group type.  If type is not specified, returns group
#     information for all group types.
#
# Returns: rocker OF-DPA group information
#
# Since: 2.4
#
# Example:
#
#     -> { "execute": "query-rocker-of-dpa-groups",
#          "arguments": { "name": "sw1" } }
#     <- { "return": [ {"type": 0, "out-pport": 2,
#                       "pport": 2, "vlan-id": 3841,
#                       "pop-vlan": 1, "id": 251723778},
#                      {"type": 0, "out-pport": 0,
#                       "pport": 0, "vlan-id": 3841,
#                       "pop-vlan": 1, "id": 251723776},
#                      {"type": 0, "out-pport": 1,
#                       "pport": 1, "vlan-id": 3840,
#                       "pop-vlan": 1, "id": 251658241},
#                      {"type": 0, "out-pport": 0,
#                       "pport": 0, "vlan-id": 3840,
#                       "pop-vlan": 1, "id": 251658240}
#        ]}
##
{ 'command': 'query-rocker-of-dpa-groups',
  'data': { 'name': 'str', '*type': 'uint8' },
  'returns': ['RockerOfDpaGroup'] }
