linux/net/l2tp/l2tp_netlink.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * L2TP netlink layer, for management
   4 *
   5 * Copyright (c) 2008,2009,2010 Katalix Systems Ltd
   6 *
   7 * Partly based on the IrDA nelink implementation
   8 * (see net/irda/irnetlink.c) which is:
   9 * Copyright (c) 2007 Samuel Ortiz <samuel@sortiz.org>
  10 * which is in turn partly based on the wireless netlink code:
  11 * Copyright 2006 Johannes Berg <johannes@sipsolutions.net>
  12 */
  13
  14#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  15
  16#include <net/sock.h>
  17#include <net/genetlink.h>
  18#include <net/udp.h>
  19#include <linux/in.h>
  20#include <linux/udp.h>
  21#include <linux/socket.h>
  22#include <linux/module.h>
  23#include <linux/list.h>
  24#include <net/net_namespace.h>
  25
  26#include <linux/l2tp.h>
  27
  28#include "l2tp_core.h"
  29
  30
  31static struct genl_family l2tp_nl_family;
  32
  33static const struct genl_multicast_group l2tp_multicast_group[] = {
  34        {
  35                .name = L2TP_GENL_MCGROUP,
  36        },
  37};
  38
  39static int l2tp_nl_tunnel_send(struct sk_buff *skb, u32 portid, u32 seq,
  40                               int flags, struct l2tp_tunnel *tunnel, u8 cmd);
  41static int l2tp_nl_session_send(struct sk_buff *skb, u32 portid, u32 seq,
  42                                int flags, struct l2tp_session *session,
  43                                u8 cmd);
  44
  45/* Accessed under genl lock */
  46static const struct l2tp_nl_cmd_ops *l2tp_nl_cmd_ops[__L2TP_PWTYPE_MAX];
  47
  48static struct l2tp_session *l2tp_nl_session_get(struct genl_info *info)
  49{
  50        u32 tunnel_id;
  51        u32 session_id;
  52        char *ifname;
  53        struct l2tp_tunnel *tunnel;
  54        struct l2tp_session *session = NULL;
  55        struct net *net = genl_info_net(info);
  56
  57        if (info->attrs[L2TP_ATTR_IFNAME]) {
  58                ifname = nla_data(info->attrs[L2TP_ATTR_IFNAME]);
  59                session = l2tp_session_get_by_ifname(net, ifname);
  60        } else if ((info->attrs[L2TP_ATTR_SESSION_ID]) &&
  61                   (info->attrs[L2TP_ATTR_CONN_ID])) {
  62                tunnel_id = nla_get_u32(info->attrs[L2TP_ATTR_CONN_ID]);
  63                session_id = nla_get_u32(info->attrs[L2TP_ATTR_SESSION_ID]);
  64                tunnel = l2tp_tunnel_get(net, tunnel_id);
  65                if (tunnel) {
  66                        session = l2tp_tunnel_get_session(tunnel, session_id);
  67                        l2tp_tunnel_dec_refcount(tunnel);
  68                }
  69        }
  70
  71        return session;
  72}
  73
  74static int l2tp_nl_cmd_noop(struct sk_buff *skb, struct genl_info *info)
  75{
  76        struct sk_buff *msg;
  77        void *hdr;
  78        int ret = -ENOBUFS;
  79
  80        msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  81        if (!msg) {
  82                ret = -ENOMEM;
  83                goto out;
  84        }
  85
  86        hdr = genlmsg_put(msg, info->snd_portid, info->snd_seq,
  87                          &l2tp_nl_family, 0, L2TP_CMD_NOOP);
  88        if (!hdr) {
  89                ret = -EMSGSIZE;
  90                goto err_out;
  91        }
  92
  93        genlmsg_end(msg, hdr);
  94
  95        return genlmsg_unicast(genl_info_net(info), msg, info->snd_portid);
  96
  97err_out:
  98        nlmsg_free(msg);
  99
 100out:
 101        return ret;
 102}
 103
 104static int l2tp_tunnel_notify(struct genl_family *family,
 105                              struct genl_info *info,
 106                              struct l2tp_tunnel *tunnel,
 107                              u8 cmd)
 108{
 109        struct sk_buff *msg;
 110        int ret;
 111
 112        msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
 113        if (!msg)
 114                return -ENOMEM;
 115
 116        ret = l2tp_nl_tunnel_send(msg, info->snd_portid, info->snd_seq,
 117                                  NLM_F_ACK, tunnel, cmd);
 118
 119        if (ret >= 0) {
 120                ret = genlmsg_multicast_allns(family, msg, 0, 0, GFP_ATOMIC);
 121                /* We don't care if no one is listening */
 122                if (ret == -ESRCH)
 123                        ret = 0;
 124                return ret;
 125        }
 126
 127        nlmsg_free(msg);
 128
 129        return ret;
 130}
 131
 132static int l2tp_session_notify(struct genl_family *family,
 133                               struct genl_info *info,
 134                               struct l2tp_session *session,
 135                               u8 cmd)
 136{
 137        struct sk_buff *msg;
 138        int ret;
 139
 140        msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
 141        if (!msg)
 142                return -ENOMEM;
 143
 144        ret = l2tp_nl_session_send(msg, info->snd_portid, info->snd_seq,
 145                                   NLM_F_ACK, session, cmd);
 146
 147        if (ret >= 0) {
 148                ret = genlmsg_multicast_allns(family, msg, 0, 0, GFP_ATOMIC);
 149                /* We don't care if no one is listening */
 150                if (ret == -ESRCH)
 151                        ret = 0;
 152                return ret;
 153        }
 154
 155        nlmsg_free(msg);
 156
 157        return ret;
 158}
 159
 160static int l2tp_nl_cmd_tunnel_create(struct sk_buff *skb, struct genl_info *info)
 161{
 162        u32 tunnel_id;
 163        u32 peer_tunnel_id;
 164        int proto_version;
 165        int fd;
 166        int ret = 0;
 167        struct l2tp_tunnel_cfg cfg = { 0, };
 168        struct l2tp_tunnel *tunnel;
 169        struct net *net = genl_info_net(info);
 170
 171        if (!info->attrs[L2TP_ATTR_CONN_ID]) {
 172                ret = -EINVAL;
 173                goto out;
 174        }
 175        tunnel_id = nla_get_u32(info->attrs[L2TP_ATTR_CONN_ID]);
 176
 177        if (!info->attrs[L2TP_ATTR_PEER_CONN_ID]) {
 178                ret = -EINVAL;
 179                goto out;
 180        }
 181        peer_tunnel_id = nla_get_u32(info->attrs[L2TP_ATTR_PEER_CONN_ID]);
 182
 183        if (!info->attrs[L2TP_ATTR_PROTO_VERSION]) {
 184                ret = -EINVAL;
 185                goto out;
 186        }
 187        proto_version = nla_get_u8(info->attrs[L2TP_ATTR_PROTO_VERSION]);
 188
 189        if (!info->attrs[L2TP_ATTR_ENCAP_TYPE]) {
 190                ret = -EINVAL;
 191                goto out;
 192        }
 193        cfg.encap = nla_get_u16(info->attrs[L2TP_ATTR_ENCAP_TYPE]);
 194
 195        fd = -1;
 196        if (info->attrs[L2TP_ATTR_FD]) {
 197                fd = nla_get_u32(info->attrs[L2TP_ATTR_FD]);
 198        } else {
 199#if IS_ENABLED(CONFIG_IPV6)
 200                if (info->attrs[L2TP_ATTR_IP6_SADDR] &&
 201                    info->attrs[L2TP_ATTR_IP6_DADDR]) {
 202                        cfg.local_ip6 = nla_data(
 203                                info->attrs[L2TP_ATTR_IP6_SADDR]);
 204                        cfg.peer_ip6 = nla_data(
 205                                info->attrs[L2TP_ATTR_IP6_DADDR]);
 206                } else
 207#endif
 208                if (info->attrs[L2TP_ATTR_IP_SADDR] &&
 209                    info->attrs[L2TP_ATTR_IP_DADDR]) {
 210                        cfg.local_ip.s_addr = nla_get_in_addr(
 211                                info->attrs[L2TP_ATTR_IP_SADDR]);
 212                        cfg.peer_ip.s_addr = nla_get_in_addr(
 213                                info->attrs[L2TP_ATTR_IP_DADDR]);
 214                } else {
 215                        ret = -EINVAL;
 216                        goto out;
 217                }
 218                if (info->attrs[L2TP_ATTR_UDP_SPORT])
 219                        cfg.local_udp_port = nla_get_u16(info->attrs[L2TP_ATTR_UDP_SPORT]);
 220                if (info->attrs[L2TP_ATTR_UDP_DPORT])
 221                        cfg.peer_udp_port = nla_get_u16(info->attrs[L2TP_ATTR_UDP_DPORT]);
 222                cfg.use_udp_checksums = nla_get_flag(
 223                        info->attrs[L2TP_ATTR_UDP_CSUM]);
 224
 225#if IS_ENABLED(CONFIG_IPV6)
 226                cfg.udp6_zero_tx_checksums = nla_get_flag(
 227                        info->attrs[L2TP_ATTR_UDP_ZERO_CSUM6_TX]);
 228                cfg.udp6_zero_rx_checksums = nla_get_flag(
 229                        info->attrs[L2TP_ATTR_UDP_ZERO_CSUM6_RX]);
 230#endif
 231        }
 232
 233        if (info->attrs[L2TP_ATTR_DEBUG])
 234                cfg.debug = nla_get_u32(info->attrs[L2TP_ATTR_DEBUG]);
 235
 236        ret = -EINVAL;
 237        switch (cfg.encap) {
 238        case L2TP_ENCAPTYPE_UDP:
 239        case L2TP_ENCAPTYPE_IP:
 240                ret = l2tp_tunnel_create(net, fd, proto_version, tunnel_id,
 241                                         peer_tunnel_id, &cfg, &tunnel);
 242                break;
 243        }
 244
 245        if (ret < 0)
 246                goto out;
 247
 248        l2tp_tunnel_inc_refcount(tunnel);
 249        ret = l2tp_tunnel_register(tunnel, net, &cfg);
 250        if (ret < 0) {
 251                kfree(tunnel);
 252                goto out;
 253        }
 254        ret = l2tp_tunnel_notify(&l2tp_nl_family, info, tunnel,
 255                                 L2TP_CMD_TUNNEL_CREATE);
 256        l2tp_tunnel_dec_refcount(tunnel);
 257
 258out:
 259        return ret;
 260}
 261
 262static int l2tp_nl_cmd_tunnel_delete(struct sk_buff *skb, struct genl_info *info)
 263{
 264        struct l2tp_tunnel *tunnel;
 265        u32 tunnel_id;
 266        int ret = 0;
 267        struct net *net = genl_info_net(info);
 268
 269        if (!info->attrs[L2TP_ATTR_CONN_ID]) {
 270                ret = -EINVAL;
 271                goto out;
 272        }
 273        tunnel_id = nla_get_u32(info->attrs[L2TP_ATTR_CONN_ID]);
 274
 275        tunnel = l2tp_tunnel_get(net, tunnel_id);
 276        if (!tunnel) {
 277                ret = -ENODEV;
 278                goto out;
 279        }
 280
 281        l2tp_tunnel_notify(&l2tp_nl_family, info,
 282                           tunnel, L2TP_CMD_TUNNEL_DELETE);
 283
 284        l2tp_tunnel_delete(tunnel);
 285
 286        l2tp_tunnel_dec_refcount(tunnel);
 287
 288out:
 289        return ret;
 290}
 291
 292static int l2tp_nl_cmd_tunnel_modify(struct sk_buff *skb, struct genl_info *info)
 293{
 294        struct l2tp_tunnel *tunnel;
 295        u32 tunnel_id;
 296        int ret = 0;
 297        struct net *net = genl_info_net(info);
 298
 299        if (!info->attrs[L2TP_ATTR_CONN_ID]) {
 300                ret = -EINVAL;
 301                goto out;
 302        }
 303        tunnel_id = nla_get_u32(info->attrs[L2TP_ATTR_CONN_ID]);
 304
 305        tunnel = l2tp_tunnel_get(net, tunnel_id);
 306        if (!tunnel) {
 307                ret = -ENODEV;
 308                goto out;
 309        }
 310
 311        if (info->attrs[L2TP_ATTR_DEBUG])
 312                tunnel->debug = nla_get_u32(info->attrs[L2TP_ATTR_DEBUG]);
 313
 314        ret = l2tp_tunnel_notify(&l2tp_nl_family, info,
 315                                 tunnel, L2TP_CMD_TUNNEL_MODIFY);
 316
 317        l2tp_tunnel_dec_refcount(tunnel);
 318
 319out:
 320        return ret;
 321}
 322
 323static int l2tp_nl_tunnel_send(struct sk_buff *skb, u32 portid, u32 seq, int flags,
 324                               struct l2tp_tunnel *tunnel, u8 cmd)
 325{
 326        void *hdr;
 327        struct nlattr *nest;
 328        struct sock *sk = NULL;
 329        struct inet_sock *inet;
 330#if IS_ENABLED(CONFIG_IPV6)
 331        struct ipv6_pinfo *np = NULL;
 332#endif
 333
 334        hdr = genlmsg_put(skb, portid, seq, &l2tp_nl_family, flags, cmd);
 335        if (!hdr)
 336                return -EMSGSIZE;
 337
 338        if (nla_put_u8(skb, L2TP_ATTR_PROTO_VERSION, tunnel->version) ||
 339            nla_put_u32(skb, L2TP_ATTR_CONN_ID, tunnel->tunnel_id) ||
 340            nla_put_u32(skb, L2TP_ATTR_PEER_CONN_ID, tunnel->peer_tunnel_id) ||
 341            nla_put_u32(skb, L2TP_ATTR_DEBUG, tunnel->debug) ||
 342            nla_put_u16(skb, L2TP_ATTR_ENCAP_TYPE, tunnel->encap))
 343                goto nla_put_failure;
 344
 345        nest = nla_nest_start_noflag(skb, L2TP_ATTR_STATS);
 346        if (nest == NULL)
 347                goto nla_put_failure;
 348
 349        if (nla_put_u64_64bit(skb, L2TP_ATTR_TX_PACKETS,
 350                              atomic_long_read(&tunnel->stats.tx_packets),
 351                              L2TP_ATTR_STATS_PAD) ||
 352            nla_put_u64_64bit(skb, L2TP_ATTR_TX_BYTES,
 353                              atomic_long_read(&tunnel->stats.tx_bytes),
 354                              L2TP_ATTR_STATS_PAD) ||
 355            nla_put_u64_64bit(skb, L2TP_ATTR_TX_ERRORS,
 356                              atomic_long_read(&tunnel->stats.tx_errors),
 357                              L2TP_ATTR_STATS_PAD) ||
 358            nla_put_u64_64bit(skb, L2TP_ATTR_RX_PACKETS,
 359                              atomic_long_read(&tunnel->stats.rx_packets),
 360                              L2TP_ATTR_STATS_PAD) ||
 361            nla_put_u64_64bit(skb, L2TP_ATTR_RX_BYTES,
 362                              atomic_long_read(&tunnel->stats.rx_bytes),
 363                              L2TP_ATTR_STATS_PAD) ||
 364            nla_put_u64_64bit(skb, L2TP_ATTR_RX_SEQ_DISCARDS,
 365                              atomic_long_read(&tunnel->stats.rx_seq_discards),
 366                              L2TP_ATTR_STATS_PAD) ||
 367            nla_put_u64_64bit(skb, L2TP_ATTR_RX_OOS_PACKETS,
 368                              atomic_long_read(&tunnel->stats.rx_oos_packets),
 369                              L2TP_ATTR_STATS_PAD) ||
 370            nla_put_u64_64bit(skb, L2TP_ATTR_RX_ERRORS,
 371                              atomic_long_read(&tunnel->stats.rx_errors),
 372                              L2TP_ATTR_STATS_PAD))
 373                goto nla_put_failure;
 374        nla_nest_end(skb, nest);
 375
 376        sk = tunnel->sock;
 377        if (!sk)
 378                goto out;
 379
 380#if IS_ENABLED(CONFIG_IPV6)
 381        if (sk->sk_family == AF_INET6)
 382                np = inet6_sk(sk);
 383#endif
 384
 385        inet = inet_sk(sk);
 386
 387        switch (tunnel->encap) {
 388        case L2TP_ENCAPTYPE_UDP:
 389                switch (sk->sk_family) {
 390                case AF_INET:
 391                        if (nla_put_u8(skb, L2TP_ATTR_UDP_CSUM, !sk->sk_no_check_tx))
 392                                goto nla_put_failure;
 393                        break;
 394#if IS_ENABLED(CONFIG_IPV6)
 395                case AF_INET6:
 396                        if (udp_get_no_check6_tx(sk) &&
 397                            nla_put_flag(skb, L2TP_ATTR_UDP_ZERO_CSUM6_TX))
 398                                goto nla_put_failure;
 399                        if (udp_get_no_check6_rx(sk) &&
 400                            nla_put_flag(skb, L2TP_ATTR_UDP_ZERO_CSUM6_RX))
 401                                goto nla_put_failure;
 402                        break;
 403#endif
 404                }
 405                if (nla_put_u16(skb, L2TP_ATTR_UDP_SPORT, ntohs(inet->inet_sport)) ||
 406                    nla_put_u16(skb, L2TP_ATTR_UDP_DPORT, ntohs(inet->inet_dport)))
 407                        goto nla_put_failure;
 408                /* fall through  */
 409        case L2TP_ENCAPTYPE_IP:
 410#if IS_ENABLED(CONFIG_IPV6)
 411                if (np) {
 412                        if (nla_put_in6_addr(skb, L2TP_ATTR_IP6_SADDR,
 413                                             &np->saddr) ||
 414                            nla_put_in6_addr(skb, L2TP_ATTR_IP6_DADDR,
 415                                             &sk->sk_v6_daddr))
 416                                goto nla_put_failure;
 417                } else
 418#endif
 419                if (nla_put_in_addr(skb, L2TP_ATTR_IP_SADDR,
 420                                    inet->inet_saddr) ||
 421                    nla_put_in_addr(skb, L2TP_ATTR_IP_DADDR,
 422                                    inet->inet_daddr))
 423                        goto nla_put_failure;
 424                break;
 425        }
 426
 427out:
 428        genlmsg_end(skb, hdr);
 429        return 0;
 430
 431nla_put_failure:
 432        genlmsg_cancel(skb, hdr);
 433        return -1;
 434}
 435
 436static int l2tp_nl_cmd_tunnel_get(struct sk_buff *skb, struct genl_info *info)
 437{
 438        struct l2tp_tunnel *tunnel;
 439        struct sk_buff *msg;
 440        u32 tunnel_id;
 441        int ret = -ENOBUFS;
 442        struct net *net = genl_info_net(info);
 443
 444        if (!info->attrs[L2TP_ATTR_CONN_ID]) {
 445                ret = -EINVAL;
 446                goto err;
 447        }
 448
 449        tunnel_id = nla_get_u32(info->attrs[L2TP_ATTR_CONN_ID]);
 450
 451        msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
 452        if (!msg) {
 453                ret = -ENOMEM;
 454                goto err;
 455        }
 456
 457        tunnel = l2tp_tunnel_get(net, tunnel_id);
 458        if (!tunnel) {
 459                ret = -ENODEV;
 460                goto err_nlmsg;
 461        }
 462
 463        ret = l2tp_nl_tunnel_send(msg, info->snd_portid, info->snd_seq,
 464                                  NLM_F_ACK, tunnel, L2TP_CMD_TUNNEL_GET);
 465        if (ret < 0)
 466                goto err_nlmsg_tunnel;
 467
 468        l2tp_tunnel_dec_refcount(tunnel);
 469
 470        return genlmsg_unicast(net, msg, info->snd_portid);
 471
 472err_nlmsg_tunnel:
 473        l2tp_tunnel_dec_refcount(tunnel);
 474err_nlmsg:
 475        nlmsg_free(msg);
 476err:
 477        return ret;
 478}
 479
 480static int l2tp_nl_cmd_tunnel_dump(struct sk_buff *skb, struct netlink_callback *cb)
 481{
 482        int ti = cb->args[0];
 483        struct l2tp_tunnel *tunnel;
 484        struct net *net = sock_net(skb->sk);
 485
 486        for (;;) {
 487                tunnel = l2tp_tunnel_get_nth(net, ti);
 488                if (tunnel == NULL)
 489                        goto out;
 490
 491                if (l2tp_nl_tunnel_send(skb, NETLINK_CB(cb->skb).portid,
 492                                        cb->nlh->nlmsg_seq, NLM_F_MULTI,
 493                                        tunnel, L2TP_CMD_TUNNEL_GET) < 0) {
 494                        l2tp_tunnel_dec_refcount(tunnel);
 495                        goto out;
 496                }
 497                l2tp_tunnel_dec_refcount(tunnel);
 498
 499                ti++;
 500        }
 501
 502out:
 503        cb->args[0] = ti;
 504
 505        return skb->len;
 506}
 507
 508static int l2tp_nl_cmd_session_create(struct sk_buff *skb, struct genl_info *info)
 509{
 510        u32 tunnel_id = 0;
 511        u32 session_id;
 512        u32 peer_session_id;
 513        int ret = 0;
 514        struct l2tp_tunnel *tunnel;
 515        struct l2tp_session *session;
 516        struct l2tp_session_cfg cfg = { 0, };
 517        struct net *net = genl_info_net(info);
 518
 519        if (!info->attrs[L2TP_ATTR_CONN_ID]) {
 520                ret = -EINVAL;
 521                goto out;
 522        }
 523
 524        tunnel_id = nla_get_u32(info->attrs[L2TP_ATTR_CONN_ID]);
 525        tunnel = l2tp_tunnel_get(net, tunnel_id);
 526        if (!tunnel) {
 527                ret = -ENODEV;
 528                goto out;
 529        }
 530
 531        if (!info->attrs[L2TP_ATTR_SESSION_ID]) {
 532                ret = -EINVAL;
 533                goto out_tunnel;
 534        }
 535        session_id = nla_get_u32(info->attrs[L2TP_ATTR_SESSION_ID]);
 536
 537        if (!info->attrs[L2TP_ATTR_PEER_SESSION_ID]) {
 538                ret = -EINVAL;
 539                goto out_tunnel;
 540        }
 541        peer_session_id = nla_get_u32(info->attrs[L2TP_ATTR_PEER_SESSION_ID]);
 542
 543        if (!info->attrs[L2TP_ATTR_PW_TYPE]) {
 544                ret = -EINVAL;
 545                goto out_tunnel;
 546        }
 547        cfg.pw_type = nla_get_u16(info->attrs[L2TP_ATTR_PW_TYPE]);
 548        if (cfg.pw_type >= __L2TP_PWTYPE_MAX) {
 549                ret = -EINVAL;
 550                goto out_tunnel;
 551        }
 552
 553        /* L2TPv2 only accepts PPP pseudo-wires */
 554        if (tunnel->version == 2 && cfg.pw_type != L2TP_PWTYPE_PPP) {
 555                ret = -EPROTONOSUPPORT;
 556                goto out_tunnel;
 557        }
 558
 559        if (tunnel->version > 2) {
 560                if (info->attrs[L2TP_ATTR_L2SPEC_TYPE]) {
 561                        cfg.l2specific_type = nla_get_u8(info->attrs[L2TP_ATTR_L2SPEC_TYPE]);
 562                        if (cfg.l2specific_type != L2TP_L2SPECTYPE_DEFAULT &&
 563                            cfg.l2specific_type != L2TP_L2SPECTYPE_NONE) {
 564                                ret = -EINVAL;
 565                                goto out_tunnel;
 566                        }
 567                } else {
 568                        cfg.l2specific_type = L2TP_L2SPECTYPE_DEFAULT;
 569                }
 570
 571                if (info->attrs[L2TP_ATTR_COOKIE]) {
 572                        u16 len = nla_len(info->attrs[L2TP_ATTR_COOKIE]);
 573                        if (len > 8) {
 574                                ret = -EINVAL;
 575                                goto out_tunnel;
 576                        }
 577                        cfg.cookie_len = len;
 578                        memcpy(&cfg.cookie[0], nla_data(info->attrs[L2TP_ATTR_COOKIE]), len);
 579                }
 580                if (info->attrs[L2TP_ATTR_PEER_COOKIE]) {
 581                        u16 len = nla_len(info->attrs[L2TP_ATTR_PEER_COOKIE]);
 582                        if (len > 8) {
 583                                ret = -EINVAL;
 584                                goto out_tunnel;
 585                        }
 586                        cfg.peer_cookie_len = len;
 587                        memcpy(&cfg.peer_cookie[0], nla_data(info->attrs[L2TP_ATTR_PEER_COOKIE]), len);
 588                }
 589                if (info->attrs[L2TP_ATTR_IFNAME])
 590                        cfg.ifname = nla_data(info->attrs[L2TP_ATTR_IFNAME]);
 591        }
 592
 593        if (info->attrs[L2TP_ATTR_DEBUG])
 594                cfg.debug = nla_get_u32(info->attrs[L2TP_ATTR_DEBUG]);
 595
 596        if (info->attrs[L2TP_ATTR_RECV_SEQ])
 597                cfg.recv_seq = nla_get_u8(info->attrs[L2TP_ATTR_RECV_SEQ]);
 598
 599        if (info->attrs[L2TP_ATTR_SEND_SEQ])
 600                cfg.send_seq = nla_get_u8(info->attrs[L2TP_ATTR_SEND_SEQ]);
 601
 602        if (info->attrs[L2TP_ATTR_LNS_MODE])
 603                cfg.lns_mode = nla_get_u8(info->attrs[L2TP_ATTR_LNS_MODE]);
 604
 605        if (info->attrs[L2TP_ATTR_RECV_TIMEOUT])
 606                cfg.reorder_timeout = nla_get_msecs(info->attrs[L2TP_ATTR_RECV_TIMEOUT]);
 607
 608#ifdef CONFIG_MODULES
 609        if (l2tp_nl_cmd_ops[cfg.pw_type] == NULL) {
 610                genl_unlock();
 611                request_module("net-l2tp-type-%u", cfg.pw_type);
 612                genl_lock();
 613        }
 614#endif
 615        if ((l2tp_nl_cmd_ops[cfg.pw_type] == NULL) ||
 616            (l2tp_nl_cmd_ops[cfg.pw_type]->session_create == NULL)) {
 617                ret = -EPROTONOSUPPORT;
 618                goto out_tunnel;
 619        }
 620
 621        ret = l2tp_nl_cmd_ops[cfg.pw_type]->session_create(net, tunnel,
 622                                                           session_id,
 623                                                           peer_session_id,
 624                                                           &cfg);
 625
 626        if (ret >= 0) {
 627                session = l2tp_tunnel_get_session(tunnel, session_id);
 628                if (session) {
 629                        ret = l2tp_session_notify(&l2tp_nl_family, info, session,
 630                                                  L2TP_CMD_SESSION_CREATE);
 631                        l2tp_session_dec_refcount(session);
 632                }
 633        }
 634
 635out_tunnel:
 636        l2tp_tunnel_dec_refcount(tunnel);
 637out:
 638        return ret;
 639}
 640
 641static int l2tp_nl_cmd_session_delete(struct sk_buff *skb, struct genl_info *info)
 642{
 643        int ret = 0;
 644        struct l2tp_session *session;
 645        u16 pw_type;
 646
 647        session = l2tp_nl_session_get(info);
 648        if (session == NULL) {
 649                ret = -ENODEV;
 650                goto out;
 651        }
 652
 653        l2tp_session_notify(&l2tp_nl_family, info,
 654                            session, L2TP_CMD_SESSION_DELETE);
 655
 656        pw_type = session->pwtype;
 657        if (pw_type < __L2TP_PWTYPE_MAX)
 658                if (l2tp_nl_cmd_ops[pw_type] && l2tp_nl_cmd_ops[pw_type]->session_delete)
 659                        ret = (*l2tp_nl_cmd_ops[pw_type]->session_delete)(session);
 660
 661        l2tp_session_dec_refcount(session);
 662
 663out:
 664        return ret;
 665}
 666
 667static int l2tp_nl_cmd_session_modify(struct sk_buff *skb, struct genl_info *info)
 668{
 669        int ret = 0;
 670        struct l2tp_session *session;
 671
 672        session = l2tp_nl_session_get(info);
 673        if (session == NULL) {
 674                ret = -ENODEV;
 675                goto out;
 676        }
 677
 678        if (info->attrs[L2TP_ATTR_DEBUG])
 679                session->debug = nla_get_u32(info->attrs[L2TP_ATTR_DEBUG]);
 680
 681        if (info->attrs[L2TP_ATTR_RECV_SEQ])
 682                session->recv_seq = nla_get_u8(info->attrs[L2TP_ATTR_RECV_SEQ]);
 683
 684        if (info->attrs[L2TP_ATTR_SEND_SEQ]) {
 685                session->send_seq = nla_get_u8(info->attrs[L2TP_ATTR_SEND_SEQ]);
 686                l2tp_session_set_header_len(session, session->tunnel->version);
 687        }
 688
 689        if (info->attrs[L2TP_ATTR_LNS_MODE])
 690                session->lns_mode = nla_get_u8(info->attrs[L2TP_ATTR_LNS_MODE]);
 691
 692        if (info->attrs[L2TP_ATTR_RECV_TIMEOUT])
 693                session->reorder_timeout = nla_get_msecs(info->attrs[L2TP_ATTR_RECV_TIMEOUT]);
 694
 695        ret = l2tp_session_notify(&l2tp_nl_family, info,
 696                                  session, L2TP_CMD_SESSION_MODIFY);
 697
 698        l2tp_session_dec_refcount(session);
 699
 700out:
 701        return ret;
 702}
 703
 704static int l2tp_nl_session_send(struct sk_buff *skb, u32 portid, u32 seq, int flags,
 705                                struct l2tp_session *session, u8 cmd)
 706{
 707        void *hdr;
 708        struct nlattr *nest;
 709        struct l2tp_tunnel *tunnel = session->tunnel;
 710
 711        hdr = genlmsg_put(skb, portid, seq, &l2tp_nl_family, flags, cmd);
 712        if (!hdr)
 713                return -EMSGSIZE;
 714
 715        if (nla_put_u32(skb, L2TP_ATTR_CONN_ID, tunnel->tunnel_id) ||
 716            nla_put_u32(skb, L2TP_ATTR_SESSION_ID, session->session_id) ||
 717            nla_put_u32(skb, L2TP_ATTR_PEER_CONN_ID, tunnel->peer_tunnel_id) ||
 718            nla_put_u32(skb, L2TP_ATTR_PEER_SESSION_ID,
 719                        session->peer_session_id) ||
 720            nla_put_u32(skb, L2TP_ATTR_DEBUG, session->debug) ||
 721            nla_put_u16(skb, L2TP_ATTR_PW_TYPE, session->pwtype))
 722                goto nla_put_failure;
 723
 724        if ((session->ifname[0] &&
 725             nla_put_string(skb, L2TP_ATTR_IFNAME, session->ifname)) ||
 726            (session->cookie_len &&
 727             nla_put(skb, L2TP_ATTR_COOKIE, session->cookie_len,
 728                     &session->cookie[0])) ||
 729            (session->peer_cookie_len &&
 730             nla_put(skb, L2TP_ATTR_PEER_COOKIE, session->peer_cookie_len,
 731                     &session->peer_cookie[0])) ||
 732            nla_put_u8(skb, L2TP_ATTR_RECV_SEQ, session->recv_seq) ||
 733            nla_put_u8(skb, L2TP_ATTR_SEND_SEQ, session->send_seq) ||
 734            nla_put_u8(skb, L2TP_ATTR_LNS_MODE, session->lns_mode) ||
 735            (l2tp_tunnel_uses_xfrm(tunnel) &&
 736             nla_put_u8(skb, L2TP_ATTR_USING_IPSEC, 1)) ||
 737            (session->reorder_timeout &&
 738             nla_put_msecs(skb, L2TP_ATTR_RECV_TIMEOUT,
 739                           session->reorder_timeout, L2TP_ATTR_PAD)))
 740                goto nla_put_failure;
 741
 742        nest = nla_nest_start_noflag(skb, L2TP_ATTR_STATS);
 743        if (nest == NULL)
 744                goto nla_put_failure;
 745
 746        if (nla_put_u64_64bit(skb, L2TP_ATTR_TX_PACKETS,
 747                              atomic_long_read(&session->stats.tx_packets),
 748                              L2TP_ATTR_STATS_PAD) ||
 749            nla_put_u64_64bit(skb, L2TP_ATTR_TX_BYTES,
 750                              atomic_long_read(&session->stats.tx_bytes),
 751                              L2TP_ATTR_STATS_PAD) ||
 752            nla_put_u64_64bit(skb, L2TP_ATTR_TX_ERRORS,
 753                              atomic_long_read(&session->stats.tx_errors),
 754                              L2TP_ATTR_STATS_PAD) ||
 755            nla_put_u64_64bit(skb, L2TP_ATTR_RX_PACKETS,
 756                              atomic_long_read(&session->stats.rx_packets),
 757                              L2TP_ATTR_STATS_PAD) ||
 758            nla_put_u64_64bit(skb, L2TP_ATTR_RX_BYTES,
 759                              atomic_long_read(&session->stats.rx_bytes),
 760                              L2TP_ATTR_STATS_PAD) ||
 761            nla_put_u64_64bit(skb, L2TP_ATTR_RX_SEQ_DISCARDS,
 762                              atomic_long_read(&session->stats.rx_seq_discards),
 763                              L2TP_ATTR_STATS_PAD) ||
 764            nla_put_u64_64bit(skb, L2TP_ATTR_RX_OOS_PACKETS,
 765                              atomic_long_read(&session->stats.rx_oos_packets),
 766                              L2TP_ATTR_STATS_PAD) ||
 767            nla_put_u64_64bit(skb, L2TP_ATTR_RX_ERRORS,
 768                              atomic_long_read(&session->stats.rx_errors),
 769                              L2TP_ATTR_STATS_PAD))
 770                goto nla_put_failure;
 771        nla_nest_end(skb, nest);
 772
 773        genlmsg_end(skb, hdr);
 774        return 0;
 775
 776 nla_put_failure:
 777        genlmsg_cancel(skb, hdr);
 778        return -1;
 779}
 780
 781static int l2tp_nl_cmd_session_get(struct sk_buff *skb, struct genl_info *info)
 782{
 783        struct l2tp_session *session;
 784        struct sk_buff *msg;
 785        int ret;
 786
 787        session = l2tp_nl_session_get(info);
 788        if (session == NULL) {
 789                ret = -ENODEV;
 790                goto err;
 791        }
 792
 793        msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
 794        if (!msg) {
 795                ret = -ENOMEM;
 796                goto err_ref;
 797        }
 798
 799        ret = l2tp_nl_session_send(msg, info->snd_portid, info->snd_seq,
 800                                   0, session, L2TP_CMD_SESSION_GET);
 801        if (ret < 0)
 802                goto err_ref_msg;
 803
 804        ret = genlmsg_unicast(genl_info_net(info), msg, info->snd_portid);
 805
 806        l2tp_session_dec_refcount(session);
 807
 808        return ret;
 809
 810err_ref_msg:
 811        nlmsg_free(msg);
 812err_ref:
 813        l2tp_session_dec_refcount(session);
 814err:
 815        return ret;
 816}
 817
 818static int l2tp_nl_cmd_session_dump(struct sk_buff *skb, struct netlink_callback *cb)
 819{
 820        struct net *net = sock_net(skb->sk);
 821        struct l2tp_session *session;
 822        struct l2tp_tunnel *tunnel = NULL;
 823        int ti = cb->args[0];
 824        int si = cb->args[1];
 825
 826        for (;;) {
 827                if (tunnel == NULL) {
 828                        tunnel = l2tp_tunnel_get_nth(net, ti);
 829                        if (tunnel == NULL)
 830                                goto out;
 831                }
 832
 833                session = l2tp_session_get_nth(tunnel, si);
 834                if (session == NULL) {
 835                        ti++;
 836                        l2tp_tunnel_dec_refcount(tunnel);
 837                        tunnel = NULL;
 838                        si = 0;
 839                        continue;
 840                }
 841
 842                if (l2tp_nl_session_send(skb, NETLINK_CB(cb->skb).portid,
 843                                         cb->nlh->nlmsg_seq, NLM_F_MULTI,
 844                                         session, L2TP_CMD_SESSION_GET) < 0) {
 845                        l2tp_session_dec_refcount(session);
 846                        l2tp_tunnel_dec_refcount(tunnel);
 847                        break;
 848                }
 849                l2tp_session_dec_refcount(session);
 850
 851                si++;
 852        }
 853
 854out:
 855        cb->args[0] = ti;
 856        cb->args[1] = si;
 857
 858        return skb->len;
 859}
 860
 861static const struct nla_policy l2tp_nl_policy[L2TP_ATTR_MAX + 1] = {
 862        [L2TP_ATTR_NONE]                = { .type = NLA_UNSPEC, },
 863        [L2TP_ATTR_PW_TYPE]             = { .type = NLA_U16, },
 864        [L2TP_ATTR_ENCAP_TYPE]          = { .type = NLA_U16, },
 865        [L2TP_ATTR_OFFSET]              = { .type = NLA_U16, },
 866        [L2TP_ATTR_DATA_SEQ]            = { .type = NLA_U8, },
 867        [L2TP_ATTR_L2SPEC_TYPE]         = { .type = NLA_U8, },
 868        [L2TP_ATTR_L2SPEC_LEN]          = { .type = NLA_U8, },
 869        [L2TP_ATTR_PROTO_VERSION]       = { .type = NLA_U8, },
 870        [L2TP_ATTR_CONN_ID]             = { .type = NLA_U32, },
 871        [L2TP_ATTR_PEER_CONN_ID]        = { .type = NLA_U32, },
 872        [L2TP_ATTR_SESSION_ID]          = { .type = NLA_U32, },
 873        [L2TP_ATTR_PEER_SESSION_ID]     = { .type = NLA_U32, },
 874        [L2TP_ATTR_UDP_CSUM]            = { .type = NLA_U8, },
 875        [L2TP_ATTR_VLAN_ID]             = { .type = NLA_U16, },
 876        [L2TP_ATTR_DEBUG]               = { .type = NLA_U32, },
 877        [L2TP_ATTR_RECV_SEQ]            = { .type = NLA_U8, },
 878        [L2TP_ATTR_SEND_SEQ]            = { .type = NLA_U8, },
 879        [L2TP_ATTR_LNS_MODE]            = { .type = NLA_U8, },
 880        [L2TP_ATTR_USING_IPSEC]         = { .type = NLA_U8, },
 881        [L2TP_ATTR_RECV_TIMEOUT]        = { .type = NLA_MSECS, },
 882        [L2TP_ATTR_FD]                  = { .type = NLA_U32, },
 883        [L2TP_ATTR_IP_SADDR]            = { .type = NLA_U32, },
 884        [L2TP_ATTR_IP_DADDR]            = { .type = NLA_U32, },
 885        [L2TP_ATTR_UDP_SPORT]           = { .type = NLA_U16, },
 886        [L2TP_ATTR_UDP_DPORT]           = { .type = NLA_U16, },
 887        [L2TP_ATTR_MTU]                 = { .type = NLA_U16, },
 888        [L2TP_ATTR_MRU]                 = { .type = NLA_U16, },
 889        [L2TP_ATTR_STATS]               = { .type = NLA_NESTED, },
 890        [L2TP_ATTR_IP6_SADDR] = {
 891                .type = NLA_BINARY,
 892                .len = sizeof(struct in6_addr),
 893        },
 894        [L2TP_ATTR_IP6_DADDR] = {
 895                .type = NLA_BINARY,
 896                .len = sizeof(struct in6_addr),
 897        },
 898        [L2TP_ATTR_IFNAME] = {
 899                .type = NLA_NUL_STRING,
 900                .len = IFNAMSIZ - 1,
 901        },
 902        [L2TP_ATTR_COOKIE] = {
 903                .type = NLA_BINARY,
 904                .len = 8,
 905        },
 906        [L2TP_ATTR_PEER_COOKIE] = {
 907                .type = NLA_BINARY,
 908                .len = 8,
 909        },
 910};
 911
 912static const struct genl_ops l2tp_nl_ops[] = {
 913        {
 914                .cmd = L2TP_CMD_NOOP,
 915                .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
 916                .doit = l2tp_nl_cmd_noop,
 917                /* can be retrieved by unprivileged users */
 918        },
 919        {
 920                .cmd = L2TP_CMD_TUNNEL_CREATE,
 921                .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
 922                .doit = l2tp_nl_cmd_tunnel_create,
 923                .flags = GENL_ADMIN_PERM,
 924        },
 925        {
 926                .cmd = L2TP_CMD_TUNNEL_DELETE,
 927                .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
 928                .doit = l2tp_nl_cmd_tunnel_delete,
 929                .flags = GENL_ADMIN_PERM,
 930        },
 931        {
 932                .cmd = L2TP_CMD_TUNNEL_MODIFY,
 933                .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
 934                .doit = l2tp_nl_cmd_tunnel_modify,
 935                .flags = GENL_ADMIN_PERM,
 936        },
 937        {
 938                .cmd = L2TP_CMD_TUNNEL_GET,
 939                .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
 940                .doit = l2tp_nl_cmd_tunnel_get,
 941                .dumpit = l2tp_nl_cmd_tunnel_dump,
 942                .flags = GENL_ADMIN_PERM,
 943        },
 944        {
 945                .cmd = L2TP_CMD_SESSION_CREATE,
 946                .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
 947                .doit = l2tp_nl_cmd_session_create,
 948                .flags = GENL_ADMIN_PERM,
 949        },
 950        {
 951                .cmd = L2TP_CMD_SESSION_DELETE,
 952                .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
 953                .doit = l2tp_nl_cmd_session_delete,
 954                .flags = GENL_ADMIN_PERM,
 955        },
 956        {
 957                .cmd = L2TP_CMD_SESSION_MODIFY,
 958                .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
 959                .doit = l2tp_nl_cmd_session_modify,
 960                .flags = GENL_ADMIN_PERM,
 961        },
 962        {
 963                .cmd = L2TP_CMD_SESSION_GET,
 964                .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
 965                .doit = l2tp_nl_cmd_session_get,
 966                .dumpit = l2tp_nl_cmd_session_dump,
 967                .flags = GENL_ADMIN_PERM,
 968        },
 969};
 970
 971static struct genl_family l2tp_nl_family __ro_after_init = {
 972        .name           = L2TP_GENL_NAME,
 973        .version        = L2TP_GENL_VERSION,
 974        .hdrsize        = 0,
 975        .maxattr        = L2TP_ATTR_MAX,
 976        .policy = l2tp_nl_policy,
 977        .netnsok        = true,
 978        .module         = THIS_MODULE,
 979        .ops            = l2tp_nl_ops,
 980        .n_ops          = ARRAY_SIZE(l2tp_nl_ops),
 981        .mcgrps         = l2tp_multicast_group,
 982        .n_mcgrps       = ARRAY_SIZE(l2tp_multicast_group),
 983};
 984
 985int l2tp_nl_register_ops(enum l2tp_pwtype pw_type, const struct l2tp_nl_cmd_ops *ops)
 986{
 987        int ret;
 988
 989        ret = -EINVAL;
 990        if (pw_type >= __L2TP_PWTYPE_MAX)
 991                goto err;
 992
 993        genl_lock();
 994        ret = -EBUSY;
 995        if (l2tp_nl_cmd_ops[pw_type])
 996                goto out;
 997
 998        l2tp_nl_cmd_ops[pw_type] = ops;
 999        ret = 0;
1000
1001out:
1002        genl_unlock();
1003err:
1004        return ret;
1005}
1006EXPORT_SYMBOL_GPL(l2tp_nl_register_ops);
1007
1008void l2tp_nl_unregister_ops(enum l2tp_pwtype pw_type)
1009{
1010        if (pw_type < __L2TP_PWTYPE_MAX) {
1011                genl_lock();
1012                l2tp_nl_cmd_ops[pw_type] = NULL;
1013                genl_unlock();
1014        }
1015}
1016EXPORT_SYMBOL_GPL(l2tp_nl_unregister_ops);
1017
1018static int __init l2tp_nl_init(void)
1019{
1020        pr_info("L2TP netlink interface\n");
1021        return genl_register_family(&l2tp_nl_family);
1022}
1023
1024static void l2tp_nl_cleanup(void)
1025{
1026        genl_unregister_family(&l2tp_nl_family);
1027}
1028
1029module_init(l2tp_nl_init);
1030module_exit(l2tp_nl_cleanup);
1031
1032MODULE_AUTHOR("James Chapman <jchapman@katalix.com>");
1033MODULE_DESCRIPTION("L2TP netlink");
1034MODULE_LICENSE("GPL");
1035MODULE_VERSION("1.0");
1036MODULE_ALIAS_GENL_FAMILY("l2tp");
1037