X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=datapath%2Factions.c;h=61b903f683fe24d1158dad6ea9acbf6882eeb626;hb=7229a773ead96f891b621cd5f3e1219af5f24dd7;hp=8ca243dfe6932a81f62a9c5defe4337f9c6953ba;hpb=15c39847d5a81ac6328113222c0c5a7e051b55d8;p=openvswitch diff --git a/datapath/actions.c b/datapath/actions.c index 8ca243df..61b903f6 100644 --- a/datapath/actions.c +++ b/datapath/actions.c @@ -19,9 +19,9 @@ #include #include #include -#include #include #include +#include #include "actions.h" #include "checksum.h" @@ -77,7 +77,7 @@ static int pop_vlan(struct sk_buff *skb) vlan_set_tci(skb, 0); } else { if (unlikely(skb->protocol != htons(ETH_P_8021Q) || - skb->len < VLAN_ETH_HLEN)) + skb->len < VLAN_ETH_HLEN)) return 0; err = __pop_vlan_tci(skb, &tci); @@ -86,7 +86,7 @@ static int pop_vlan(struct sk_buff *skb) } /* move next vlan tag to hw accel tag */ if (likely(skb->protocol != htons(ETH_P_8021Q) || - skb->len < VLAN_ETH_HLEN)) + skb->len < VLAN_ETH_HLEN)) return 0; err = __pop_vlan_tci(skb, &tci); @@ -151,16 +151,10 @@ static void set_ip_addr(struct sk_buff *skb, struct iphdr *nh, *addr = new_addr; } -static void set_ip_tos(struct sk_buff *skb, struct iphdr *nh, u8 new_tos) +static void set_ip_ttl(struct sk_buff *skb, struct iphdr *nh, u8 new_ttl) { - u8 old, new; - - /* Set the DSCP bits and preserve the ECN bits. */ - old = nh->tos; - new = new_tos | (nh->tos & INET_ECN_MASK); - csum_replace4(&nh->check, (__force __be32)old, - (__force __be32)new); - nh->tos = new; + csum_replace2(&nh->check, htons(nh->ttl << 8), htons(new_ttl << 8)); + nh->ttl = new_ttl; } static int set_ipv4(struct sk_buff *skb, const struct ovs_key_ipv4 *ipv4_key) @@ -182,7 +176,10 @@ static int set_ipv4(struct sk_buff *skb, const struct ovs_key_ipv4 *ipv4_key) set_ip_addr(skb, nh, &nh->daddr, ipv4_key->ipv4_dst); if (ipv4_key->ipv4_tos != nh->tos) - set_ip_tos(skb, nh, ipv4_key->ipv4_tos); + ipv4_change_dsfield(nh, 0, ipv4_key->ipv4_tos); + + if (ipv4_key->ipv4_ttl != nh->ttl) + set_ip_ttl(skb, nh, ipv4_key->ipv4_ttl); return 0; } @@ -314,6 +311,10 @@ static int execute_set_action(struct sk_buff *skb, int err = 0; switch (nla_type(nested_attr)) { + case OVS_KEY_ATTR_PRIORITY: + skb->priority = nla_get_u32(nested_attr); + break; + case OVS_KEY_ATTR_TUN_ID: OVS_CB(skb)->tun_id = nla_get_be64(nested_attr); break; @@ -347,7 +348,6 @@ static int do_execute_actions(struct datapath *dp, struct sk_buff *skb, * then freeing the original skbuff is wasteful. So the following code * is slightly obscure just to avoid that. */ int prev_port = -1; - u32 priority = skb->priority; const struct nlattr *a; int rem; @@ -385,14 +385,6 @@ static int do_execute_actions(struct datapath *dp, struct sk_buff *skb, err = execute_set_action(skb, nla_data(a)); break; - case OVS_ACTION_ATTR_SET_PRIORITY: - skb->priority = nla_get_u32(a); - break; - - case OVS_ACTION_ATTR_POP_PRIORITY: - skb->priority = priority; - break; - case OVS_ACTION_ATTR_SAMPLE: err = sample(dp, skb, a); break;