[RFC,v2,4/5] ne2k_isa: qdev-ify.

Submitted by Gerd Hoffmann on Oct. 7, 2009, 12:36 p.m.

Details

Message ID 1254918996-26050-5-git-send-email-kraxel@redhat.com
State RFC
Headers show

Commit Message

Gerd Hoffmann Oct. 7, 2009, 12:36 p.m.
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 hw/ne2000-isa.c |   25 +++++++++++++++++--------
 hw/ne2000.h     |    3 ++-
 2 files changed, 19 insertions(+), 9 deletions(-)

Comments

Mark McLoughlin Oct. 7, 2009, 1:50 p.m.
On Wed, 2009-10-07 at 14:36 +0200, Gerd Hoffmann wrote:

> -    s->vc = qdev_get_vlan_client(&dev->qdev,
> -                                 ne2000_can_receive, ne2000_receive, NULL,
> -                                 isa_ne2000_cleanup, s);
> -    qemu_format_nic_info_str(s->vc, s->macaddr);
> +    if (s->vlan != -1) {
> +        s->vc = qemu_new_vlan_client(qemu_find_vlan(s->vlan, 1),
> +                                     dev->qdev.info->name, dev->qdev.id,
> +                                     ne2000_can_receive, ne2000_receive, NULL,
> +                                     isa_ne2000_cleanup, s);
> +        qemu_format_nic_info_str(s->vc, s->macaddr);
> +    } else {
> +        qemu_error("warning: no vlan specfied, ne2k_isa is unconnected\n");
> +    }

I'll be posting a patch later which allows qemu_new_vlan_client() to
take a NULL vlan thereafter drop any packets passed to it.

I think that makes more sense, as VLANClientState should become a
NetClient structure which can represent a NIC, backend or even a vlan
itself.

Cheers,
Mark.
Gerd Hoffmann Oct. 7, 2009, 2:07 p.m.
On 10/07/09 15:50, Mark McLoughlin wrote:
> On Wed, 2009-10-07 at 14:36 +0200, Gerd Hoffmann wrote:
>
>> -    s->vc = qdev_get_vlan_client(&dev->qdev,
>> -                                 ne2000_can_receive, ne2000_receive, NULL,
>> -                                 isa_ne2000_cleanup, s);
>> -    qemu_format_nic_info_str(s->vc, s->macaddr);
>> +    if (s->vlan != -1) {
>> +        s->vc = qemu_new_vlan_client(qemu_find_vlan(s->vlan, 1),
>> +                                     dev->qdev.info->name, dev->qdev.id,
>> +                                     ne2000_can_receive, ne2000_receive, NULL,
>> +                                     isa_ne2000_cleanup, s);
>> +        qemu_format_nic_info_str(s->vc, s->macaddr);
>> +    } else {
>> +        qemu_error("warning: no vlan specfied, ne2k_isa is unconnected\n");
>> +    }
>
> I'll be posting a patch later which allows qemu_new_vlan_client() to
> take a NULL vlan thereafter drop any packets passed to it.
>
> I think that makes more sense, as VLANClientState should become a
> NetClient structure which can represent a NIC, backend or even a vlan
> itself.

Fine with me.  I just had to pull out something out of thin air as 
placeholder for net changes which are in the pipeline but not posted 
yet.  Will adjust to whatever comes with for the next respin ;)

cheers,
   Gerd

Patch hide | download patch | download mbox

diff --git a/hw/ne2000-isa.c b/hw/ne2000-isa.c
index 54c0478..7a24088 100644
--- a/hw/ne2000-isa.c
+++ b/hw/ne2000-isa.c
@@ -65,13 +65,18 @@  static int isa_ne2000_initfn(ISADevice *dev)
 
     isa_init_irq(dev, &s->irq, isa->isairq);
 
-    qdev_get_macaddr(&dev->qdev, s->macaddr);
+    qemu_macaddr_default_if_unset(s->macaddr);
     ne2000_reset(s);
 
-    s->vc = qdev_get_vlan_client(&dev->qdev,
-                                 ne2000_can_receive, ne2000_receive, NULL,
-                                 isa_ne2000_cleanup, s);
-    qemu_format_nic_info_str(s->vc, s->macaddr);
+    if (s->vlan != -1) {
+        s->vc = qemu_new_vlan_client(qemu_find_vlan(s->vlan, 1),
+                                     dev->qdev.info->name, dev->qdev.id,
+                                     ne2000_can_receive, ne2000_receive, NULL,
+                                     isa_ne2000_cleanup, s);
+        qemu_format_nic_info_str(s->vc, s->macaddr);
+    } else {
+        qemu_error("warning: no vlan specfied, ne2k_isa is unconnected\n");
+    }
 
     register_savevm("ne2000", -1, 2, ne2000_save, ne2000_load, s);
     return 0;
@@ -84,9 +89,11 @@  void isa_ne2000_init(int base, int irq, NICInfo *nd)
     qemu_check_nic_model(nd, "ne2k_isa");
 
     dev = isa_create("ne2k_isa");
-    dev->qdev.nd = nd; /* hack alert */
     qdev_prop_set_uint32(&dev->qdev, "iobase", base);
     qdev_prop_set_uint32(&dev->qdev, "irq",    irq);
+    qdev_prop_set_macaddr(&dev->qdev, "mac",   nd->macaddr);
+    if (nd->vlan)
+        qdev_prop_set_int32(&dev->qdev, "vlan",   nd->vlan->id);
     qdev_init(&dev->qdev);
 }
 
@@ -95,8 +102,10 @@  static ISADeviceInfo ne2000_isa_info = {
     .qdev.size  = sizeof(ISANE2000State),
     .init       = isa_ne2000_initfn,
     .qdev.props = (Property[]) {
-        DEFINE_PROP_HEX32("iobase", ISANE2000State, iobase, 0x300),
-        DEFINE_PROP_UINT32("irq",   ISANE2000State, isairq, 9),
+        DEFINE_PROP_HEX32("iobase", ISANE2000State, iobase,       0x300),
+        DEFINE_PROP_UINT32("irq",   ISANE2000State, isairq,       9),
+        DEFINE_PROP_MACADDR("mac",  ISANE2000State, ne2000.macaddr),
+        DEFINE_PROP_INT32("vlan",   ISANE2000State, ne2000.vlan,  -1),
         DEFINE_PROP_END_OF_LIST(),
     },
 };
diff --git a/hw/ne2000.h b/hw/ne2000.h
index 92a2ddb..7936fb2 100644
--- a/hw/ne2000.h
+++ b/hw/ne2000.h
@@ -22,8 +22,9 @@  typedef struct NE2000State {
     uint8_t curpag;
     uint8_t mult[8]; /* multicast mask array */
     qemu_irq irq;
+    int32_t vlan;
     VLANClientState *vc;
-    uint8_t macaddr[6];
+    macaddr_t macaddr;
     uint8_t mem[NE2000_MEM_SIZE];
 } NE2000State;