- .owner = THIS_MODULE,
-};
-
-/* GRE64 vport. */
-static struct vport *gre64_create(const struct vport_parms *parms)
-{
- struct net *net = ovs_dp_get_net(parms->dp);
- struct ovs_net *ovs_net;
- struct vport *vport;
- int err;
-
- err = gre_init();
- if (err)
- return ERR_PTR(err);
-
- ovs_net = net_generic(net, ovs_net_id);
- if (ovsl_dereference(ovs_net->vport_net.gre64_vport)) {
- vport = ERR_PTR(-EEXIST);
- goto error;
- }
-
- vport = ovs_vport_alloc(IFNAMSIZ, &ovs_gre64_vport_ops, parms);
- if (IS_ERR(vport))
- goto error;
-
- strncpy(vport_priv(vport), parms->name, IFNAMSIZ);
- rcu_assign_pointer(ovs_net->vport_net.gre64_vport, vport);
- return vport;
-error:
- gre_exit();
- return vport;
-}
-
-static void gre64_tnl_destroy(struct vport *vport)
-{
- struct net *net = ovs_dp_get_net(vport->dp);
- struct ovs_net *ovs_net;
-
- ovs_net = net_generic(net, ovs_net_id);
-
- rcu_assign_pointer(ovs_net->vport_net.gre64_vport, NULL);
- ovs_vport_deferred_free(vport);
- gre_exit();
-}
-
-static __be32 be64_get_high32(__be64 x)
-{
-#ifdef __BIG_ENDIAN
- return (__force __be32)((__force u64)x >> 32);
-#else
- return (__force __be32)x;
-#endif
-}
-
-static int gre64_send(struct vport *vport, struct sk_buff *skb)
-{
- int hlen = GRE_HEADER_SECTION + /* GRE Hdr */
- GRE_HEADER_SECTION + /* GRE Key */
- GRE_HEADER_SECTION; /* GRE SEQ */
- __be32 seq;
-
- if (unlikely(!OVS_CB(skb)->egress_tun_info)) {
- kfree_skb(skb);
- return -EINVAL;
- }
-
- if (OVS_CB(skb)->egress_tun_info->tunnel.tun_flags & TUNNEL_CSUM)
- hlen += GRE_HEADER_SECTION;
-
- seq = be64_get_high32(OVS_CB(skb)->egress_tun_info->tunnel.tun_id);
- return __send(vport, skb, hlen, seq, (TUNNEL_KEY|TUNNEL_SEQ));
-}
-
-static struct vport_ops ovs_gre64_vport_ops = {
- .type = OVS_VPORT_TYPE_GRE64,
- .create = gre64_create,
- .destroy = gre64_tnl_destroy,
- .get_name = gre_get_name,
- .send = gre64_send,
- .get_egress_tun_info = gre_get_egress_tun_info,
- .owner = THIS_MODULE,