Hi,
I've been experimenting with adding another vlan header in the last few
days.
my end goal is to be able to use the push_vlan and strip_vlan commands from
ovs-ofctl.
I added the following code to packets.c but the patch doesn't work. any
ideas?

/* Checks if a header is of type vlan */
bool
is_vlan_header(struct ofpbuf *packet)
{
    struct vlan_eth_header *veh = packet->l2;
    if (packet->size >= sizeof *veh
        && veh->veth_type == htons(ETH_TYPE_VLAN))
    {
        return true;
    }
    return false;
}

void
eth_push_vlan(struct ofpbuf *packet, ovs_be16 tci)
{
   // new code, will beautify once it works.
    if (is_vlan_header(packet))
    {
        struct vlan_eth_header *veh = packet->l2;
        struct vlan_eth_header *veh2;

        /* Insert new 802.1Q header. */
        struct vlan_eth_header tmp;
        memcpy(tmp.veth_dst, veh->veth_dst, ETH_ADDR_LEN);
        memcpy(tmp.veth_src, veh->veth_src, ETH_ADDR_LEN);
        tmp.veth_type = htons(ETH_TYPE_VLAN);
        tmp.veth_tci = tci & htons(~VLAN_CFI);
        tmp.veth_next_type = veh->veth_type;

        veh2 = ofpbuf_push_uninit(packet, VLAN_HEADER_LEN);
        memcpy(veh2, &tmp, sizeof tmp);
        packet->l2 = packet->data;
    }
    else
    {
        struct eth_header *eh = packet->data;
        struct vlan_eth_header *veh;

        /* Insert new 802.1Q header. */
        struct vlan_eth_header tmp;
        memcpy(tmp.veth_dst, eh->eth_dst, ETH_ADDR_LEN);
        memcpy(tmp.veth_src, eh->eth_src, ETH_ADDR_LEN);
        tmp.veth_type = htons(ETH_TYPE_VLAN);
        tmp.veth_tci = tci & htons(~VLAN_CFI);
        tmp.veth_next_type = eh->eth_type;

        veh = ofpbuf_push_uninit(packet, VLAN_HEADER_LEN);
        memcpy(veh, &tmp, sizeof tmp);

        packet->l2 = packet->data;
    }
}
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to