Patchwork [v4,13/16] net: Make "info network" output more readable info

login
register
mail settings
Submitter Zhiyong Wu
Date May 25, 2012, 2:02 p.m.
Message ID <1337954529-9099-1-git-send-email-zwu.kernel@gmail.com>
Download mbox | patch
Permalink /patch/161363/
State New
Headers show

Comments

Zhiyong Wu - May 25, 2012, 2:02 p.m.
From: Zhi Yong Wu <wuzhy@linux.vnet.ibm.com>

Reviewed-by:   Jan Kiszka  <jan.kiszka@siemens.com>
Signed-off-by: Zhi Yong Wu <wuzhy@linux.vnet.ibm.com>
---
 net.c     |   18 ++++++++++++++----
 net.h     |   12 ++++++++++++
 net/hub.c |   23 +++++++++++++++++++++--
 net/hub.h |    1 +
 4 files changed, 48 insertions(+), 6 deletions(-)
Jan Kiszka - May 25, 2012, 2:17 p.m.
On 2012-05-25 11:02, zwu.kernel@gmail.com wrote:
> From: Zhi Yong Wu <wuzhy@linux.vnet.ibm.com>
> 
> Reviewed-by:   Jan Kiszka  <jan.kiszka@siemens.com>

Please don't put reviewed-by tags here before the reviewer had a chance
to look at the code.

> Signed-off-by: Zhi Yong Wu <wuzhy@linux.vnet.ibm.com>
> ---
>  net.c     |   18 ++++++++++++++----
>  net.h     |   12 ++++++++++++
>  net/hub.c |   23 +++++++++++++++++++++--
>  net/hub.h |    1 +
>  4 files changed, 48 insertions(+), 6 deletions(-)
> 
> diff --git a/net.c b/net.c
> index 61dc28d..ae0deec 100644
> --- a/net.c
> +++ b/net.c
> @@ -887,6 +887,12 @@ static const struct {
>          },
>      },
>  #endif /* CONFIG_NET_BRIDGE */
> +    [NET_CLIENT_TYPE_HUB] = {
> +        .type = "hubport",
> +        .desc = {
> +            { /* end of list */ }
> +        },
> +    },

This should be obsolete now.

>  };
>  
>  int net_client_init(Monitor *mon, QemuOpts *opts, int is_netdev)
> @@ -1068,7 +1074,7 @@ int do_netdev_del(Monitor *mon, const QDict *qdict, QObject **ret_data)
>      return 0;
>  }
>  
> -static void print_net_client(Monitor *mon, NetClientState *vc)
> +void print_net_client(Monitor *mon, NetClientState *vc)
>  {
>      monitor_printf(mon, "%s: type=%s,%s\n", vc->name,
>                     net_client_types[vc->info->type].type, vc->info_str);
> @@ -1079,12 +1085,17 @@ void do_info_network(Monitor *mon)
>      NetClientState *nc, *peer;
>      net_client_type type;
>  
> -    monitor_printf(mon, "Devices not on any VLAN:\n");
> +    net_hub_info(mon);
> +
>      QTAILQ_FOREACH(nc, &net_clients, next) {
>          peer = nc->peer;
>          type = nc->info->type;
> +
> +        if (net_hub_port_peer_nc(nc)) {
> +            continue;
> +        }
> +
>          if (!peer || type == NET_CLIENT_TYPE_NIC) {
> -            monitor_printf(mon, "  ");
>              print_net_client(mon, nc);
>          } /* else it's a netdev connected to a NIC, printed with the NIC */
>          if (peer && type == NET_CLIENT_TYPE_NIC) {
> @@ -1092,7 +1103,6 @@ void do_info_network(Monitor *mon)
>              print_net_client(mon, peer);
>          }
>      }
> -    net_hub_info(mon);

Why introduce a different hub output format at all? Do it in the final
right from the start.

>  }
>  
>  void qmp_set_link(const char *name, bool up, Error **errp)
> diff --git a/net.h b/net.h
> index 250669a..08306a4 100644
> --- a/net.h
> +++ b/net.h
> @@ -112,6 +112,18 @@ void qemu_check_nic_model(NICInfo *nd, const char *model);
>  int qemu_find_nic_model(NICInfo *nd, const char * const *models,
>                          const char *default_model);
>  
> +ssize_t qemu_deliver_packet(NetClientState *sender,
> +                            unsigned flags,
> +                            const uint8_t *data,
> +                            size_t size,
> +                            void *opaque);
> +ssize_t qemu_deliver_packet_iov(NetClientState *sender,
> +                            unsigned flags,
> +                            const struct iovec *iov,
> +                            int iovcnt,
> +                            void *opaque);
> +

