Skip to content

Commit a9e8f15

Browse files
openvswitch: use ipgre tunnel rather than gretap tunnel
This allows GRE tunnels to send and receive both layer 2 packets (packets with an ethernet header) and layer 3 packets (packets without an ethernet header). Signed-off-by: Simon Horman <simon.horman@netronome.com> --- v9 New Patch
1 parent 179b241 commit a9e8f15

5 files changed

Lines changed: 20 additions & 9 deletions

File tree

include/net/gre.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ struct gre_protocol {
2323
int gre_add_protocol(const struct gre_protocol *proto, u8 version);
2424
int gre_del_protocol(const struct gre_protocol *proto, u8 version);
2525

26-
struct net_device *gretap_fb_dev_create(struct net *net, const char *name,
27-
u8 name_assign_type);
26+
struct net_device *gre_fb_dev_create(struct net *net, const char *name,
27+
u8 name_assign_type);
2828
int gre_parse_header(struct sk_buff *skb, struct tnl_ptk_info *tpi,
2929
bool *csum_err, int *hdr_len);
3030

net/ipv4/ip_gre.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1114,8 +1114,8 @@ static struct rtnl_link_ops ipgre_tap_ops __read_mostly = {
11141114
.get_link_net = ip_tunnel_get_link_net,
11151115
};
11161116

1117-
struct net_device *gretap_fb_dev_create(struct net *net, const char *name,
1118-
u8 name_assign_type)
1117+
struct net_device *gre_fb_dev_create(struct net *net, const char *name,
1118+
u8 name_assign_type)
11191119
{
11201120
struct nlattr *tb[IFLA_MAX + 1];
11211121
struct net_device *dev;
@@ -1125,7 +1125,7 @@ struct net_device *gretap_fb_dev_create(struct net *net, const char *name,
11251125
memset(&tb, 0, sizeof(tb));
11261126

11271127
dev = rtnl_create_link(net, name, name_assign_type,
1128-
&ipgre_tap_ops, tb);
1128+
&ipgre_link_ops, tb);
11291129
if (IS_ERR(dev))
11301130
return dev;
11311131

@@ -1149,7 +1149,7 @@ struct net_device *gretap_fb_dev_create(struct net *net, const char *name,
11491149
free_netdev(dev);
11501150
return ERR_PTR(err);
11511151
}
1152-
EXPORT_SYMBOL_GPL(gretap_fb_dev_create);
1152+
EXPORT_SYMBOL_GPL(gre_fb_dev_create);
11531153

11541154
static int __net_init ipgre_tap_init_net(struct net *net)
11551155
{

net/openvswitch/vport-gre.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ static struct vport *gre_tnl_create(const struct vport_parms *parms)
6060
return vport;
6161

6262
rtnl_lock();
63-
dev = gretap_fb_dev_create(net, parms->name, NET_NAME_USER);
63+
dev = gre_fb_dev_create(net, parms->name, NET_NAME_USER);
6464
if (IS_ERR(dev)) {
6565
rtnl_unlock();
6666
ovs_vport_free(vport);
@@ -87,7 +87,7 @@ static struct vport *gre_create(const struct vport_parms *parms)
8787
static struct vport_ops ovs_gre_vport_ops = {
8888
.type = OVS_VPORT_TYPE_GRE,
8989
.create = gre_create,
90-
.send = ovs_netdev_send_tap,
90+
.send = ovs_netdev_send_raw_tun,
9191
.destroy = ovs_netdev_tunnel_destroy,
9292
};
9393

net/openvswitch/vport-netdev.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,8 @@ struct vport *ovs_netdev_link(struct vport *vport, const char *name)
9999
}
100100

101101
if (vport->dev->flags & IFF_LOOPBACK ||
102-
vport->dev->type != ARPHRD_ETHER ||
102+
(vport->dev->type != ARPHRD_ETHER &&
103+
vport->dev->type != ARPHRD_IPGRE) ||
103104
ovs_is_internal_dev(vport->dev)) {
104105
err = -EINVAL;
105106
goto error_put;
@@ -207,6 +208,15 @@ int ovs_netdev_send_tap(struct sk_buff *skb)
207208
}
208209
EXPORT_SYMBOL_GPL(ovs_netdev_send_tap);
209210

211+
int ovs_netdev_send_raw_tun(struct sk_buff *skb)
212+
{
213+
if (skb->mac_len)
214+
skb->protocol = ntohs(ETH_P_TEB);
215+
216+
return dev_queue_xmit(skb);
217+
}
218+
EXPORT_SYMBOL_GPL(ovs_netdev_send_raw_tun);
219+
210220
/* Returns null if this device is not attached to a datapath. */
211221
struct vport *ovs_netdev_get_vport(struct net_device *dev)
212222
{

net/openvswitch/vport-netdev.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,5 @@ void ovs_netdev_exit(void);
3535
void ovs_netdev_tunnel_destroy(struct vport *vport);
3636

3737
int ovs_netdev_send_tap(struct sk_buff *skb);
38+
int ovs_netdev_send_raw_tun(struct sk_buff *skb);
3839
#endif /* vport_netdev.h */

0 commit comments

Comments
 (0)