On 12/18/12 10:40, Isaku Yamahata wrote:
> Signed-off-by: Isaku Yamahata <[email protected]>
> ---
> datapath/datapath.c | 54
> ++++++++++++-------------
> datapath/linux/Modules.mk | 1 +
> datapath/linux/compat/include/net/genetlink.h | 15 ++++++-
> datapath/linux/compat/include/net/inet_frag.h | 16 ++++++++
> datapath/vport-capwap.c | 11 ++++-
> 5 files changed, 66 insertions(+), 31 deletions(-)
> create mode 100644 datapath/linux/compat/include/net/inet_frag.h
>
> diff --git a/datapath/datapath.c b/datapath/datapath.c
> index f990b73..0de4043 100644
> --- a/datapath/datapath.c
> +++ b/datapath/datapath.c
> @@ -61,7 +61,7 @@
> #include "vport-internal_dev.h"
>
> #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18) || \
> - LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0)
> + LINUX_VERSION_CODE >= KERNEL_VERSION(3,8,0)
> #error Kernels before 2.6.18 or after 3.6 are not supported by this version
> of Open vSwitch.
Minor issue: the #error message should read 3.7 instead of 3.6.
-Lori
> #endif
>
> @@ -1108,7 +1108,7 @@ static int ovs_flow_cmd_new_or_set(struct sk_buff *skb,
> struct genl_info *info)
> /* Put flow in bucket. */
> ovs_flow_tbl_insert(table, flow, &key, key_len);
>
> - reply = ovs_flow_cmd_build_info(flow, dp, info->snd_pid,
> + reply = ovs_flow_cmd_build_info(flow, dp, info->snd_portid,
> info->snd_seq,
> OVS_FLOW_CMD_NEW);
> } else {
> @@ -1146,7 +1146,7 @@ static int ovs_flow_cmd_new_or_set(struct sk_buff *skb,
> struct genl_info *info)
> ovs_flow_deferred_free_acts(old_acts);
> }
>
> - reply = ovs_flow_cmd_build_info(flow, dp, info->snd_pid,
> + reply = ovs_flow_cmd_build_info(flow, dp, info->snd_portid,
> info->snd_seq, OVS_FLOW_CMD_NEW);
>
> /* Clear stats. */
> @@ -1158,7 +1158,7 @@ static int ovs_flow_cmd_new_or_set(struct sk_buff *skb,
> struct genl_info *info)
> }
>
> if (!IS_ERR(reply))
> - genl_notify(reply, genl_info_net(info), info->snd_pid,
> + genl_notify(reply, genl_info_net(info), info->snd_portid,
> ovs_dp_flow_multicast_group.id, info->nlhdr,
> GFP_KERNEL);
> else
> @@ -1199,7 +1199,7 @@ static int ovs_flow_cmd_get(struct sk_buff *skb, struct
> genl_info *info)
> if (!flow)
> return -ENOENT;
>
> - reply = ovs_flow_cmd_build_info(flow, dp, info->snd_pid,
> + reply = ovs_flow_cmd_build_info(flow, dp, info->snd_portid,
> info->snd_seq, OVS_FLOW_CMD_NEW);
> if (IS_ERR(reply))
> return PTR_ERR(reply);
> @@ -1241,13 +1241,13 @@ static int ovs_flow_cmd_del(struct sk_buff *skb,
> struct genl_info *info)
>
> ovs_flow_tbl_remove(table, flow);
>
> - err = ovs_flow_cmd_fill_info(flow, dp, reply, info->snd_pid,
> + err = ovs_flow_cmd_fill_info(flow, dp, reply, info->snd_portid,
> info->snd_seq, 0, OVS_FLOW_CMD_DEL);
> BUG_ON(err < 0);
>
> ovs_flow_deferred_free(flow);
>
> - genl_notify(reply, genl_info_net(info), info->snd_pid,
> + genl_notify(reply, genl_info_net(info), info->snd_portid,
> ovs_dp_flow_multicast_group.id, info->nlhdr, GFP_KERNEL);
> return 0;
> }
> @@ -1275,7 +1275,7 @@ static int ovs_flow_cmd_dump(struct sk_buff *skb,
> struct netlink_callback *cb)
> break;
>
> if (ovs_flow_cmd_fill_info(flow, dp, skb,
> - NETLINK_CB(cb->skb).pid,
> + NETLINK_CB(cb->skb).portid,
> cb->nlh->nlmsg_seq, NLM_F_MULTI,
> OVS_FLOW_CMD_NEW) < 0)
> break;
> @@ -1476,7 +1476,7 @@ static int ovs_dp_cmd_new(struct sk_buff *skb, struct
> genl_info *info)
> goto err_destroy_ports_array;
> }
>
> - reply = ovs_dp_cmd_build_info(dp, info->snd_pid,
> + reply = ovs_dp_cmd_build_info(dp, info->snd_portid,
> info->snd_seq, OVS_DP_CMD_NEW);
> err = PTR_ERR(reply);
> if (IS_ERR(reply))
> @@ -1488,7 +1488,7 @@ static int ovs_dp_cmd_new(struct sk_buff *skb, struct
> genl_info *info)
>
> rtnl_unlock();
>
> - genl_notify(reply, genl_info_net(info), info->snd_pid,
> + genl_notify(reply, genl_info_net(info), info->snd_portid,
> ovs_dp_datapath_multicast_group.id, info->nlhdr,
> GFP_KERNEL);
> return 0;
> @@ -1555,7 +1555,7 @@ static int ovs_dp_cmd_del(struct sk_buff *skb, struct
> genl_info *info)
> if (IS_ERR(dp))
> return err;
>
> - reply = ovs_dp_cmd_build_info(dp, info->snd_pid,
> + reply = ovs_dp_cmd_build_info(dp, info->snd_portid,
> info->snd_seq, OVS_DP_CMD_DEL);
> err = PTR_ERR(reply);
> if (IS_ERR(reply))
> @@ -1563,7 +1563,7 @@ static int ovs_dp_cmd_del(struct sk_buff *skb, struct
> genl_info *info)
>
> __dp_destroy(dp);
>
> - genl_notify(reply, genl_info_net(info), info->snd_pid,
> + genl_notify(reply, genl_info_net(info), info->snd_portid,
> ovs_dp_datapath_multicast_group.id, info->nlhdr,
> GFP_KERNEL);
>
> @@ -1584,7 +1584,7 @@ static int ovs_dp_cmd_set(struct sk_buff *skb, struct
> genl_info *info)
> if (IS_ERR(dp))
> return PTR_ERR(dp);
>
> - reply = ovs_dp_cmd_build_info(dp, info->snd_pid,
> + reply = ovs_dp_cmd_build_info(dp, info->snd_portid,
> info->snd_seq, OVS_DP_CMD_NEW);
> if (IS_ERR(reply)) {
> err = PTR_ERR(reply);
> @@ -1593,7 +1593,7 @@ static int ovs_dp_cmd_set(struct sk_buff *skb, struct
> genl_info *info)
> return 0;
> }
>
> - genl_notify(reply, genl_info_net(info), info->snd_pid,
> + genl_notify(reply, genl_info_net(info), info->snd_portid,
> ovs_dp_datapath_multicast_group.id, info->nlhdr,
> GFP_KERNEL);
>
> @@ -1614,7 +1614,7 @@ static int ovs_dp_cmd_get(struct sk_buff *skb, struct
> genl_info *info)
> if (IS_ERR(dp))
> return PTR_ERR(dp);
>
> - reply = ovs_dp_cmd_build_info(dp, info->snd_pid,
> + reply = ovs_dp_cmd_build_info(dp, info->snd_portid,
> info->snd_seq, OVS_DP_CMD_NEW);
> if (IS_ERR(reply))
> return PTR_ERR(reply);
> @@ -1631,7 +1631,7 @@ static int ovs_dp_cmd_dump(struct sk_buff *skb, struct
> netlink_callback *cb)
>
> list_for_each_entry(dp, &ovs_net->dps, list_node) {
> if (i >= skip &&
> - ovs_dp_cmd_fill_info(dp, skb, NETLINK_CB(cb->skb).pid,
> + ovs_dp_cmd_fill_info(dp, skb, NETLINK_CB(cb->skb).portid,
> cb->nlh->nlmsg_seq, NLM_F_MULTI,
> OVS_DP_CMD_NEW) < 0)
> break;
> @@ -1876,7 +1876,7 @@ static int ovs_vport_cmd_new(struct sk_buff *skb,
> struct genl_info *info)
>
> err = change_vport(vport, a);
> if (!err) {
> - reply = ovs_vport_cmd_build_info(vport, info->snd_pid,
> + reply = ovs_vport_cmd_build_info(vport, info->snd_portid,
> info->snd_seq,
> OVS_VPORT_CMD_NEW);
> if (IS_ERR(reply))
> @@ -1886,7 +1886,7 @@ static int ovs_vport_cmd_new(struct sk_buff *skb,
> struct genl_info *info)
> ovs_dp_detach_port(vport);
> goto exit_unlock;
> }
> - genl_notify(reply, genl_info_net(info), info->snd_pid,
> + genl_notify(reply, genl_info_net(info), info->snd_portid,
> ovs_dp_vport_multicast_group.id, info->nlhdr, GFP_KERNEL);
>
> exit_unlock:
> @@ -1926,15 +1926,15 @@ static int ovs_vport_cmd_set(struct sk_buff *skb,
> struct genl_info *info)
> if (!err && a[OVS_VPORT_ATTR_UPCALL_PID])
> vport->upcall_pid = nla_get_u32(a[OVS_VPORT_ATTR_UPCALL_PID]);
>
> - reply = ovs_vport_cmd_build_info(vport, info->snd_pid, info->snd_seq,
> - OVS_VPORT_CMD_NEW);
> + reply = ovs_vport_cmd_build_info(vport, info->snd_portid,
> + info->snd_seq, OVS_VPORT_CMD_NEW);
> if (IS_ERR(reply)) {
> netlink_set_err(GENL_SOCK(sock_net(skb->sk)), 0,
> ovs_dp_vport_multicast_group.id,
> PTR_ERR(reply));
> goto exit_unlock;
> }
>
> - genl_notify(reply, genl_info_net(info), info->snd_pid,
> + genl_notify(reply, genl_info_net(info), info->snd_portid,
> ovs_dp_vport_multicast_group.id, info->nlhdr, GFP_KERNEL);
>
> exit_unlock:
> @@ -1965,15 +1965,15 @@ static int ovs_vport_cmd_del(struct sk_buff *skb,
> struct genl_info *info)
> goto exit_unlock;
> }
>
> - reply = ovs_vport_cmd_build_info(vport, info->snd_pid, info->snd_seq,
> - OVS_VPORT_CMD_DEL);
> + reply = ovs_vport_cmd_build_info(vport, info->snd_portid,
> + info->snd_seq, OVS_VPORT_CMD_DEL);
> err = PTR_ERR(reply);
> if (IS_ERR(reply))
> goto exit_unlock;
>
> ovs_dp_detach_port(vport);
>
> - genl_notify(reply, genl_info_net(info), info->snd_pid,
> + genl_notify(reply, genl_info_net(info), info->snd_portid,
> ovs_dp_vport_multicast_group.id, info->nlhdr, GFP_KERNEL);
>
> exit_unlock:
> @@ -2000,8 +2000,8 @@ static int ovs_vport_cmd_get(struct sk_buff *skb,
> struct genl_info *info)
> if (IS_ERR(vport))
> goto exit_unlock;
>
> - reply = ovs_vport_cmd_build_info(vport, info->snd_pid, info->snd_seq,
> - OVS_VPORT_CMD_NEW);
> + reply = ovs_vport_cmd_build_info(vport, info->snd_portid,
> + info->snd_seq, OVS_VPORT_CMD_NEW);
> err = PTR_ERR(reply);
> if (IS_ERR(reply))
> goto exit_unlock;
> @@ -2036,7 +2036,7 @@ static int ovs_vport_cmd_dump(struct sk_buff *skb,
> struct netlink_callback *cb)
> hlist_for_each_entry_rcu(vport, n, &dp->ports[i], dp_hash_node)
> {
> if (j >= skip &&
> ovs_vport_cmd_fill_info(vport, skb,
> - NETLINK_CB(cb->skb).pid,
> + NETLINK_CB(cb->skb).portid,
> cb->nlh->nlmsg_seq,
> NLM_F_MULTI,
> OVS_VPORT_CMD_NEW) < 0)
> diff --git a/datapath/linux/Modules.mk b/datapath/linux/Modules.mk
> index 81556d5..eae98e7 100644
> --- a/datapath/linux/Modules.mk
> +++ b/datapath/linux/Modules.mk
> @@ -61,6 +61,7 @@ openvswitch_headers += \
> linux/compat/include/net/checksum.h \
> linux/compat/include/net/dst.h \
> linux/compat/include/net/genetlink.h \
> + linux/compat/include/net/inet_frag.h \
> linux/compat/include/net/ip.h \
> linux/compat/include/net/ipv6.h \
> linux/compat/include/net/net_namespace.h \
> diff --git a/datapath/linux/compat/include/net/genetlink.h
> b/datapath/linux/compat/include/net/genetlink.h
> index af7d5fd..31ff282 100644
> --- a/datapath/linux/compat/include/net/genetlink.h
> +++ b/datapath/linux/compat/include/net/genetlink.h
> @@ -5,6 +5,17 @@
> #include <linux/netlink.h>
> #include <net/net_namespace.h>
>
> +/*
> + * 15e473046cb6e5d18a4d0057e61d76315230382b renames pid to portid
> + * the affected structures are
> + * netlink_skb_parms::pid -> portid
> + * genl_info::snd_pid -> snd_portid
> + */
> +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,7,0)
> +#define snd_portid snd_pid
> +#define portid pid
> +#endif
> +
> /* Very special super-nasty workaround here:
> *
> * Before 2.6.19, nlmsg_multicast() lacked a 'flags' parameter. We work
> @@ -126,7 +137,7 @@ static inline void *genlmsg_put_reply(struct sk_buff *skb,
> struct genl_info *info, struct genl_family *family,
> int flags, u8 cmd)
> {
> - return genlmsg_put(skb, info->snd_pid, info->snd_seq, family,
> + return genlmsg_put(skb, info->snd_portid, info->snd_seq, family,
> flags, cmd);
> }
>
> @@ -137,7 +148,7 @@ static inline void *genlmsg_put_reply(struct sk_buff *skb,
> */
> static inline int genlmsg_reply(struct sk_buff *skb, struct genl_info *info)
> {
> - return genlmsg_unicast(skb, info->snd_pid);
> + return genlmsg_unicast(skb, info->snd_portid);
> }
>
> /**
> diff --git a/datapath/linux/compat/include/net/inet_frag.h
> b/datapath/linux/compat/include/net/inet_frag.h
> new file mode 100644
> index 0000000..6767c31
> --- /dev/null
> +++ b/datapath/linux/compat/include/net/inet_frag.h
> @@ -0,0 +1,16 @@
> +#ifndef __NET_INET_FRAG_WRAPPER_H
> +#define __NET_INET_FRAG_WRAPPER_H 1
> +
> +#include <linux/version.h>
> +#include_next <net/inet_frag.h>
> +
> +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,7,0)
> +#define inet_frag_evictor(nf, f, force)
> \
> + do { \
> + if (force || atomic_read(&nf->mem) > nf->high_thresh) { \
> + inet_frag_evictor(nf, f); \
> + } \
> + } while (0)
> +#endif
> +
> +#endif /* inet_frag.h */
> diff --git a/datapath/vport-capwap.c b/datapath/vport-capwap.c
> index 5f31732..cea6bfd 100644
> --- a/datapath/vport-capwap.c
> +++ b/datapath/vport-capwap.c
> @@ -143,7 +143,11 @@ static struct sk_buff *defrag(struct sk_buff *, bool
> frag_last);
>
> static void capwap_frag_init(struct inet_frag_queue *, void *match);
> static unsigned int capwap_frag_hash(struct inet_frag_queue *);
> +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,7,0)
> static int capwap_frag_match(struct inet_frag_queue *, void *match);
> +#else
> +static bool capwap_frag_match(struct inet_frag_queue *, void *match);
> +#endif
> static void capwap_frag_expire(unsigned long ifq);
>
> static struct inet_frags frag_state = {
> @@ -769,8 +773,7 @@ static struct sk_buff *defrag(struct sk_buff *skb, bool
> frag_last)
> u16 frag_off;
> struct frag_queue *fq;
>
> - if (atomic_read(&ns_frag_state->mem) > ns_frag_state->high_thresh)
> - inet_frag_evictor(ns_frag_state, &frag_state);
> + inet_frag_evictor(ns_frag_state, &frag_state, false);
>
> match.daddr = iph->daddr;
> match.saddr = iph->saddr;
> @@ -804,7 +807,11 @@ static unsigned int capwap_frag_hash(struct
> inet_frag_queue *ifq)
> return frag_hash(&ifq_cast(ifq)->match);
> }
>
> +#if LINUX_VERSION_CODE < KERNEL_VERSION(3,7,0)
> static int capwap_frag_match(struct inet_frag_queue *ifq, void *a_)
> +#else
> +static bool capwap_frag_match(struct inet_frag_queue *ifq, void *a_)
> +#endif
> {
> struct frag_match *a = a_;
> struct frag_match *b = &ifq_cast(ifq)->match;
>
_______________________________________________
dev mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/dev