Browse Source
Add QMP/HMP support for rocker devices. This is mostly for debugging purposes
to see inside the device's tables and port configurations. Some examples:
(qemu) info rocker sw1
name: sw1
id: 0x0000013512005452
ports: 4
(qemu) info rocker-ports sw1
ena/ speed/ auto
port link duplex neg?
sw1.1 up 10G FD No
sw1.2 up 10G FD No
sw1.3 !ena 10G FD No
sw1.4 !ena 10G FD No
(qemu) info rocker-of-dpa-flows sw1
prio tbl hits key(mask) --> actions
2 60 pport 1 vlan 1 LLDP src 00:02:00:00:02:00 dst 01:80:c2:00:00:0e
2 60 pport 1 vlan 1 ARP src 00:02:00:00:02:00 dst 00:02:00:00:03:00
2 60 pport 2 vlan 2 IPv6 src 00:02:00:00:03:00 dst 33:33:ff:00:00:02 proto 58
3 50 vlan 2 dst 33:33:ff:00:00:02 --> write group 0x32000001 goto tbl 60
2 60 pport 2 vlan 2 IPv6 src 00:02:00:00:03:00 dst 33:33:ff:00:03:00 proto 58
3 50 1 vlan 2 dst 33:33:ff:00:03:00 --> write group 0x32000001 goto tbl 60
2 60 pport 2 vlan 2 ARP src 00:02:00:00:03:00 dst 00:02:00:00:02:00
3 50 2 vlan 2 dst 00:02:00:00:02:00 --> write group 0x02000001 goto tbl 60
2 60 1 pport 2 vlan 2 IP src 00:02:00:00:03:00 dst 00:02:00:00:02:00 proto 1
3 50 2 vlan 1 dst 00:02:00:00:03:00 --> write group 0x01000002 goto tbl 60
2 60 1 pport 1 vlan 1 IP src 00:02:00:00:02:00 dst 00:02:00:00:03:00 proto 1
2 60 pport 1 vlan 1 IPv6 src 00:02:00:00:02:00 dst 33:33:ff:00:00:01 proto 58
3 50 vlan 1 dst 33:33:ff:00:00:01 --> write group 0x31000000 goto tbl 60
2 60 pport 1 vlan 1 IPv6 src 00:02:00:00:02:00 dst 33:33:ff:00:02:00 proto 58
3 50 1 vlan 1 dst 33:33:ff:00:02:00 --> write group 0x31000000 goto tbl 60
1 60 173 pport 2 vlan 2 LLDP src <any> dst 01:80:c2:00:00:0e --> write group 0x02000000
1 60 6 pport 2 vlan 2 IPv6 src <any> dst <any> --> write group 0x02000000
1 60 174 pport 1 vlan 1 LLDP src <any> dst 01:80:c2:00:00:0e --> write group 0x01000000
1 60 174 pport 2 vlan 2 IP src <any> dst <any> --> write group 0x02000000
1 60 6 pport 1 vlan 1 IPv6 src <any> dst <any> --> write group 0x01000000
1 60 181 pport 2 vlan 2 ARP src <any> dst <any> --> write group 0x02000000
1 10 715 pport 2 --> apply new vlan 2 goto tbl 20
1 60 177 pport 1 vlan 1 ARP src <any> dst <any> --> write group 0x01000000
1 60 174 pport 1 vlan 1 IP src <any> dst <any> --> write group 0x01000000
1 10 717 pport 1 --> apply new vlan 1 goto tbl 20
1 0 1432 pport 0(0xffff) --> goto tbl 10
(qemu) info rocker-of-dpa-groups sw1
id (decode) --> buckets
0x32000001 (type L2 multicast vlan 2 index 1) --> groups [0x02000001,0x02000000]
0x02000001 (type L2 interface vlan 2 pport 1) --> pop vlan out pport 1
0x01000002 (type L2 interface vlan 1 pport 2) --> pop vlan out pport 2
0x02000000 (type L2 interface vlan 2 pport 0) --> pop vlan out pport 0
0x01000000 (type L2 interface vlan 1 pport 0) --> pop vlan out pport 0
0x31000000 (type L2 multicast vlan 1 index 0) --> groups [0x01000002,0x01000000]
[Added "query-" prefixes to rocker.json commands as suggested by Eric
Blake <eblake@redhat.com>.
--Stefan]
Signed-off-by: Scott Feldman <sfeldma@gmail.com>
Signed-off-by: Jiri Pirko <jiri@resnulli.us>
Message-id: 1433985681-56138-5-git-send-email-sfeldma@gmail.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
pull/28/head
committed by
Stefan Hajnoczi
13 changed files with 1170 additions and 0 deletions
@ -0,0 +1,50 @@ |
|||
/*
|
|||
* QMP Target options - Commands handled based on a target config |
|||
* versus a host config |
|||
* |
|||
* Copyright (c) 2015 David Ahern <dsahern@gmail.com> |
|||
* |
|||
* This program is free software; you can redistribute it and/or modify |
|||
* it under the terms of the GNU General Public License as published by |
|||
* the Free Software Foundation; either version 2 of the License, or |
|||
* (at your option) any later version. |
|||
* |
|||
* This program is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
* GNU General Public License for more details. |
|||
*/ |
|||
|
|||
#include "qemu-common.h" |
|||
#include "qmp-commands.h" |
|||
#include "qapi/qmp/qerror.h" |
|||
|
|||
RockerSwitch *qmp_query_rocker(const char *name, Error **errp) |
|||
{ |
|||
error_set(errp, QERR_FEATURE_DISABLED, "rocker"); |
|||
return NULL; |
|||
}; |
|||
|
|||
RockerPortList *qmp_query_rocker_ports(const char *name, Error **errp) |
|||
{ |
|||
error_set(errp, QERR_FEATURE_DISABLED, "rocker"); |
|||
return NULL; |
|||
}; |
|||
|
|||
RockerOfDpaFlowList *qmp_query_rocker_of_dpa_flows(const char *name, |
|||
bool has_tbl_id, |
|||
uint32_t tbl_id, |
|||
Error **errp) |
|||
{ |
|||
error_set(errp, QERR_FEATURE_DISABLED, "rocker"); |
|||
return NULL; |
|||
}; |
|||
|
|||
RockerOfDpaGroupList *qmp_query_rocker_of_dpa_groups(const char *name, |
|||
bool has_type, |
|||
uint8_t type, |
|||
Error **errp) |
|||
{ |
|||
error_set(errp, QERR_FEATURE_DISABLED, "rocker"); |
|||
return NULL; |
|||
}; |
|||
@ -0,0 +1,286 @@ |
|||
## |
|||
# @Rocker: |
|||
# |
|||
# 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 |
|||
## |
|||
{ '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 information. |
|||
# |
|||
# Returns: @Rocker information |
|||
# |
|||
# Since: 2.4 |
|||
## |
|||
{ '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: #optional physical input port |
|||
# |
|||
# @tunnel-id: #optional tunnel ID |
|||
# |
|||
# @vlan-id: #optional VLAN ID |
|||
# |
|||
# @eth-type: #optional Ethernet header type |
|||
# |
|||
# @eth-src: #optional Ethernet header source MAC address |
|||
# |
|||
# @eth-dst: #optional Ethernet header destination MAC address |
|||
# |
|||
# @ip-proto: #optional IP Header protocol field |
|||
# |
|||
# @ip-tos: #optional IP header TOS field |
|||
# |
|||
# @ip-dst: #optional IP header destination address |
|||
# |
|||
# Note: fields are marked #optional to indicate that they 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: #optional physical input port |
|||
# |
|||
# @tunnel-id: #optional tunnel ID |
|||
# |
|||
# @vlan-id: #optional VLAN ID |
|||
# |
|||
# @eth-src: #optional Ethernet header source MAC address |
|||
# |
|||
# @eth-dst: #optional Ethernet header destination MAC address |
|||
# |
|||
# @ip-proto: #optional IP Header protocol field |
|||
# |
|||
# @ip-tos: #optional IP header TOS field |
|||
# |
|||
# Note: fields are marked #optional to indicate that they 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: #optional next table ID |
|||
# |
|||
# @group-id: #optional group ID |
|||
# |
|||
# @tunnel-lport: #optional tunnel logical port ID |
|||
# |
|||
# @vlan-id: #optional VLAN ID |
|||
# |
|||
# @new-vlan-id: #optional new VLAN ID |
|||
# |
|||
# @out-pport: #optional physical output port |
|||
# |
|||
# Note: fields are marked #optional to indicate that they 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: #optional flow table ID. If tbl-id is not specified, returns |
|||
# flow information for all tables. |
|||
# |
|||
# Returns: @Rocker OF-DPA flow information |
|||
# |
|||
# Since: 2.4 |
|||
## |
|||
{ '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: #optional VLAN ID |
|||
# |
|||
# @pport: #optional physical port number |
|||
# |
|||
# @index: #optional group index, unique with group type |
|||
# |
|||
# @out-pport: #optional output physical port number |
|||
# |
|||
# @group-id: #optional next group ID |
|||
# |
|||
# @set-vlan-id: #optional VLAN ID to set |
|||
# |
|||
# @pop-vlan: #optional pop VLAN headr from packet |
|||
# |
|||
# @group-ids: #optional list of next group IDs |
|||
# |
|||
# @set-eth-src: #optional set source MAC address in Ethernet header |
|||
# |
|||
# @set-eth-dst: #optional set destination MAC address in Ethernet header |
|||
# |
|||
# @ttl-check: #optional perform TTL check |
|||
# |
|||
# Note: fields are marked #optional to indicate that they 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: #optional group type. If type is not specified, returns |
|||
# group information for all group types. |
|||
# |
|||
# Returns: @Rocker OF-DPA group information |
|||
# |
|||
# Since: 2.4 |
|||
## |
|||
{ 'command': 'query-rocker-of-dpa-groups', |
|||
'data': { 'name': 'str', '*type': 'uint8' }, |
|||
'returns': ['RockerOfDpaGroup'] } |
|||
Loading…
Reference in new issue