Hi Joe,

On Wed, Dec 02, 2015 at 11:53:50PM -0800, Joe Stringer wrote:

[snip]

> diff --git a/datapath/actions.c b/datapath/actions.c
> index 0397bfe3dba4..0625d7e01176 100644
> --- a/datapath/actions.c
> +++ b/datapath/actions.c

[snip]

> @@ -37,6 +39,7 @@
>  #include <net/sctp/checksum.h>
>  
>  #include "datapath.h"
> +#include "conntrack.h"
>  #include "gso.h"
>  #include "vlan.h"
>  #include "vport.h"
> @@ -53,6 +56,20 @@ struct deferred_action {
>       struct sw_flow_key pkt_key;
>  };
>  
> +#define MAX_L2_LEN   (VLAN_ETH_HLEN + 3 * MPLS_HLEN)
> +struct ovs_frag_data {
> +     unsigned long dst;
> +     struct vport *vport;
> +     struct ovs_skb_cb cb;
> +     __be16 inner_protocol;
> +     __u16 vlan_tci;
> +     __be16 vlan_proto;
> +     unsigned int l2_len;
> +     u8 l2_data[MAX_L2_LEN];
> +};
> +
> +static DEFINE_PER_CPU(struct ovs_frag_data, ovs_frag_data_storage);
> +
>  #define DEFERRED_ACTION_FIFO_SIZE 10
>  struct action_fifo {
>       int head;
> @@ -606,14 +623,157 @@ static int set_sctp(struct sk_buff *skb, struct 
> sw_flow_key *flow_key,
>       return 0;
>  }
>  
> -static void do_output(struct datapath *dp, struct sk_buff *skb, int out_port)

> +#if LINUX_VERSION_CODE > KERNEL_VERSION(3,9,0)

[snip]

> +static void ovs_fragment(struct vport *vport, struct sk_buff *skb, u16 mru,
> +                      __be16 ethertype)
> +{
> +     if (skb_network_offset(skb) > MAX_L2_LEN) {
> +             OVS_NLERR(1, "L2 header too long to fragment");
> +             return;
> +     }
> +
> +     if (ethertype == htons(ETH_P_IP)) {
> +             struct dst_entry ovs_dst;
> +             unsigned long orig_dst;
> +
> +             prepare_frag(vport, skb);
> +             dst_init(&ovs_dst, &ovs_dst_ops, NULL, 1,
> +                      DST_OBSOLETE_NONE, DST_NOCOUNT);
> +             ovs_dst.dev = vport->dev;
> +
> +             orig_dst = (unsigned long) skb_dst(skb);
> +             skb_dst_set_noref(skb, &ovs_dst);
> +             IPCB(skb)->frag_max_size = mru;
> +
> +             ip_do_fragment(skb->sk, skb, ovs_vport_output);

It seems that this code is compiled for kernel versions > 3.9
but that a backport of ip_do_fragment is only provided for
kernels >= 3.10.

I'm unsure of the intention but perhaps the code above should
not be compiled for when building against 3.9.

With the following building succeeds against v3.9.11.


diff --git a/datapath/actions.c b/datapath/actions.c
index 0f1f4bc06ba1..ffa97e3e0231 100644
--- a/datapath/actions.c
+++ b/datapath/actions.c
@@ -68,7 +68,7 @@ struct ovs_frag_data {
        u8 l2_data[MAX_L2_LEN];
 };
 
-#if LINUX_VERSION_CODE > KERNEL_VERSION(3,9,0)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0)
 static DEFINE_PER_CPU(struct ovs_frag_data, ovs_frag_data_storage);
 #endif
 
@@ -625,7 +625,7 @@ static int set_sctp(struct sk_buff *skb, struct sw_flow_key 
*flow_key,
        return 0;
 }
 
-#if LINUX_VERSION_CODE > KERNEL_VERSION(3,9,0)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0)
 static int ovs_vport_output(OVS_VPORT_OUTPUT_PARAMS)
 {
        struct ovs_frag_data *data = get_pcpu_ptr(ovs_frag_data_storage);
@@ -740,7 +740,7 @@ static void ovs_fragment(struct vport *vport, struct 
sk_buff *skb, u16 mru,
 err:
        kfree_skb(skb);
 }
-#else /* <= 3.9 */
+#else /* < 3.10 */
 static void ovs_fragment(struct vport *vport, struct sk_buff *skb, u16 mru,
                         __be16 ethertype)
 {

_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to