0001
0002
0003
0004
0005
0006
0007
0008 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
0009
0010 #include <linux/kernel.h>
0011 #include <linux/module.h>
0012 #include <linux/etherdevice.h>
0013 #include <linux/hash.h>
0014 #include <net/dst_metadata.h>
0015 #include <net/gro_cells.h>
0016 #include <net/rtnetlink.h>
0017 #include <net/protocol.h>
0018 #include <net/ip6_tunnel.h>
0019 #include <net/ip_tunnels.h>
0020 #include <net/udp_tunnel.h>
0021 #include <net/bareudp.h>
0022
0023 #define BAREUDP_BASE_HLEN sizeof(struct udphdr)
0024 #define BAREUDP_IPV4_HLEN (sizeof(struct iphdr) + \
0025 sizeof(struct udphdr))
0026 #define BAREUDP_IPV6_HLEN (sizeof(struct ipv6hdr) + \
0027 sizeof(struct udphdr))
0028
0029 static bool log_ecn_error = true;
0030 module_param(log_ecn_error, bool, 0644);
0031 MODULE_PARM_DESC(log_ecn_error, "Log packets received with corrupted ECN");
0032
0033
0034
0035 static unsigned int bareudp_net_id;
0036
0037 struct bareudp_net {
0038 struct list_head bareudp_list;
0039 };
0040
0041 struct bareudp_conf {
0042 __be16 ethertype;
0043 __be16 port;
0044 u16 sport_min;
0045 bool multi_proto_mode;
0046 };
0047
0048
0049 struct bareudp_dev {
0050 struct net *net;
0051 struct net_device *dev;
0052 __be16 ethertype;
0053 __be16 port;
0054 u16 sport_min;
0055 bool multi_proto_mode;
0056 struct socket __rcu *sock;
0057 struct list_head next;
0058 struct gro_cells gro_cells;
0059 };
0060
0061 static int bareudp_udp_encap_recv(struct sock *sk, struct sk_buff *skb)
0062 {
0063 struct metadata_dst *tun_dst = NULL;
0064 struct bareudp_dev *bareudp;
0065 unsigned short family;
0066 unsigned int len;
0067 __be16 proto;
0068 void *oiph;
0069 int err;
0070
0071 bareudp = rcu_dereference_sk_user_data(sk);
0072 if (!bareudp)
0073 goto drop;
0074
0075 if (skb->protocol == htons(ETH_P_IP))
0076 family = AF_INET;
0077 else
0078 family = AF_INET6;
0079
0080 if (bareudp->ethertype == htons(ETH_P_IP)) {
0081 __u8 ipversion;
0082
0083 if (skb_copy_bits(skb, BAREUDP_BASE_HLEN, &ipversion,
0084 sizeof(ipversion))) {
0085 bareudp->dev->stats.rx_dropped++;
0086 goto drop;
0087 }
0088 ipversion >>= 4;
0089
0090 if (ipversion == 4) {
0091 proto = htons(ETH_P_IP);
0092 } else if (ipversion == 6 && bareudp->multi_proto_mode) {
0093 proto = htons(ETH_P_IPV6);
0094 } else {
0095 bareudp->dev->stats.rx_dropped++;
0096 goto drop;
0097 }
0098 } else if (bareudp->ethertype == htons(ETH_P_MPLS_UC)) {
0099 struct iphdr *tunnel_hdr;
0100
0101 tunnel_hdr = (struct iphdr *)skb_network_header(skb);
0102 if (tunnel_hdr->version == 4) {
0103 if (!ipv4_is_multicast(tunnel_hdr->daddr)) {
0104 proto = bareudp->ethertype;
0105 } else if (bareudp->multi_proto_mode &&
0106 ipv4_is_multicast(tunnel_hdr->daddr)) {
0107 proto = htons(ETH_P_MPLS_MC);
0108 } else {
0109 bareudp->dev->stats.rx_dropped++;
0110 goto drop;
0111 }
0112 } else {
0113 int addr_type;
0114 struct ipv6hdr *tunnel_hdr_v6;
0115
0116 tunnel_hdr_v6 = (struct ipv6hdr *)skb_network_header(skb);
0117 addr_type =
0118 ipv6_addr_type((struct in6_addr *)&tunnel_hdr_v6->daddr);
0119 if (!(addr_type & IPV6_ADDR_MULTICAST)) {
0120 proto = bareudp->ethertype;
0121 } else if (bareudp->multi_proto_mode &&
0122 (addr_type & IPV6_ADDR_MULTICAST)) {
0123 proto = htons(ETH_P_MPLS_MC);
0124 } else {
0125 bareudp->dev->stats.rx_dropped++;
0126 goto drop;
0127 }
0128 }
0129 } else {
0130 proto = bareudp->ethertype;
0131 }
0132
0133 if (iptunnel_pull_header(skb, BAREUDP_BASE_HLEN,
0134 proto,
0135 !net_eq(bareudp->net,
0136 dev_net(bareudp->dev)))) {
0137 bareudp->dev->stats.rx_dropped++;
0138 goto drop;
0139 }
0140 tun_dst = udp_tun_rx_dst(skb, family, TUNNEL_KEY, 0, 0);
0141 if (!tun_dst) {
0142 bareudp->dev->stats.rx_dropped++;
0143 goto drop;
0144 }
0145 skb_dst_set(skb, &tun_dst->dst);
0146 skb->dev = bareudp->dev;
0147 oiph = skb_network_header(skb);
0148 skb_reset_network_header(skb);
0149 skb_reset_mac_header(skb);
0150
0151 if (!ipv6_mod_enabled() || family == AF_INET)
0152 err = IP_ECN_decapsulate(oiph, skb);
0153 else
0154 err = IP6_ECN_decapsulate(oiph, skb);
0155
0156 if (unlikely(err)) {
0157 if (log_ecn_error) {
0158 if (!ipv6_mod_enabled() || family == AF_INET)
0159 net_info_ratelimited("non-ECT from %pI4 "
0160 "with TOS=%#x\n",
0161 &((struct iphdr *)oiph)->saddr,
0162 ((struct iphdr *)oiph)->tos);
0163 else
0164 net_info_ratelimited("non-ECT from %pI6\n",
0165 &((struct ipv6hdr *)oiph)->saddr);
0166 }
0167 if (err > 1) {
0168 ++bareudp->dev->stats.rx_frame_errors;
0169 ++bareudp->dev->stats.rx_errors;
0170 goto drop;
0171 }
0172 }
0173
0174 len = skb->len;
0175 err = gro_cells_receive(&bareudp->gro_cells, skb);
0176 if (likely(err == NET_RX_SUCCESS))
0177 dev_sw_netstats_rx_add(bareudp->dev, len);
0178
0179 return 0;
0180 drop:
0181
0182 kfree_skb(skb);
0183
0184 return 0;
0185 }
0186
0187 static int bareudp_err_lookup(struct sock *sk, struct sk_buff *skb)
0188 {
0189 return 0;
0190 }
0191
0192 static int bareudp_init(struct net_device *dev)
0193 {
0194 struct bareudp_dev *bareudp = netdev_priv(dev);
0195 int err;
0196
0197 dev->tstats = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats);
0198 if (!dev->tstats)
0199 return -ENOMEM;
0200
0201 err = gro_cells_init(&bareudp->gro_cells, dev);
0202 if (err) {
0203 free_percpu(dev->tstats);
0204 return err;
0205 }
0206 return 0;
0207 }
0208
0209 static void bareudp_uninit(struct net_device *dev)
0210 {
0211 struct bareudp_dev *bareudp = netdev_priv(dev);
0212
0213 gro_cells_destroy(&bareudp->gro_cells);
0214 free_percpu(dev->tstats);
0215 }
0216
0217 static struct socket *bareudp_create_sock(struct net *net, __be16 port)
0218 {
0219 struct udp_port_cfg udp_conf;
0220 struct socket *sock;
0221 int err;
0222
0223 memset(&udp_conf, 0, sizeof(udp_conf));
0224
0225 if (ipv6_mod_enabled())
0226 udp_conf.family = AF_INET6;
0227 else
0228 udp_conf.family = AF_INET;
0229
0230 udp_conf.local_udp_port = port;
0231
0232 err = udp_sock_create(net, &udp_conf, &sock);
0233 if (err < 0)
0234 return ERR_PTR(err);
0235
0236 udp_allow_gso(sock->sk);
0237 return sock;
0238 }
0239
0240
0241 static int bareudp_socket_create(struct bareudp_dev *bareudp, __be16 port)
0242 {
0243 struct udp_tunnel_sock_cfg tunnel_cfg;
0244 struct socket *sock;
0245
0246 sock = bareudp_create_sock(bareudp->net, port);
0247 if (IS_ERR(sock))
0248 return PTR_ERR(sock);
0249
0250
0251 memset(&tunnel_cfg, 0, sizeof(tunnel_cfg));
0252 tunnel_cfg.sk_user_data = bareudp;
0253 tunnel_cfg.encap_type = 1;
0254 tunnel_cfg.encap_rcv = bareudp_udp_encap_recv;
0255 tunnel_cfg.encap_err_lookup = bareudp_err_lookup;
0256 tunnel_cfg.encap_destroy = NULL;
0257 setup_udp_tunnel_sock(bareudp->net, sock, &tunnel_cfg);
0258
0259 rcu_assign_pointer(bareudp->sock, sock);
0260 return 0;
0261 }
0262
0263 static int bareudp_open(struct net_device *dev)
0264 {
0265 struct bareudp_dev *bareudp = netdev_priv(dev);
0266 int ret = 0;
0267
0268 ret = bareudp_socket_create(bareudp, bareudp->port);
0269 return ret;
0270 }
0271
0272 static void bareudp_sock_release(struct bareudp_dev *bareudp)
0273 {
0274 struct socket *sock;
0275
0276 sock = bareudp->sock;
0277 rcu_assign_pointer(bareudp->sock, NULL);
0278 synchronize_net();
0279 udp_tunnel_sock_release(sock);
0280 }
0281
0282 static int bareudp_stop(struct net_device *dev)
0283 {
0284 struct bareudp_dev *bareudp = netdev_priv(dev);
0285
0286 bareudp_sock_release(bareudp);
0287 return 0;
0288 }
0289
0290 static int bareudp_xmit_skb(struct sk_buff *skb, struct net_device *dev,
0291 struct bareudp_dev *bareudp,
0292 const struct ip_tunnel_info *info)
0293 {
0294 bool xnet = !net_eq(bareudp->net, dev_net(bareudp->dev));
0295 bool use_cache = ip_tunnel_dst_cache_usable(skb, info);
0296 struct socket *sock = rcu_dereference(bareudp->sock);
0297 bool udp_sum = !!(info->key.tun_flags & TUNNEL_CSUM);
0298 const struct ip_tunnel_key *key = &info->key;
0299 struct rtable *rt;
0300 __be16 sport, df;
0301 int min_headroom;
0302 __u8 tos, ttl;
0303 __be32 saddr;
0304 int err;
0305
0306 if (!sock)
0307 return -ESHUTDOWN;
0308
0309 rt = ip_route_output_tunnel(skb, dev, bareudp->net, &saddr, info,
0310 IPPROTO_UDP, use_cache);
0311
0312 if (IS_ERR(rt))
0313 return PTR_ERR(rt);
0314
0315 skb_tunnel_check_pmtu(skb, &rt->dst,
0316 BAREUDP_IPV4_HLEN + info->options_len, false);
0317
0318 sport = udp_flow_src_port(bareudp->net, skb,
0319 bareudp->sport_min, USHRT_MAX,
0320 true);
0321 tos = ip_tunnel_ecn_encap(key->tos, ip_hdr(skb), skb);
0322 ttl = key->ttl;
0323 df = key->tun_flags & TUNNEL_DONT_FRAGMENT ? htons(IP_DF) : 0;
0324 skb_scrub_packet(skb, xnet);
0325
0326 err = -ENOSPC;
0327 if (!skb_pull(skb, skb_network_offset(skb)))
0328 goto free_dst;
0329
0330 min_headroom = LL_RESERVED_SPACE(rt->dst.dev) + rt->dst.header_len +
0331 BAREUDP_BASE_HLEN + info->options_len + sizeof(struct iphdr);
0332
0333 err = skb_cow_head(skb, min_headroom);
0334 if (unlikely(err))
0335 goto free_dst;
0336
0337 err = udp_tunnel_handle_offloads(skb, udp_sum);
0338 if (err)
0339 goto free_dst;
0340
0341 skb_set_inner_protocol(skb, bareudp->ethertype);
0342 udp_tunnel_xmit_skb(rt, sock->sk, skb, saddr, info->key.u.ipv4.dst,
0343 tos, ttl, df, sport, bareudp->port,
0344 !net_eq(bareudp->net, dev_net(bareudp->dev)),
0345 !(info->key.tun_flags & TUNNEL_CSUM));
0346 return 0;
0347
0348 free_dst:
0349 dst_release(&rt->dst);
0350 return err;
0351 }
0352
0353 static int bareudp6_xmit_skb(struct sk_buff *skb, struct net_device *dev,
0354 struct bareudp_dev *bareudp,
0355 const struct ip_tunnel_info *info)
0356 {
0357 bool xnet = !net_eq(bareudp->net, dev_net(bareudp->dev));
0358 bool use_cache = ip_tunnel_dst_cache_usable(skb, info);
0359 struct socket *sock = rcu_dereference(bareudp->sock);
0360 bool udp_sum = !!(info->key.tun_flags & TUNNEL_CSUM);
0361 const struct ip_tunnel_key *key = &info->key;
0362 struct dst_entry *dst = NULL;
0363 struct in6_addr saddr, daddr;
0364 int min_headroom;
0365 __u8 prio, ttl;
0366 __be16 sport;
0367 int err;
0368
0369 if (!sock)
0370 return -ESHUTDOWN;
0371
0372 dst = ip6_dst_lookup_tunnel(skb, dev, bareudp->net, sock, &saddr, info,
0373 IPPROTO_UDP, use_cache);
0374 if (IS_ERR(dst))
0375 return PTR_ERR(dst);
0376
0377 skb_tunnel_check_pmtu(skb, dst, BAREUDP_IPV6_HLEN + info->options_len,
0378 false);
0379
0380 sport = udp_flow_src_port(bareudp->net, skb,
0381 bareudp->sport_min, USHRT_MAX,
0382 true);
0383 prio = ip_tunnel_ecn_encap(key->tos, ip_hdr(skb), skb);
0384 ttl = key->ttl;
0385
0386 skb_scrub_packet(skb, xnet);
0387
0388 err = -ENOSPC;
0389 if (!skb_pull(skb, skb_network_offset(skb)))
0390 goto free_dst;
0391
0392 min_headroom = LL_RESERVED_SPACE(dst->dev) + dst->header_len +
0393 BAREUDP_BASE_HLEN + info->options_len + sizeof(struct ipv6hdr);
0394
0395 err = skb_cow_head(skb, min_headroom);
0396 if (unlikely(err))
0397 goto free_dst;
0398
0399 err = udp_tunnel_handle_offloads(skb, udp_sum);
0400 if (err)
0401 goto free_dst;
0402
0403 daddr = info->key.u.ipv6.dst;
0404 udp_tunnel6_xmit_skb(dst, sock->sk, skb, dev,
0405 &saddr, &daddr, prio, ttl,
0406 info->key.label, sport, bareudp->port,
0407 !(info->key.tun_flags & TUNNEL_CSUM));
0408 return 0;
0409
0410 free_dst:
0411 dst_release(dst);
0412 return err;
0413 }
0414
0415 static bool bareudp_proto_valid(struct bareudp_dev *bareudp, __be16 proto)
0416 {
0417 if (bareudp->ethertype == proto)
0418 return true;
0419
0420 if (!bareudp->multi_proto_mode)
0421 return false;
0422
0423 if (bareudp->ethertype == htons(ETH_P_MPLS_UC) &&
0424 proto == htons(ETH_P_MPLS_MC))
0425 return true;
0426
0427 if (bareudp->ethertype == htons(ETH_P_IP) &&
0428 proto == htons(ETH_P_IPV6))
0429 return true;
0430
0431 return false;
0432 }
0433
0434 static netdev_tx_t bareudp_xmit(struct sk_buff *skb, struct net_device *dev)
0435 {
0436 struct bareudp_dev *bareudp = netdev_priv(dev);
0437 struct ip_tunnel_info *info = NULL;
0438 int err;
0439
0440 if (!bareudp_proto_valid(bareudp, skb->protocol)) {
0441 err = -EINVAL;
0442 goto tx_error;
0443 }
0444
0445 info = skb_tunnel_info(skb);
0446 if (unlikely(!info || !(info->mode & IP_TUNNEL_INFO_TX))) {
0447 err = -EINVAL;
0448 goto tx_error;
0449 }
0450
0451 rcu_read_lock();
0452 if (ipv6_mod_enabled() && info->mode & IP_TUNNEL_INFO_IPV6)
0453 err = bareudp6_xmit_skb(skb, dev, bareudp, info);
0454 else
0455 err = bareudp_xmit_skb(skb, dev, bareudp, info);
0456
0457 rcu_read_unlock();
0458
0459 if (likely(!err))
0460 return NETDEV_TX_OK;
0461 tx_error:
0462 dev_kfree_skb(skb);
0463
0464 if (err == -ELOOP)
0465 dev->stats.collisions++;
0466 else if (err == -ENETUNREACH)
0467 dev->stats.tx_carrier_errors++;
0468
0469 dev->stats.tx_errors++;
0470 return NETDEV_TX_OK;
0471 }
0472
0473 static int bareudp_fill_metadata_dst(struct net_device *dev,
0474 struct sk_buff *skb)
0475 {
0476 struct ip_tunnel_info *info = skb_tunnel_info(skb);
0477 struct bareudp_dev *bareudp = netdev_priv(dev);
0478 bool use_cache;
0479
0480 use_cache = ip_tunnel_dst_cache_usable(skb, info);
0481
0482 if (!ipv6_mod_enabled() || ip_tunnel_info_af(info) == AF_INET) {
0483 struct rtable *rt;
0484 __be32 saddr;
0485
0486 rt = ip_route_output_tunnel(skb, dev, bareudp->net, &saddr,
0487 info, IPPROTO_UDP, use_cache);
0488 if (IS_ERR(rt))
0489 return PTR_ERR(rt);
0490
0491 ip_rt_put(rt);
0492 info->key.u.ipv4.src = saddr;
0493 } else if (ip_tunnel_info_af(info) == AF_INET6) {
0494 struct dst_entry *dst;
0495 struct in6_addr saddr;
0496 struct socket *sock = rcu_dereference(bareudp->sock);
0497
0498 dst = ip6_dst_lookup_tunnel(skb, dev, bareudp->net, sock,
0499 &saddr, info, IPPROTO_UDP,
0500 use_cache);
0501 if (IS_ERR(dst))
0502 return PTR_ERR(dst);
0503
0504 dst_release(dst);
0505 info->key.u.ipv6.src = saddr;
0506 } else {
0507 return -EINVAL;
0508 }
0509
0510 info->key.tp_src = udp_flow_src_port(bareudp->net, skb,
0511 bareudp->sport_min,
0512 USHRT_MAX, true);
0513 info->key.tp_dst = bareudp->port;
0514 return 0;
0515 }
0516
0517 static const struct net_device_ops bareudp_netdev_ops = {
0518 .ndo_init = bareudp_init,
0519 .ndo_uninit = bareudp_uninit,
0520 .ndo_open = bareudp_open,
0521 .ndo_stop = bareudp_stop,
0522 .ndo_start_xmit = bareudp_xmit,
0523 .ndo_get_stats64 = dev_get_tstats64,
0524 .ndo_fill_metadata_dst = bareudp_fill_metadata_dst,
0525 };
0526
0527 static const struct nla_policy bareudp_policy[IFLA_BAREUDP_MAX + 1] = {
0528 [IFLA_BAREUDP_PORT] = { .type = NLA_U16 },
0529 [IFLA_BAREUDP_ETHERTYPE] = { .type = NLA_U16 },
0530 [IFLA_BAREUDP_SRCPORT_MIN] = { .type = NLA_U16 },
0531 [IFLA_BAREUDP_MULTIPROTO_MODE] = { .type = NLA_FLAG },
0532 };
0533
0534
0535 static const struct device_type bareudp_type = {
0536 .name = "bareudp",
0537 };
0538
0539
0540 static void bareudp_setup(struct net_device *dev)
0541 {
0542 dev->netdev_ops = &bareudp_netdev_ops;
0543 dev->needs_free_netdev = true;
0544 SET_NETDEV_DEVTYPE(dev, &bareudp_type);
0545 dev->features |= NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_FRAGLIST;
0546 dev->features |= NETIF_F_RXCSUM;
0547 dev->features |= NETIF_F_LLTX;
0548 dev->features |= NETIF_F_GSO_SOFTWARE;
0549 dev->hw_features |= NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_FRAGLIST;
0550 dev->hw_features |= NETIF_F_RXCSUM;
0551 dev->hw_features |= NETIF_F_GSO_SOFTWARE;
0552 dev->hard_header_len = 0;
0553 dev->addr_len = 0;
0554 dev->mtu = ETH_DATA_LEN;
0555 dev->min_mtu = IPV4_MIN_MTU;
0556 dev->max_mtu = IP_MAX_MTU - BAREUDP_BASE_HLEN;
0557 dev->type = ARPHRD_NONE;
0558 netif_keep_dst(dev);
0559 dev->priv_flags |= IFF_NO_QUEUE;
0560 dev->flags = IFF_POINTOPOINT | IFF_NOARP | IFF_MULTICAST;
0561 }
0562
0563 static int bareudp_validate(struct nlattr *tb[], struct nlattr *data[],
0564 struct netlink_ext_ack *extack)
0565 {
0566 if (!data) {
0567 NL_SET_ERR_MSG(extack,
0568 "Not enough attributes provided to perform the operation");
0569 return -EINVAL;
0570 }
0571 return 0;
0572 }
0573
0574 static int bareudp2info(struct nlattr *data[], struct bareudp_conf *conf,
0575 struct netlink_ext_ack *extack)
0576 {
0577 memset(conf, 0, sizeof(*conf));
0578
0579 if (!data[IFLA_BAREUDP_PORT]) {
0580 NL_SET_ERR_MSG(extack, "port not specified");
0581 return -EINVAL;
0582 }
0583 if (!data[IFLA_BAREUDP_ETHERTYPE]) {
0584 NL_SET_ERR_MSG(extack, "ethertype not specified");
0585 return -EINVAL;
0586 }
0587
0588 conf->port = nla_get_u16(data[IFLA_BAREUDP_PORT]);
0589 conf->ethertype = nla_get_u16(data[IFLA_BAREUDP_ETHERTYPE]);
0590
0591 if (data[IFLA_BAREUDP_SRCPORT_MIN])
0592 conf->sport_min = nla_get_u16(data[IFLA_BAREUDP_SRCPORT_MIN]);
0593
0594 if (data[IFLA_BAREUDP_MULTIPROTO_MODE])
0595 conf->multi_proto_mode = true;
0596
0597 return 0;
0598 }
0599
0600 static struct bareudp_dev *bareudp_find_dev(struct bareudp_net *bn,
0601 const struct bareudp_conf *conf)
0602 {
0603 struct bareudp_dev *bareudp, *t = NULL;
0604
0605 list_for_each_entry(bareudp, &bn->bareudp_list, next) {
0606 if (conf->port == bareudp->port)
0607 t = bareudp;
0608 }
0609 return t;
0610 }
0611
0612 static int bareudp_configure(struct net *net, struct net_device *dev,
0613 struct bareudp_conf *conf,
0614 struct netlink_ext_ack *extack)
0615 {
0616 struct bareudp_net *bn = net_generic(net, bareudp_net_id);
0617 struct bareudp_dev *t, *bareudp = netdev_priv(dev);
0618 int err;
0619
0620 bareudp->net = net;
0621 bareudp->dev = dev;
0622 t = bareudp_find_dev(bn, conf);
0623 if (t) {
0624 NL_SET_ERR_MSG(extack, "Another bareudp device using the same port already exists");
0625 return -EBUSY;
0626 }
0627
0628 if (conf->multi_proto_mode &&
0629 (conf->ethertype != htons(ETH_P_MPLS_UC) &&
0630 conf->ethertype != htons(ETH_P_IP))) {
0631 NL_SET_ERR_MSG(extack, "Cannot set multiproto mode for this ethertype (only IPv4 and unicast MPLS are supported)");
0632 return -EINVAL;
0633 }
0634
0635 bareudp->port = conf->port;
0636 bareudp->ethertype = conf->ethertype;
0637 bareudp->sport_min = conf->sport_min;
0638 bareudp->multi_proto_mode = conf->multi_proto_mode;
0639
0640 err = register_netdevice(dev);
0641 if (err)
0642 return err;
0643
0644 list_add(&bareudp->next, &bn->bareudp_list);
0645 return 0;
0646 }
0647
0648 static int bareudp_link_config(struct net_device *dev,
0649 struct nlattr *tb[])
0650 {
0651 int err;
0652
0653 if (tb[IFLA_MTU]) {
0654 err = dev_set_mtu(dev, nla_get_u32(tb[IFLA_MTU]));
0655 if (err)
0656 return err;
0657 }
0658 return 0;
0659 }
0660
0661 static void bareudp_dellink(struct net_device *dev, struct list_head *head)
0662 {
0663 struct bareudp_dev *bareudp = netdev_priv(dev);
0664
0665 list_del(&bareudp->next);
0666 unregister_netdevice_queue(dev, head);
0667 }
0668
0669 static int bareudp_newlink(struct net *net, struct net_device *dev,
0670 struct nlattr *tb[], struct nlattr *data[],
0671 struct netlink_ext_ack *extack)
0672 {
0673 struct bareudp_conf conf;
0674 int err;
0675
0676 err = bareudp2info(data, &conf, extack);
0677 if (err)
0678 return err;
0679
0680 err = bareudp_configure(net, dev, &conf, extack);
0681 if (err)
0682 return err;
0683
0684 err = bareudp_link_config(dev, tb);
0685 if (err)
0686 goto err_unconfig;
0687
0688 return 0;
0689
0690 err_unconfig:
0691 bareudp_dellink(dev, NULL);
0692 return err;
0693 }
0694
0695 static size_t bareudp_get_size(const struct net_device *dev)
0696 {
0697 return nla_total_size(sizeof(__be16)) +
0698 nla_total_size(sizeof(__be16)) +
0699 nla_total_size(sizeof(__u16)) +
0700 nla_total_size(0) +
0701 0;
0702 }
0703
0704 static int bareudp_fill_info(struct sk_buff *skb, const struct net_device *dev)
0705 {
0706 struct bareudp_dev *bareudp = netdev_priv(dev);
0707
0708 if (nla_put_be16(skb, IFLA_BAREUDP_PORT, bareudp->port))
0709 goto nla_put_failure;
0710 if (nla_put_be16(skb, IFLA_BAREUDP_ETHERTYPE, bareudp->ethertype))
0711 goto nla_put_failure;
0712 if (nla_put_u16(skb, IFLA_BAREUDP_SRCPORT_MIN, bareudp->sport_min))
0713 goto nla_put_failure;
0714 if (bareudp->multi_proto_mode &&
0715 nla_put_flag(skb, IFLA_BAREUDP_MULTIPROTO_MODE))
0716 goto nla_put_failure;
0717
0718 return 0;
0719
0720 nla_put_failure:
0721 return -EMSGSIZE;
0722 }
0723
0724 static struct rtnl_link_ops bareudp_link_ops __read_mostly = {
0725 .kind = "bareudp",
0726 .maxtype = IFLA_BAREUDP_MAX,
0727 .policy = bareudp_policy,
0728 .priv_size = sizeof(struct bareudp_dev),
0729 .setup = bareudp_setup,
0730 .validate = bareudp_validate,
0731 .newlink = bareudp_newlink,
0732 .dellink = bareudp_dellink,
0733 .get_size = bareudp_get_size,
0734 .fill_info = bareudp_fill_info,
0735 };
0736
0737 static __net_init int bareudp_init_net(struct net *net)
0738 {
0739 struct bareudp_net *bn = net_generic(net, bareudp_net_id);
0740
0741 INIT_LIST_HEAD(&bn->bareudp_list);
0742 return 0;
0743 }
0744
0745 static void bareudp_destroy_tunnels(struct net *net, struct list_head *head)
0746 {
0747 struct bareudp_net *bn = net_generic(net, bareudp_net_id);
0748 struct bareudp_dev *bareudp, *next;
0749
0750 list_for_each_entry_safe(bareudp, next, &bn->bareudp_list, next)
0751 unregister_netdevice_queue(bareudp->dev, head);
0752 }
0753
0754 static void __net_exit bareudp_exit_batch_net(struct list_head *net_list)
0755 {
0756 struct net *net;
0757 LIST_HEAD(list);
0758
0759 rtnl_lock();
0760 list_for_each_entry(net, net_list, exit_list)
0761 bareudp_destroy_tunnels(net, &list);
0762
0763
0764 unregister_netdevice_many(&list);
0765 rtnl_unlock();
0766 }
0767
0768 static struct pernet_operations bareudp_net_ops = {
0769 .init = bareudp_init_net,
0770 .exit_batch = bareudp_exit_batch_net,
0771 .id = &bareudp_net_id,
0772 .size = sizeof(struct bareudp_net),
0773 };
0774
0775 static int __init bareudp_init_module(void)
0776 {
0777 int rc;
0778
0779 rc = register_pernet_subsys(&bareudp_net_ops);
0780 if (rc)
0781 goto out1;
0782
0783 rc = rtnl_link_register(&bareudp_link_ops);
0784 if (rc)
0785 goto out2;
0786
0787 return 0;
0788 out2:
0789 unregister_pernet_subsys(&bareudp_net_ops);
0790 out1:
0791 return rc;
0792 }
0793 late_initcall(bareudp_init_module);
0794
0795 static void __exit bareudp_cleanup_module(void)
0796 {
0797 rtnl_link_unregister(&bareudp_link_ops);
0798 unregister_pernet_subsys(&bareudp_net_ops);
0799 }
0800 module_exit(bareudp_cleanup_module);
0801
0802 MODULE_ALIAS_RTNL_LINK("bareudp");
0803 MODULE_LICENSE("GPL");
0804 MODULE_AUTHOR("Martin Varghese <martin.varghese@nokia.com>");
0805 MODULE_DESCRIPTION("Interface driver for UDP encapsulated traffic");