# -*- Mode: 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'] }