X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=datapath%2Factions.c;h=6c1ca49cc2b5380c04e59f1feaf2fb6dfd59d79c;hb=7ee20df120d4d56df894abc00a60fe1bc43a058d;hp=b6b713534565bc6961c514a324df56dfebb0990d;hpb=007948177581f3b3dad188221593d0e4bdca6ba0;p=openvswitch diff --git a/datapath/actions.c b/datapath/actions.c index b6b71353..6c1ca49c 100644 --- a/datapath/actions.c +++ b/datapath/actions.c @@ -114,13 +114,13 @@ static struct sk_buff *modify_vlan_tci(struct sk_buff *skb, __be16 tci) static bool is_ip(struct sk_buff *skb) { - return (OVS_CB(skb)->flow->key.dl_type == htons(ETH_P_IP) && + return (OVS_CB(skb)->flow->key.eth.type == htons(ETH_P_IP) && skb->transport_header > skb->network_header); } static __sum16 *get_l4_checksum(struct sk_buff *skb) { - u8 nw_proto = OVS_CB(skb)->flow->key.nw_proto; + u8 nw_proto = OVS_CB(skb)->flow->key.ip.proto; int transport_len = skb->len - skb_transport_offset(skb); if (nw_proto == IPPROTO_TCP) { if (likely(transport_len >= sizeof(struct tcphdr))) @@ -216,34 +216,6 @@ static struct sk_buff *set_tp_port(struct sk_buff *skb, const struct nlattr *a) return skb; } -/** - * is_spoofed_arp - check for invalid ARP packet - * - * @skb: skbuff containing an Ethernet packet, with network header pointing - * just past the Ethernet and optional 802.1Q header. - * - * Returns true if @skb is an invalid Ethernet+IPv4 ARP packet: one with screwy - * or truncated header fields or one whose inner and outer Ethernet address - * differ. - */ -static bool is_spoofed_arp(struct sk_buff *skb) -{ - struct arp_eth_header *arp; - - if (OVS_CB(skb)->flow->key.dl_type != htons(ETH_P_ARP)) - return false; - - if (skb_network_offset(skb) + sizeof(struct arp_eth_header) > skb->len) - return true; - - arp = (struct arp_eth_header *)skb_network_header(skb); - return (arp->ar_hrd != htons(ARPHRD_ETHER) || - arp->ar_pro != htons(ETH_P_IP) || - arp->ar_hln != ETH_ALEN || - arp->ar_pln != 4 || - compare_ether_addr(arp->ar_sha, eth_hdr(skb)->h_source)); -} - static void do_output(struct datapath *dp, struct sk_buff *skb, int out_port) { struct vport *p; @@ -359,16 +331,11 @@ static int do_execute_actions(struct datapath *dp, struct sk_buff *skb, case ODP_ACTION_ATTR_POP_PRIORITY: skb->priority = priority; break; - - case ODP_ACTION_ATTR_DROP_SPOOFED_ARP: - if (unlikely(is_spoofed_arp(skb))) - goto exit; - break; } if (!skb) return -ENOMEM; } -exit: + if (prev_port != -1) do_output(dp, skb, prev_port); else