I bet those two prototypes are required by some other patch (or are even
redundant).

> +void print_net_client(Monitor *mon, NetClientState *vc);
>  void do_info_network(Monitor *mon);
>  
>  /* NIC info */
> diff --git a/net/hub.c b/net/hub.c
> index 122de69..8c77d03 100644
> --- a/net/hub.c
> +++ b/net/hub.c
> @@ -184,6 +184,25 @@ NetClientState *net_hub_find_client_by_name(unsigned int hub_id,
>  }
>  
>  /**
> + * Determine if one nc peers with one hub port
> + */
> +bool net_hub_port_peer_nc(NetClientState *nc)
> +{
> +    NetHub *hub;
> +    NetHubPort *port;
> +
> +    QLIST_FOREACH(hub, &hubs, next) {
> +        QLIST_FOREACH(port, &hub->ports, next) {
> +            if (nc == port->nc.peer) {
> +                return true;
> +            }
> +        }
> +    }
> +
> +    return false;
> +}
> +
> +/**
>   * Print hub configuration
>   */
>  void net_hub_info(Monitor *mon)
> @@ -194,8 +213,8 @@ void net_hub_info(Monitor *mon)
>      QLIST_FOREACH(hub, &hubs, next) {
>          monitor_printf(mon, "hub %u\n", hub->id);
>          QLIST_FOREACH(port, &hub->ports, next) {
> -            monitor_printf(mon, "    port %u peer %s\n", port->id,
> -                           port->nc.peer ? port->nc.peer->name : "<none>");
> +            monitor_printf(mon, "   \\ ");

Two space too much of indention (you remove them above for the existing
peer \ peer outputs).

> +            print_net_client(mon, port->nc.peer);
>          }
>      }
>  }
> diff --git a/net/hub.h b/net/hub.h
> index ff5024a..550189b 100644
> --- a/net/hub.h
> +++ b/net/hub.h
> @@ -23,5 +23,6 @@ NetClientState *net_hub_find_client_by_name(unsigned int hub_id,
>  void net_hub_info(Monitor *mon);
>  int net_hub_id_for_client(NetClientState *nc, unsigned int *id);
>  void net_hub_check_clients(void);
> +bool net_hub_port_peer_nc(NetClientState *nc);
>  
>  #endif /* NET_HUB_H */

Jan
Zhiyong Wu - May 25, 2012, 2:25 p.m.
On Fri, May 25, 2012 at 10:17 PM, Jan Kiszka <jan.kiszka@siemens.com> wrote:
> On 2012-05-25 11:02, zwu.kernel@gmail.com wrote:
>> From: Zhi Yong Wu <wuzhy@linux.vnet.ibm.com>
>>
>> Reviewed-by:   Jan Kiszka  <jan.kiszka@siemens.com>
>
> Please don't put reviewed-by tags here before the reviewer had a chance
> to look at the code.
>
>> Signed-off-by: Zhi Yong Wu <wuzhy@linux.vnet.ibm.com>
>> ---
>>  net.c     |   18 ++++++++++++++----
>>  net.h     |   12 ++++++++++++
>>  net/hub.c |   23 +++++++++++++++++++++--
>>  net/hub.h |    1 +
>>  4 files changed, 48 insertions(+), 6 deletions(-)
>>
>> diff --git a/net.c b/net.c
>> index 61dc28d..ae0deec 100644
>> --- a/net.c
>> +++ b/net.c
>> @@ -887,6 +887,12 @@ static const struct {
>>          },
>>      },
>>  #endif /* CONFIG_NET_BRIDGE */
>> +    [NET_CLIENT_TYPE_HUB] = {
>> +        .type = "hubport",
>> +        .desc = {
>> +            { /* end of list */ }
>> +        },
>> +    },
>
> This should be obsolete now.
>
>>  };
>>
>>  int net_client_init(Monitor *mon, QemuOpts *opts, int is_netdev)
>> @@ -1068,7 +1074,7 @@ int do_netdev_del(Monitor *mon, const QDict *qdict, QObject **ret_data)
>>      return 0;
>>  }
>>
>> -static void print_net_client(Monitor *mon, NetClientState *vc)
>> +void print_net_client(Monitor *mon, NetClientState *vc)
>>  {
>>      monitor_printf(mon, "%s: type=%s,%s\n", vc->name,
>>                     net_client_types[vc->info->type].type, vc->info_str);
>> @@ -1079,12 +1085,17 @@ void do_info_network(Monitor *mon)
>>      NetClientState *nc, *peer;
>>      net_client_type type;
>>
>> -    monitor_printf(mon, "Devices not on any VLAN:\n");
>> +    net_hub_info(mon);
>> +
>>      QTAILQ_FOREACH(nc, &net_clients, next) {
>>          peer = nc->peer;
>>          type = nc->info->type;
>> +
>> +        if (net_hub_port_peer_nc(nc)) {
>> +            continue;
>> +        }
>> +
>>          if (!peer || type == NET_CLIENT_TYPE_NIC) {
>> -            monitor_printf(mon, "  ");
>>              print_net_client(mon, nc);
>>          } /* else it's a netdev connected to a NIC, printed with the NIC */
>>          if (peer && type == NET_CLIENT_TYPE_NIC) {
>> @@ -1092,7 +1103,6 @@ void do_info_network(Monitor *mon)
>>              print_net_client(mon, peer);
>>          }
>>      }
>> -    net_hub_info(mon);
>
> Why introduce a different hub output format at all? Do it in the final
> right from the start.
>
>>  }
>>
>>  void qmp_set_link(const char *name, bool up, Error **errp)
>> diff --git a/net.h b/net.h
>> index 250669a..08306a4 100644
>> --- a/net.h
>> +++ b/net.h
>> @@ -112,6 +112,18 @@ void qemu_check_nic_model(NICInfo *nd, const char *model);
>>  int qemu_find_nic_model(NICInfo *nd, const char * const *models,
>>                          const char *default_model);
>>
>> +ssize_t qemu_deliver_packet(NetClientState *sender,
>> +                            unsigned flags,
>> +                            const uint8_t *data,
>> +                            size_t size,
>> +                            void *opaque);
>> +ssize_t qemu_deliver_packet_iov(NetClientState *sender,
>> +                            unsigned flags,
>> +                            const struct iovec *iov,
>> +                            int iovcnt,
>> +                            void *opaque);
>> +
>
> I bet those two prototypes are required by some other patch (or are even
> redundant).
I have noticed this, and split out them to other patch.
>
>> +void print_net_client(Monitor *mon, NetClientState *vc);
>>  void do_info_network(Monitor *mon);
>>
>>  /* NIC info */
>> diff --git a/net/hub.c b/net/hub.c
>> index 122de69..8c77d03 100644
>> --- a/net/hub.c
>> +++ b/net/hub.c
>> @@ -184,6 +184,25 @@ NetClientState *net_hub_find_client_by_name(unsigned int hub_id,
>>  }
>>
>>  /**
>> + * Determine if one nc peers with one hub port
>> + */
>> +bool net_hub_port_peer_nc(NetClientState *nc)
>> +{
>> +    NetHub *hub;
>> +    NetHubPort *port;
>> +
>> +    QLIST_FOREACH(hub, &hubs, next) {
>> +        QLIST_FOREACH(port, &hub->ports, next) {
>> +            if (nc == port->nc.peer) {
>> +                return true;
>> +            }
>> +        }
>> +    }
>> +
>> +    return false;
>> +}
>> +
>> +/**
>>   * Print hub configuration
>>   */
>>  void net_hub_info(Monitor *mon)
>> @@ -194,8 +213,8 @@ void net_hub_info(Monitor *mon)
>>      QLIST_FOREACH(hub, &hubs, next) {
>>          monitor_printf(mon, "hub %u\n", hub->id);
>>          QLIST_FOREACH(port, &hub->ports, next) {
>> -            monitor_printf(mon, "    port %u peer %s\n", port->id,
>> -                           port->nc.peer ? port->nc.peer->name : "<none>");
>> +            monitor_printf(mon, "   \\ ");
This will have the following layout:
(qemu) info network
hub 1
   \ dump.0: type=dump,dump to qemu-vlan1.pcap (len=65536)
   \ user.1: type=user,net=10.0.2.0,restrict=off
   \ virtio-net-pci.0: type=nic,model=virtio-net-pci,macaddr=52:54:00:12:34:58
hub 0
   \ user.0: type=user,net=10.0.2.0,restrict=off
   \ e1000.0: type=nic,model=e1000,macaddr=52:54:00:12:34:57
virtio-net-pci.1: type=nic,model=virtio-net-pci,macaddr=52:54:00:12:34:56
   \ ur: type=tap,ifname=tap0,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown
^^^
>
> Two space too much of indention (you remove them above for the existing
It is three space, not two.
> peer \ peer outputs).
Do you mean that it should be like "monitor_printf(mon, "\\ ");" but
this indention will not match with those peers in hub case.

>
>> +            print_net_client(mon, port->nc.peer);
>>          }
>>      }
>>  }
>> diff --git a/net/hub.h b/net/hub.h
>> index ff5024a..550189b 100644
>> --- a/net/hub.h
>> +++ b/net/hub.h
>> @@ -23,5 +23,6 @@ NetClientState *net_hub_find_client_by_name(unsigned int hub_id,
>>  void net_hub_info(Monitor *mon);
>>  int net_hub_id_for_client(NetClientState *nc, unsigned int *id);
>>  void net_hub_check_clients(void);
>> +bool net_hub_port_peer_nc(NetClientState *nc);
>>
>>  #endif /* NET_HUB_H */
>
> Jan
>
> --
> Siemens AG, Corporate Technology, CT T DE IT 1
> Corporate Competence Center Embedded Linux
Jan Kiszka - May 25, 2012, 2:40 p.m.
On 2012-05-25 11:25, Zhi Yong Wu wrote:
>>> diff --git a/net/hub.c b/net/hub.c
>>> index 122de69..8c77d03 100644
>>> --- a/net/hub.c
>>> +++ b/net/hub.c
>>> @@ -184,6 +184,25 @@ NetClientState *net_hub_find_client_by_name(unsigned int hub_id,
>>>  }
>>>
>>>  /**
>>> + * Determine if one nc peers with one hub port
>>> + */
>>> +bool net_hub_port_peer_nc(NetClientState *nc)
>>> +{
>>> +    NetHub *hub;
>>> +    NetHubPort *port;
>>> +
>>> +    QLIST_FOREACH(hub, &hubs, next) {
>>> +        QLIST_FOREACH(port, &hub->ports, next) {
>>> +            if (nc == port->nc.peer) {
>>> +                return true;
>>> +            }
>>> +        }
>>> +    }
>>> +
>>> +    return false;
>>> +}
>>> +
>>> +/**
>>>   * Print hub configuration
>>>   */
>>>  void net_hub_info(Monitor *mon)
>>> @@ -194,8 +213,8 @@ void net_hub_info(Monitor *mon)
>>>      QLIST_FOREACH(hub, &hubs, next) {
>>>          monitor_printf(mon, "hub %u\n", hub->id);
>>>          QLIST_FOREACH(port, &hub->ports, next) {
>>> -            monitor_printf(mon, "    port %u peer %s\n", port->id,
>>> -                           port->nc.peer ? port->nc.peer->name : "<none>");
>>> +            monitor_printf(mon, "   \\ ");
> This will have the following layout:
> (qemu) info network
> hub 1
>    \ dump.0: type=dump,dump to qemu-vlan1.pcap (len=65536)
>    \ user.1: type=user,net=10.0.2.0,restrict=off
>    \ virtio-net-pci.0: type=nic,model=virtio-net-pci,macaddr=52:54:00:12:34:58
> hub 0
>    \ user.0: type=user,net=10.0.2.0,restrict=off
>    \ e1000.0: type=nic,model=e1000,macaddr=52:54:00:12:34:57
> virtio-net-pci.1: type=nic,model=virtio-net-pci,macaddr=52:54:00:12:34:56
>    \ ur: type=tap,ifname=tap0,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown
> ^^^
>>
>> Two space too much of indention (you remove them above for the existing
> It is three space, not two.
>> peer \ peer outputs).
> Do you mean that it should be like "monitor_printf(mon, "\\ ");" but
> this indention will not match with those peers in hub case.

This line is for printing peers attached to a hub, isn't it? So it
should be exactly one space, like for the non-hub peers. You should see
it better than I when running the code.

Jan
Zhiyong Wu - May 25, 2012, 2:44 p.m.
On Fri, May 25, 2012 at 10:40 PM, Jan Kiszka <jan.kiszka@siemens.com> wrote:
> On 2012-05-25 11:25, Zhi Yong Wu wrote:
>>>> diff --git a/net/hub.c b/net/hub.c
>>>> index 122de69..8c77d03 100644
>>>> --- a/net/hub.c
>>>> +++ b/net/hub.c
>>>> @@ -184,6 +184,25 @@ NetClientState *net_hub_find_client_by_name(unsigned int hub_id,
>>>>  }
>>>>
>>>>  /**
>>>> + * Determine if one nc peers with one hub port
>>>> + */
>>>> +bool net_hub_port_peer_nc(NetClientState *nc)
>>>> +{
>>>> +    NetHub *hub;
>>>> +    NetHubPort *port;
>>>> +
>>>> +    QLIST_FOREACH(hub, &hubs, next) {
>>>> +        QLIST_FOREACH(port, &hub->ports, next) {
>>>> +            if (nc == port->nc.peer) {
>>>> +                return true;
>>>> +            }
>>>> +        }
>>>> +    }
>>>> +
>>>> +    return false;
>>>> +}
>>>> +
>>>> +/**
>>>>   * Print hub configuration
>>>>   */
>>>>  void net_hub_info(Monitor *mon)
>>>> @@ -194,8 +213,8 @@ void net_hub_info(Monitor *mon)
>>>>      QLIST_FOREACH(hub, &hubs, next) {
>>>>          monitor_printf(mon, "hub %u\n", hub->id);
>>>>          QLIST_FOREACH(port, &hub->ports, next) {
>>>> -            monitor_printf(mon, "    port %u peer %s\n", port->id,
>>>> -                           port->nc.peer ? port->nc.peer->name : "<none>");
>>>> +            monitor_printf(mon, "   \\ ");
>> This will have the following layout:
>> (qemu) info network
>> hub 1
>>    \ dump.0: type=dump,dump to qemu-vlan1.pcap (len=65536)
>>    \ user.1: type=user,net=10.0.2.0,restrict=off
>>    \ virtio-net-pci.0: type=nic,model=virtio-net-pci,macaddr=52:54:00:12:34:58
>> hub 0
>>    \ user.0: type=user,net=10.0.2.0,restrict=off
>>    \ e1000.0: type=nic,model=e1000,macaddr=52:54:00:12:34:57
>> virtio-net-pci.1: type=nic,model=virtio-net-pci,macaddr=52:54:00:12:34:56
>>    \ ur: type=tap,ifname=tap0,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown
>> ^^^
>>>
>>> Two space too much of indention (you remove them above for the existing
>> It is three space, not two.
>>> peer \ peer outputs).
>> Do you mean that it should be like "monitor_printf(mon, "\\ ");" but
>> this indention will not match with those peers in hub case.
>
> This line is for printing peers attached to a hub, isn't it? So it
Yeah, but it is three spaces, not one. You can check the code in
do_info_network. For non-hub peers, it is also three spaces.
> should be exactly one space, like for the non-hub peers. You should see
> it better than I when running the code.
That is the result i got when i was running the code.
>
> Jan
>
> --
> Siemens AG, Corporate Technology, CT T DE IT 1
> Corporate Competence Center Embedded Linux
Jan Kiszka - May 25, 2012, 2:50 p.m.
On 2012-05-25 11:44, Zhi Yong Wu wrote:
> On Fri, May 25, 2012 at 10:40 PM, Jan Kiszka <jan.kiszka@siemens.com> wrote:
>> On 2012-05-25 11:25, Zhi Yong Wu wrote:
>>>>> diff --git a/net/hub.c b/net/hub.c
>>>>> index 122de69..8c77d03 100644
>>>>> --- a/net/hub.c
>>>>> +++ b/net/hub.c
>>>>> @@ -184,6 +184,25 @@ NetClientState *net_hub_find_client_by_name(unsigned int hub_id,
>>>>>  }
>>>>>
>>>>>  /**
>>>>> + * Determine if one nc peers with one hub port
>>>>> + */
>>>>> +bool net_hub_port_peer_nc(NetClientState *nc)
>>>>> +{
>>>>> +    NetHub *hub;
>>>>> +    NetHubPort *port;
>>>>> +
>>>>> +    QLIST_FOREACH(hub, &hubs, next) {
>>>>> +        QLIST_FOREACH(port, &hub->ports, next) {
>>>>> +            if (nc == port->nc.peer) {
>>>>> +                return true;
>>>>> +            }
>>>>> +        }
>>>>> +    }
>>>>> +
>>>>> +    return false;
>>>>> +}
>>>>> +
>>>>> +/**
>>>>>   * Print hub configuration
>>>>>   */
>>>>>  void net_hub_info(Monitor *mon)
>>>>> @@ -194,8 +213,8 @@ void net_hub_info(Monitor *mon)
>>>>>      QLIST_FOREACH(hub, &hubs, next) {
>>>>>          monitor_printf(mon, "hub %u\n", hub->id);
>>>>>          QLIST_FOREACH(port, &hub->ports, next) {
>>>>> -            monitor_printf(mon, "    port %u peer %s\n", port->id,
>>>>> -                           port->nc.peer ? port->nc.peer->name : "<none>");
>>>>> +            monitor_printf(mon, "   \\ ");
>>> This will have the following layout:
>>> (qemu) info network
>>> hub 1
>>>    \ dump.0: type=dump,dump to qemu-vlan1.pcap (len=65536)
>>>    \ user.1: type=user,net=10.0.2.0,restrict=off
>>>    \ virtio-net-pci.0: type=nic,model=virtio-net-pci,macaddr=52:54:00:12:34:58
>>> hub 0
>>>    \ user.0: type=user,net=10.0.2.0,restrict=off
>>>    \ e1000.0: type=nic,model=e1000,macaddr=52:54:00:12:34:57
>>> virtio-net-pci.1: type=nic,model=virtio-net-pci,macaddr=52:54:00:12:34:56
>>>    \ ur: type=tap,ifname=tap0,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown
>>> ^^^
>>>>
>>>> Two space too much of indention (you remove them above for the existing
>>> It is three space, not two.
>>>> peer \ peer outputs).
>>> Do you mean that it should be like "monitor_printf(mon, "\\ ");" but
>>> this indention will not match with those peers in hub case.
>>
>> This line is for printing peers attached to a hub, isn't it? So it
> Yeah, but it is three spaces, not one. You can check the code in
> do_info_network. For non-hub peers, it is also three spaces.

Then non-hub needs adjustment to a single space as well. Just remove the
two spaces I added to indent the categories (VLAN vs. non-VLAN listing)
for _both_ peer lines.

(I love nit-picking discussions :) )

Jan
Zhiyong Wu - May 25, 2012, 2:56 p.m.
On Fri, May 25, 2012 at 10:50 PM, Jan Kiszka <jan.kiszka@siemens.com> wrote:
> On 2012-05-25 11:44, Zhi Yong Wu wrote:
>> On Fri, May 25, 2012 at 10:40 PM, Jan Kiszka <jan.kiszka@siemens.com> wrote:
>>> On 2012-05-25 11:25, Zhi Yong Wu wrote:
>>>>>> diff --git a/net/hub.c b/net/hub.c
>>>>>> index 122de69..8c77d03 100644
>>>>>> --- a/net/hub.c
>>>>>> +++ b/net/hub.c
>>>>>> @@ -184,6 +184,25 @@ NetClientState *net_hub_find_client_by_name(unsigned int hub_id,
>>>>>>  }
>>>>>>
>>>>>>  /**
>>>>>> + * Determine if one nc peers with one hub port
>>>>>> + */
>>>>>> +bool net_hub_port_peer_nc(NetClientState *nc)
>>>>>> +{
>>>>>> +    NetHub *hub;
>>>>>> +    NetHubPort *port;
>>>>>> +
>>>>>> +    QLIST_FOREACH(hub, &hubs, next) {
>>>>>> +        QLIST_FOREACH(port, &hub->ports, next) {
>>>>>> +            if (nc == port->nc.peer) {
>>>>>> +                return true;
>>>>>> +            }
>>>>>> +        }
>>>>>> +    }
>>>>>> +
>>>>>> +    return false;
>>>>>> +}
>>>>>> +
>>>>>> +/**
>>>>>>   * Print hub configuration
>>>>>>   */
>>>>>>  void net_hub_info(Monitor *mon)
>>>>>> @@ -194,8 +213,8 @@ void net_hub_info(Monitor *mon)
>>>>>>      QLIST_FOREACH(hub, &hubs, next) {
>>>>>>          monitor_printf(mon, "hub %u\n", hub->id);
>>>>>>          QLIST_FOREACH(port, &hub->ports, next) {
>>>>>> -            monitor_printf(mon, "    port %u peer %s\n", port->id,
>>>>>> -                           port->nc.peer ? port->nc.peer->name : "<none>");
>>>>>> +            monitor_printf(mon, "   \\ ");
>>>> This will have the following layout:
>>>> (qemu) info network
>>>> hub 1
>>>>    \ dump.0: type=dump,dump to qemu-vlan1.pcap (len=65536)
>>>>    \ user.1: type=user,net=10.0.2.0,restrict=off
>>>>    \ virtio-net-pci.0: type=nic,model=virtio-net-pci,macaddr=52:54:00:12:34:58
>>>> hub 0
>>>>    \ user.0: type=user,net=10.0.2.0,restrict=off
>>>>    \ e1000.0: type=nic,model=e1000,macaddr=52:54:00:12:34:57
>>>> virtio-net-pci.1: type=nic,model=virtio-net-pci,macaddr=52:54:00:12:34:56
>>>>    \ ur: type=tap,ifname=tap0,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown
>>>> ^^^
>>>>>
>>>>> Two space too much of indention (you remove them above for the existing
>>>> It is three space, not two.
>>>>> peer \ peer outputs).
>>>> Do you mean that it should be like "monitor_printf(mon, "\\ ");" but
>>>> this indention will not match with those peers in hub case.
>>>
>>> This line is for printing peers attached to a hub, isn't it? So it
>> Yeah, but it is three spaces, not one. You can check the code in
>> do_info_network. For non-hub peers, it is also three spaces.
>
> Then non-hub needs adjustment to a single space as well. Just remove the
> two spaces I added to indent the categories (VLAN vs. non-VLAN listing)
OK, done
> for _both_ peer lines.
>
> (I love nit-picking discussions :) )
No matter. :)
>
> Jan
>
> --
> Siemens AG, Corporate Technology, CT T DE IT 1
> Corporate Competence Center Embedded Linux

Patch

diff --git a/net.c b/net.c
index 61dc28d..ae0deec 100644
--- a/net.c
+++ b/net.c
@@ -887,6 +887,12 @@  static const struct {
         },
     },
 #endif /* CONFIG_NET_BRIDGE */
+    [NET_CLIENT_TYPE_HUB] = {
+        .type = "hubport",
+        .desc = {
+            { /* end of list */ }
+        },
+    },
 };
 
 int net_client_init(Monitor *mon, QemuOpts *opts, int is_netdev)
@@ -1068,7 +1074,7 @@  int do_netdev_del(Monitor *mon, const QDict *qdict, QObject **ret_data)
     return 0;
 }
 
-static void print_net_client(Monitor *mon, NetClientState *vc)
+void print_net_client(Monitor *mon, NetClientState *vc)
 {
     monitor_printf(mon, "%s: type=%s,%s\n", vc->name,
                    net_client_types[vc->info->type].type, vc->info_str);
@@ -1079,12 +1085,17 @@  void do_info_network(Monitor *mon)
     NetClientState *nc, *peer;
     net_client_type type;
 
-    monitor_printf(mon, "Devices not on any VLAN:\n");
+    net_hub_info(mon);
+
     QTAILQ_FOREACH(nc, &net_clients, next) {
         peer = nc->peer;
         type = nc->info->type;
+
+        if (net_hub_port_peer_nc(nc)) {
+            continue;
+        }
+
         if (!peer || type == NET_CLIENT_TYPE_NIC) {
-            monitor_printf(mon, "  ");
             print_net_client(mon, nc);
         } /* else it's a netdev connected to a NIC, printed with the NIC */
         if (peer && type == NET_CLIENT_TYPE_NIC) {
@@ -1092,7 +1103,6 @@  void do_info_network(Monitor *mon)
             print_net_client(mon, peer);
         }
     }
-    net_hub_info(mon);
 }
 
 void qmp_set_link(const char *name, bool up, Error **errp)
diff --git a/net.h b/net.h
index 250669a..08306a4 100644
--- a/net.h
+++ b/net.h
@@ -112,6 +112,18 @@  void qemu_check_nic_model(NICInfo *nd, const char *model);
 int qemu_find_nic_model(NICInfo *nd, const char * const *models,
                         const char *default_model);
 
+ssize_t qemu_deliver_packet(NetClientState *sender,
+                            unsigned flags,
+                            const uint8_t *data,
+                            size_t size,
+                            void *opaque);
+ssize_t qemu_deliver_packet_iov(NetClientState *sender,
+                            unsigned flags,
+                            const struct iovec *iov,
+                            int iovcnt,
+                            void *opaque);
+
+void print_net_client(Monitor *mon, NetClientState *vc);
 void do_info_network(Monitor *mon);
 
 /* NIC info */
diff --git a/net/hub.c b/net/hub.c
index 122de69..8c77d03 100644
--- a/net/hub.c
+++ b/net/hub.c
@@ -184,6 +184,25 @@  NetClientState *net_hub_find_client_by_name(unsigned int hub_id,
 }
 
 /**
+ * Determine if one nc peers with one hub port
+ */
+bool net_hub_port_peer_nc(NetClientState *nc)
+{
+    NetHub *hub;
+    NetHubPort *port;
+
+    QLIST_FOREACH(hub, &hubs, next) {
+        QLIST_FOREACH(port, &hub->ports, next) {
+            if (nc == port->nc.peer) {
+                return true;
+            }
+        }
+    }
+
+    return false;
+}
+
+/**
  * Print hub configuration
  */
 void net_hub_info(Monitor *mon)
@@ -194,8 +213,8 @@  void net_hub_info(Monitor *mon)
     QLIST_FOREACH(hub, &hubs, next) {
         monitor_printf(mon, "hub %u\n", hub->id);
         QLIST_FOREACH(port, &hub->ports, next) {
-            monitor_printf(mon, "    port %u peer %s\n", port->id,
-                           port->nc.peer ? port->nc.peer->name : "<none>");
+            monitor_printf(mon, "   \\ ");
+            print_net_client(mon, port->nc.peer);
         }
     }
 }
diff --git a/net/hub.h b/net/hub.h
index ff5024a..550189b 100644
--- a/net/hub.h
+++ b/net/hub.h
@@ -23,5 +23,6 @@  NetClientState *net_hub_find_client_by_name(unsigned int hub_id,
 void net_hub_info(Monitor *mon);
 int net_hub_id_for_client(NetClientState *nc, unsigned int *id);
 void net_hub_check_clients(void);
+bool net_hub_port_peer_nc(NetClientState *nc);
 
 #endif /* NET_HUB_H */