#include "dynamic-string.h"
#include "ofpbuf.h"
#include "ovs-thread.h"
+#include "odp-util.h"
#include "unaligned.h"
const struct in6_addr in6addr_exact = IN6ADDR_EXACT_INIT;
*
* Also sets 'packet->l2' to point to the new Ethernet header. */
void
-eth_push_vlan(struct ofpbuf *packet, ovs_be16 tci)
+eth_push_vlan(struct ofpbuf *packet, ovs_be16 tpid, ovs_be16 tci)
{
struct eth_header *eh = packet->data;
struct vlan_eth_header *veh;
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_type = tpid;
tmp.veth_tci = tci & htons(~VLAN_CFI);
tmp.veth_next_type = eh->eth_type;
}
/* Set ethertype of the packet. */
-void
+static void
set_ethertype(struct ofpbuf *packet, ovs_be16 eth_type)
{
struct eth_header *eh = packet->data;
return;
}
+ set_ethertype(packet, ethtype);
+
if (!is_mpls(packet)) {
- /* Set ethtype and MPLS label stack entry. */
- set_ethertype(packet, ethtype);
+ /* Set MPLS label stack entry. */
packet->l2_5 = packet->l3;
}
static void
packet_set_ipv6_addr(struct ofpbuf *packet, uint8_t proto,
- ovs_16aligned_be32 *addr, const ovs_be32 new_addr[4],
+ ovs_16aligned_be32 addr[4], const ovs_be32 new_addr[4],
bool recalculate_csum)
{
if (recalculate_csum) {
packet_update_csum128(packet, proto, addr, new_addr);
}
- memcpy(addr, new_addr, sizeof(*addr));
+ memcpy(addr, new_addr, sizeof(ovs_be32[4]));
}
static void
ds_put_cstr(s, "[800]");
}
}
+
+void pkt_metadata_init(struct pkt_metadata *md, const struct flow_tnl *tnl,
+ const uint32_t skb_priority,
+ const uint32_t pkt_mark,
+ const union flow_in_port *in_port)
+{
+
+ tnl ? memcpy(&md->tunnel, tnl, sizeof(md->tunnel))
+ : memset(&md->tunnel, 0, sizeof(md->tunnel));
+
+ md->skb_priority = skb_priority;
+ md->pkt_mark = pkt_mark;
+ md->in_port.odp_port = in_port ? in_port->odp_port : ODPP_NONE;
+}
+
+void pkt_metadata_from_flow(struct pkt_metadata *md, const struct flow *flow)
+{
+ pkt_metadata_init(md, &flow->tunnel, flow->skb_priority,
+ flow->pkt_mark, &flow->in_port);
+}