[ipxe-devel] [PATCH 0/2] [vlan] Support 802.1Q VLAN 0 priority tagging

Ladi Prosek lprosek at redhat.com
Tue Apr 26 15:54:30 UTC 2016


ping

On Thu, Apr 21, 2016 at 2:48 PM, Ladi Prosek <lprosek at redhat.com> wrote:
> On Thu, Apr 21, 2016 at 12:18 PM, Michael Brown <mcb30 at ipxe.org> wrote:
>> On 21/04/16 09:36, Ladi Prosek wrote:
>>>
>>> Following up on our IRC conversation, here's what I get when playing
>>> with a Linux kernel with no VLAN support (!CONFIG_VLAN_8021Q &&
>>> !CONFIG_VLAN_8021Q_MODULE).
>>>
>>> Receiving VLAN 0 packets works. The tag is stripped and the packet
>>> passes through the networking stack as usual. Here's a VLAN 0 ping
>>> request and response, 10.34.1.105 is running the VLAN-less kernel:
>>>
>>>    1   0.000000  10.34.1.136 -> 10.34.1.105  ICMP 50 Echo (ping)
>>> request  id=0x03e8, seq=0/0, ttl=255
>>>    2   0.000080  10.34.1.105 -> 10.34.1.136  ICMP 46 Echo (ping) reply
>>>    id=0x03e8, seq=0/0, ttl=64 (request in 1)
>>>
>>> Note that the response is 4 bytes shorter because it doesn't have the
>>> 802.1Q header.
>>
>>
>> Fantastic; thank you for doing this testing.  I am suitably convinced that
>> we ought to treat packets on VLAN 0 in the same way as packets with no VLAN
>> tag.
>>
>> Unfortunately, this is going to be difficult to do.  Your patch handles
>> packets that get processed by iPXE, but doesn't help with packets passed via
>> the UNDI API.
>>
>> We do allow for a PXE NBP to use the UNDI API on a VLAN device.  Only the
>> selected VLAN device gets frozen (via netdev_freeze()).  Packets arriving on
>> the unfrozen trunk device are processed by iPXE as normal: the VLAN tag is
>> stripped and the packet is requeued on the appropriately frozen VLAN device,
>> whence pxenv_undi_isr() can dequeue it.
>>
>> This model breaks if we have to handle VLAN 0.  There is no separate VLAN
>> device, so the trunk device itself will be frozen.  The packets will
>> therefore end up being passed out directly via PXENV_UNDI_ISR; the VLAN tag
>> will never be inspected or removed.  This will break most PXE NBPs.
>>
>> I can't immediately see a clean way to do this.  Potentially we would need
>> to parse and strip the VLAN header at the point that netdev_rx() is called,
>> instead of treating VLANs as a net_protocol.
>
> Interesting, thanks. Why not strip it inside pxenv_undi_isr then? This
> function already peeks into the network layer protocol so it doesn't
> feel that unnatural to special case 802.1Q. Maybe without the goto :)
> vlan_strip would be the guts of vlan_rx factored out to a separate
> function doing pretty much everything except re-enquing the packet.
>
> @@ -967,6 +968,7 @@ static PXENV_EXIT_t pxenv_undi_isr ( struct
> s_PXENV_UNDI_ISR *undi_isr ) {
>
>                 /* Strip link-layer header */
>                 ll_protocol = pxe_netdev->ll_protocol;
> +       strip_ll_header:
>                 if ( ( rc = ll_protocol->pull ( pxe_netdev, iobuf, &ll_dest,
>                                                 &ll_source, &net_proto,
>                                                 &flags ) ) != 0 ) {
> @@ -978,6 +980,13 @@ static PXENV_EXIT_t pxenv_undi_isr ( struct
> s_PXENV_UNDI_ISR *undi_isr ) {
>
>                 /* Determine network-layer protocol */
>                 switch ( net_proto ) {
> +               case htons ( ETH_P_8021Q ):
> +                       if ( ( rc = vlan_strip ( pxe_netdev, iobuf, &ll_dest,
> +                                                &ll_source ) ) != 0 ) {
> +                               undi_isr->Status = PXENV_STATUS_FAILURE;
> +                               return PXENV_EXIT_FAILURE;
> +                       }
> +                       goto strip_ll_header;
>                 case htons ( ETH_P_IP ):
>                         net_protocol = &ipv4_protocol;
>                         prottype = P_IP;



More information about the ipxe-devel mailing list