[SLOF] [PATCH v3 12/22] virtio-net: move setup-mac to the open routine
Nikunj A Dadhania
nikunj at linux.vnet.ibm.com
Wed Jan 27 21:29:08 AEDT 2016
Thomas Huth <thuth at redhat.com> writes:
> On 27.01.2016 10:02, Nikunj A Dadhania wrote:
>> Thomas Huth <thuth at redhat.com> writes:
>>
>>> On 22.01.2016 11:54, Nikunj A Dadhania wrote:
>>>> MAC reading should be done after the initialization of the device after
>>>> the features negotiation.
>>>>
>>>> Signed-off-by: Nikunj A Dadhania <nikunj at linux.vnet.ibm.com>
>>>> ---
>>>> board-qemu/slof/virtio-net.fs | 23 ++++++++++++-----------
>>>> 1 file changed, 12 insertions(+), 11 deletions(-)
>>
>>> So the open function now first calls setup-mac, then checks for the
>>> "local-mac-address" property, and if it is available, it does the
>>> initialization (during virtio-net-open), including feature negotiation.
>>> So the mac address is still set before the feature negotiation, isn't it?
>>>
>>> I think you likely have to rework the code a little bit:
>>> - allow virtio-net-open to be also called if the local-mac-address
>>> property is not available yet, e.g. by calling it with with len = 0
>>> - in virtionet_open() only memcpy the mac address if len > 0
>>> ... and if len = 0, set dev->mac_address from the config space after
>>> feature negotiation
>>> - call the setup-mac function after virtio-net-open
>>
>>
>> How about something like this:
>> * changed the signature of virtio-net-open
>> * get the mac address during the virtionet_init routine
>> * setup-mac after the virtionet_open
>
> Sounds like this should work, too, and is even easier!
> (I initially thought we might need support the possibility to let the
> user override the local-mac-address property, but it seems this is not
> supported by the other drivers, too, so we likely also don't need this
> for virtio-net)
>
>> * BTW, .code file has some indentation issues.
>
> Maybe clean it up in your clean-up patch 04/22 ?
Sure, i can do that.
>> + virtiodev virtio-net-open not IF ." virtio-net-open failed" EXIT THEN
>
> The bug was there in the old code already ... but anyway, I think there
> should be a FALSE right before the EXIT here?
Oops, it was introduced by me while optimizing ;-)
- virtiodev virtio-net-open dup not IF ." virtio-net-open failed" EXIT THEN
- drop TO virtio-net-priv
I removed "dup" and "drop" but missed to add a "false" in exit case.
>
>> + TO virtio-net-priv
>> + setup-mac
>> + s" local-mac-address" get-node get-property not IF 2drop true ELSE FALSE THEN
>
> After "setup-mac", I think there's always a "local-mac-address"
> property, so you can simply replace this last line with "true".
Sure
>
>> ELSE
>> false
>> THEN
>> @@ -77,17 +87,6 @@ virtiodev virtio-setup-vd
>> s" ping" obp-tftp-package @ $call-method
>> ;
>>
>> -\ Set up MAC address from config virtqueue
>> -6 BUFFER: local-mac
>> -: setup-mac ( -- )
>> - 6 0 DO
>> - virtiodev i 1 virtio-get-config
>> - local-mac i + c!
>> - LOOP
>> - local-mac 6 encode-bytes s" local-mac-address" property
>> -;
>> -setup-mac
>> -
>> : setup-alias ( -- )
>> " net" get-next-alias ?dup IF
>> get-node node>path set-alias
> ...
>> diff --git a/lib/libvirtio/virtio.code b/lib/libvirtio/virtio.code
>> index 258b9bb..217c0a1 100644
>> --- a/lib/libvirtio/virtio.code
>> +++ b/lib/libvirtio/virtio.code
>> @@ -122,14 +122,12 @@ MIRP
>>
>> /******** virtio-net ********/
>>
>> -// : virtio-net-open ( mac-addr-str len dev -- false | [ driver true ] )
>> +// : virtio-net-open ( dev -- false | [ driver true ] )
>> PRIM(virtio_X2d_net_X2d_open)
>> {
>> - void *dev = TOS.a; POP;
>> - int len = TOS.u; POP;
>> - char *mac_addr = TOS.a;
>> + void *dev = TOS.a;
>>
>> - net_driver_t *net_driver = virtionet_open(mac_addr, len, dev);
>> + net_driver_t *net_driver = virtionet_open(dev);
>
> Indent the new line with a tab? (no need to keep the bad coding style
> here) ... or, as mentioned above, clean it up in 04/22 already.
I will clean up this in 4/22
>
>> if (net_driver) {
>> TOS.u = (unsigned long)net_driver; PUSH;
>>>
>>>
>>> Beside that, I think there is another pre-existing problem in the MAC
>>> address handling. According to the virtio-1.0 spec:
>>>
>>> "A driver SHOULD negotiate VIRTIO_NET_F_MAC if the device offers it. If
>>> the driver negotiates the VIRTIO_NET_F_MAC feature, the driver MUST set
>>> the physical address of the NIC to mac. Otherwise, it SHOULD use a
>>> locally-administered MAC address"
>>>
>>> However, the driver in SLOF does not use VIRTIO_NET_F_MAC as far as I
>>> can see, neither does it set a locally-administered MAC in case the host
>>> does not provide a MAC.
>>
>> Not in this patch, but while enabling virtio 1.0, i have enabled it. Its
>> a magic number(BIT(5)), forgot to convert to a define.
>>
>> if (virtio_negotiate_guest_features(&virtiodev, VIRTIO_F_VERSION_1 | (BIT(5))))
>
> Ok, so that should be fine (but a define would be nice, of course).
Right.
Regards
Nikunj
More information about the SLOF
mailing list