# -*- 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}
#                      },
#                      {...more...},
#        ]}
##
{ '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'] }
