X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fodp-execute.c;h=af3370d88a85ae0ea3896584e5465454511d897b;hb=f67c329519d9a2773dcb1553da1f88be08ba016e;hp=3914c3b7b5f3a6b95903b4f3a27d0ab3c3a24c0e;hpb=4fc65926033eb4a020d1f63db540fe551eae9f82;p=sliver-openvswitch.git diff --git a/lib/odp-execute.c b/lib/odp-execute.c index 3914c3b7b..af3370d88 100644 --- a/lib/odp-execute.c +++ b/lib/odp-execute.c @@ -25,6 +25,7 @@ #include "ofpbuf.h" #include "odp-util.h" #include "packets.h" +#include "unaligned.h" #include "util.h" static void @@ -45,6 +46,18 @@ odp_set_tunnel_action(const struct nlattr *a, struct flow_tnl *tun_key) ovs_assert(fitness != ODP_FIT_ERROR); } +static void +set_arp(struct ofpbuf *packet, const struct ovs_key_arp *arp_key) +{ + struct arp_eth_header *arp = packet->l3; + + arp->ar_op = arp_key->arp_op; + memcpy(arp->ar_sha, arp_key->arp_sha, ETH_ADDR_LEN); + put_16aligned_be32(&arp->ar_spa, arp_key->arp_sip); + memcpy(arp->ar_tha, arp_key->arp_tha, ETH_ADDR_LEN); + put_16aligned_be32(&arp->ar_tpa, arp_key->arp_tip); +} + static void odp_execute_set_action(struct ofpbuf *packet, const struct nlattr *a, struct flow *flow) @@ -106,6 +119,10 @@ odp_execute_set_action(struct ofpbuf *packet, const struct nlattr *a, set_mpls_lse(packet, nl_attr_get_be32(a)); break; + case OVS_KEY_ATTR_ARP: + set_arp(packet, nl_attr_get_unspec(a, sizeof(struct ovs_key_arp))); + break; + case OVS_KEY_ATTR_UNSPEC: case OVS_KEY_ATTR_ENCAP: case OVS_KEY_ATTR_ETHERTYPE: @@ -113,8 +130,8 @@ odp_execute_set_action(struct ofpbuf *packet, const struct nlattr *a, case OVS_KEY_ATTR_VLAN: case OVS_KEY_ATTR_ICMP: case OVS_KEY_ATTR_ICMPV6: - case OVS_KEY_ATTR_ARP: case OVS_KEY_ATTR_ND: + case OVS_KEY_ATTR_TCP_FLAGS: case __OVS_KEY_ATTR_MAX: default: NOT_REACHED(); @@ -184,7 +201,9 @@ odp_execute_actions(void *dp, struct ofpbuf *packet, struct flow *key, break; case OVS_ACTION_ATTR_USERSPACE: { - userspace(dp, packet, key, a); + if (userspace) { + userspace(dp, packet, key, a); + } break; }