mirror of https://gitee.com/openkylin/linux.git
Merge branch 'l2tp-further-checkpatch-pl-cleanups'
Tom Parkin says: ==================== l2tp: further checkpatch.pl cleanups l2tp hasn't been kept up to date with the static analysis checks offered by checkpatch.pl. This patchset builds on the series "l2tp: cleanup checkpatch.pl warnings". It includes small refactoring changes which improve code quality and resolve a subset of the checkpatch warnings for the l2tp codebase. ==================== Reviewed-by: James Chapman <jchapman@katalix.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
15be4ea3f0
|
@ -412,7 +412,7 @@ static void l2tp_recv_dequeue_skb(struct l2tp_session *session, struct sk_buff *
|
||||||
}
|
}
|
||||||
|
|
||||||
/* call private receive handler */
|
/* call private receive handler */
|
||||||
if (session->recv_skb != NULL)
|
if (session->recv_skb)
|
||||||
(*session->recv_skb)(session, skb, L2TP_SKB_CB(skb)->length);
|
(*session->recv_skb)(session, skb, L2TP_SKB_CB(skb)->length);
|
||||||
else
|
else
|
||||||
kfree_skb(skb);
|
kfree_skb(skb);
|
||||||
|
@ -683,7 +683,7 @@ void l2tp_recv_common(struct l2tp_session *session, struct sk_buff *skb,
|
||||||
* check if we sre sending sequence numbers and if not,
|
* check if we sre sending sequence numbers and if not,
|
||||||
* configure it so.
|
* configure it so.
|
||||||
*/
|
*/
|
||||||
if ((!session->lns_mode) && (!session->send_seq)) {
|
if (!session->lns_mode && !session->send_seq) {
|
||||||
l2tp_info(session, L2TP_MSG_SEQ,
|
l2tp_info(session, L2TP_MSG_SEQ,
|
||||||
"%s: requested to enable seq numbers by LNS\n",
|
"%s: requested to enable seq numbers by LNS\n",
|
||||||
session->name);
|
session->name);
|
||||||
|
@ -707,7 +707,7 @@ void l2tp_recv_common(struct l2tp_session *session, struct sk_buff *skb,
|
||||||
* If we're the LNS and we're sending sequence numbers, the
|
* If we're the LNS and we're sending sequence numbers, the
|
||||||
* LAC is broken. Discard the frame.
|
* LAC is broken. Discard the frame.
|
||||||
*/
|
*/
|
||||||
if ((!session->lns_mode) && (session->send_seq)) {
|
if (!session->lns_mode && session->send_seq) {
|
||||||
l2tp_info(session, L2TP_MSG_SEQ,
|
l2tp_info(session, L2TP_MSG_SEQ,
|
||||||
"%s: requested to disable seq numbers by LNS\n",
|
"%s: requested to disable seq numbers by LNS\n",
|
||||||
session->name);
|
session->name);
|
||||||
|
@ -911,7 +911,7 @@ int l2tp_udp_encap_recv(struct sock *sk, struct sk_buff *skb)
|
||||||
struct l2tp_tunnel *tunnel;
|
struct l2tp_tunnel *tunnel;
|
||||||
|
|
||||||
tunnel = rcu_dereference_sk_user_data(sk);
|
tunnel = rcu_dereference_sk_user_data(sk);
|
||||||
if (tunnel == NULL)
|
if (!tunnel)
|
||||||
goto pass_up;
|
goto pass_up;
|
||||||
|
|
||||||
l2tp_dbg(tunnel, L2TP_MSG_DATA, "%s: received %d bytes\n",
|
l2tp_dbg(tunnel, L2TP_MSG_DATA, "%s: received %d bytes\n",
|
||||||
|
@ -1150,7 +1150,7 @@ static void l2tp_tunnel_destruct(struct sock *sk)
|
||||||
{
|
{
|
||||||
struct l2tp_tunnel *tunnel = l2tp_tunnel(sk);
|
struct l2tp_tunnel *tunnel = l2tp_tunnel(sk);
|
||||||
|
|
||||||
if (tunnel == NULL)
|
if (!tunnel)
|
||||||
goto end;
|
goto end;
|
||||||
|
|
||||||
l2tp_info(tunnel, L2TP_MSG_CONTROL, "%s: closing...\n", tunnel->name);
|
l2tp_info(tunnel, L2TP_MSG_CONTROL, "%s: closing...\n", tunnel->name);
|
||||||
|
@ -1189,7 +1189,7 @@ static void l2tp_tunnel_closeall(struct l2tp_tunnel *tunnel)
|
||||||
struct hlist_node *tmp;
|
struct hlist_node *tmp;
|
||||||
struct l2tp_session *session;
|
struct l2tp_session *session;
|
||||||
|
|
||||||
BUG_ON(tunnel == NULL);
|
BUG_ON(!tunnel);
|
||||||
|
|
||||||
l2tp_info(tunnel, L2TP_MSG_CONTROL, "%s: closing all sessions...\n",
|
l2tp_info(tunnel, L2TP_MSG_CONTROL, "%s: closing all sessions...\n",
|
||||||
tunnel->name);
|
tunnel->name);
|
||||||
|
@ -1214,7 +1214,7 @@ static void l2tp_tunnel_closeall(struct l2tp_tunnel *tunnel)
|
||||||
__l2tp_session_unhash(session);
|
__l2tp_session_unhash(session);
|
||||||
l2tp_session_queue_purge(session);
|
l2tp_session_queue_purge(session);
|
||||||
|
|
||||||
if (session->session_close != NULL)
|
if (session->session_close)
|
||||||
(*session->session_close)(session);
|
(*session->session_close)(session);
|
||||||
|
|
||||||
l2tp_session_dec_refcount(session);
|
l2tp_session_dec_refcount(session);
|
||||||
|
@ -1389,7 +1389,7 @@ static int l2tp_tunnel_sock_create(struct net *net,
|
||||||
|
|
||||||
out:
|
out:
|
||||||
*sockp = sock;
|
*sockp = sock;
|
||||||
if ((err < 0) && sock) {
|
if (err < 0 && sock) {
|
||||||
kernel_sock_shutdown(sock, SHUT_RDWR);
|
kernel_sock_shutdown(sock, SHUT_RDWR);
|
||||||
sock_release(sock);
|
sock_release(sock);
|
||||||
*sockp = NULL;
|
*sockp = NULL;
|
||||||
|
@ -1407,11 +1407,11 @@ int l2tp_tunnel_create(struct net *net, int fd, int version, u32 tunnel_id, u32
|
||||||
int err;
|
int err;
|
||||||
enum l2tp_encap_type encap = L2TP_ENCAPTYPE_UDP;
|
enum l2tp_encap_type encap = L2TP_ENCAPTYPE_UDP;
|
||||||
|
|
||||||
if (cfg != NULL)
|
if (cfg)
|
||||||
encap = cfg->encap;
|
encap = cfg->encap;
|
||||||
|
|
||||||
tunnel = kzalloc(sizeof(struct l2tp_tunnel), GFP_KERNEL);
|
tunnel = kzalloc(sizeof(*tunnel), GFP_KERNEL);
|
||||||
if (tunnel == NULL) {
|
if (!tunnel) {
|
||||||
err = -ENOMEM;
|
err = -ENOMEM;
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
@ -1426,7 +1426,7 @@ int l2tp_tunnel_create(struct net *net, int fd, int version, u32 tunnel_id, u32
|
||||||
rwlock_init(&tunnel->hlist_lock);
|
rwlock_init(&tunnel->hlist_lock);
|
||||||
tunnel->acpt_newsess = true;
|
tunnel->acpt_newsess = true;
|
||||||
|
|
||||||
if (cfg != NULL)
|
if (cfg)
|
||||||
tunnel->debug = cfg->debug;
|
tunnel->debug = cfg->debug;
|
||||||
|
|
||||||
tunnel->encap = encap;
|
tunnel->encap = encap;
|
||||||
|
@ -1615,7 +1615,7 @@ int l2tp_session_delete(struct l2tp_session *session)
|
||||||
|
|
||||||
__l2tp_session_unhash(session);
|
__l2tp_session_unhash(session);
|
||||||
l2tp_session_queue_purge(session);
|
l2tp_session_queue_purge(session);
|
||||||
if (session->session_close != NULL)
|
if (session->session_close)
|
||||||
(*session->session_close)(session);
|
(*session->session_close)(session);
|
||||||
|
|
||||||
l2tp_session_dec_refcount(session);
|
l2tp_session_dec_refcount(session);
|
||||||
|
@ -1647,8 +1647,8 @@ struct l2tp_session *l2tp_session_create(int priv_size, struct l2tp_tunnel *tunn
|
||||||
{
|
{
|
||||||
struct l2tp_session *session;
|
struct l2tp_session *session;
|
||||||
|
|
||||||
session = kzalloc(sizeof(struct l2tp_session) + priv_size, GFP_KERNEL);
|
session = kzalloc(sizeof(*session) + priv_size, GFP_KERNEL);
|
||||||
if (session != NULL) {
|
if (session) {
|
||||||
session->magic = L2TP_SESSION_MAGIC;
|
session->magic = L2TP_SESSION_MAGIC;
|
||||||
session->tunnel = tunnel;
|
session->tunnel = tunnel;
|
||||||
|
|
||||||
|
|
|
@ -58,7 +58,7 @@ static void l2tp_dfs_next_session(struct l2tp_dfs_seq_data *pd)
|
||||||
pd->session = l2tp_session_get_nth(pd->tunnel, pd->session_idx);
|
pd->session = l2tp_session_get_nth(pd->tunnel, pd->session_idx);
|
||||||
pd->session_idx++;
|
pd->session_idx++;
|
||||||
|
|
||||||
if (pd->session == NULL) {
|
if (!pd->session) {
|
||||||
pd->session_idx = 0;
|
pd->session_idx = 0;
|
||||||
l2tp_dfs_next_tunnel(pd);
|
l2tp_dfs_next_tunnel(pd);
|
||||||
}
|
}
|
||||||
|
@ -72,16 +72,16 @@ static void *l2tp_dfs_seq_start(struct seq_file *m, loff_t *offs)
|
||||||
if (!pos)
|
if (!pos)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
BUG_ON(m->private == NULL);
|
BUG_ON(!m->private);
|
||||||
pd = m->private;
|
pd = m->private;
|
||||||
|
|
||||||
if (pd->tunnel == NULL)
|
if (!pd->tunnel)
|
||||||
l2tp_dfs_next_tunnel(pd);
|
l2tp_dfs_next_tunnel(pd);
|
||||||
else
|
else
|
||||||
l2tp_dfs_next_session(pd);
|
l2tp_dfs_next_session(pd);
|
||||||
|
|
||||||
/* NULL tunnel and session indicates end of list */
|
/* NULL tunnel and session indicates end of list */
|
||||||
if ((pd->tunnel == NULL) && (pd->session == NULL))
|
if (!pd->tunnel && !pd->session)
|
||||||
pd = NULL;
|
pd = NULL;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
@ -146,10 +146,12 @@ static void l2tp_dfs_seq_tunnel_show(struct seq_file *m, void *v)
|
||||||
|
|
||||||
seq_printf(m, " from %pI6c to %pI6c\n",
|
seq_printf(m, " from %pI6c to %pI6c\n",
|
||||||
&np->saddr, &tunnel->sock->sk_v6_daddr);
|
&np->saddr, &tunnel->sock->sk_v6_daddr);
|
||||||
} else
|
}
|
||||||
#endif
|
#endif
|
||||||
seq_printf(m, " from %pI4 to %pI4\n",
|
if (tunnel->sock->sk_family == AF_INET)
|
||||||
&inet->inet_saddr, &inet->inet_daddr);
|
seq_printf(m, " from %pI4 to %pI4\n",
|
||||||
|
&inet->inet_saddr, &inet->inet_daddr);
|
||||||
|
|
||||||
if (tunnel->encap == L2TP_ENCAPTYPE_UDP)
|
if (tunnel->encap == L2TP_ENCAPTYPE_UDP)
|
||||||
seq_printf(m, " source port %hu, dest port %hu\n",
|
seq_printf(m, " source port %hu, dest port %hu\n",
|
||||||
ntohs(inet->inet_sport), ntohs(inet->inet_dport));
|
ntohs(inet->inet_sport), ntohs(inet->inet_dport));
|
||||||
|
@ -221,7 +223,7 @@ static void l2tp_dfs_seq_session_show(struct seq_file *m, void *v)
|
||||||
atomic_long_read(&session->stats.rx_bytes),
|
atomic_long_read(&session->stats.rx_bytes),
|
||||||
atomic_long_read(&session->stats.rx_errors));
|
atomic_long_read(&session->stats.rx_errors));
|
||||||
|
|
||||||
if (session->show != NULL)
|
if (session->show)
|
||||||
session->show(m, session);
|
session->show(m, session);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -268,7 +270,7 @@ static int l2tp_dfs_seq_open(struct inode *inode, struct file *file)
|
||||||
int rc = -ENOMEM;
|
int rc = -ENOMEM;
|
||||||
|
|
||||||
pd = kzalloc(sizeof(*pd), GFP_KERNEL);
|
pd = kzalloc(sizeof(*pd), GFP_KERNEL);
|
||||||
if (pd == NULL)
|
if (!pd)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
/* Derive the network namespace from the pid opening the
|
/* Derive the network namespace from the pid opening the
|
||||||
|
|
|
@ -471,7 +471,7 @@ static int l2tp_ip_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
|
||||||
rt = (struct rtable *)__sk_dst_check(sk, 0);
|
rt = (struct rtable *)__sk_dst_check(sk, 0);
|
||||||
|
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
if (rt == NULL) {
|
if (!rt) {
|
||||||
const struct ip_options_rcu *inet_opt;
|
const struct ip_options_rcu *inet_opt;
|
||||||
|
|
||||||
inet_opt = rcu_dereference(inet->inet_opt);
|
inet_opt = rcu_dereference(inet->inet_opt);
|
||||||
|
|
|
@ -486,7 +486,7 @@ static int l2tp_ip6_push_pending_frames(struct sock *sk)
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
|
||||||
skb = skb_peek(&sk->sk_write_queue);
|
skb = skb_peek(&sk->sk_write_queue);
|
||||||
if (skb == NULL)
|
if (!skb)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
transhdr = (__be32 *)skb_transport_header(skb);
|
transhdr = (__be32 *)skb_transport_header(skb);
|
||||||
|
|
|
@ -155,12 +155,38 @@ static int l2tp_session_notify(struct genl_family *family,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int l2tp_nl_cmd_tunnel_create_get_addr(struct nlattr **attrs, struct l2tp_tunnel_cfg *cfg)
|
||||||
|
{
|
||||||
|
if (attrs[L2TP_ATTR_UDP_SPORT])
|
||||||
|
cfg->local_udp_port = nla_get_u16(attrs[L2TP_ATTR_UDP_SPORT]);
|
||||||
|
if (attrs[L2TP_ATTR_UDP_DPORT])
|
||||||
|
cfg->peer_udp_port = nla_get_u16(attrs[L2TP_ATTR_UDP_DPORT]);
|
||||||
|
cfg->use_udp_checksums = nla_get_flag(attrs[L2TP_ATTR_UDP_CSUM]);
|
||||||
|
|
||||||
|
/* Must have either AF_INET or AF_INET6 address for source and destination */
|
||||||
|
#if IS_ENABLED(CONFIG_IPV6)
|
||||||
|
if (attrs[L2TP_ATTR_IP6_SADDR] && attrs[L2TP_ATTR_IP6_DADDR]) {
|
||||||
|
cfg->local_ip6 = nla_data(attrs[L2TP_ATTR_IP6_SADDR]);
|
||||||
|
cfg->peer_ip6 = nla_data(attrs[L2TP_ATTR_IP6_DADDR]);
|
||||||
|
cfg->udp6_zero_tx_checksums = nla_get_flag(attrs[L2TP_ATTR_UDP_ZERO_CSUM6_TX]);
|
||||||
|
cfg->udp6_zero_rx_checksums = nla_get_flag(attrs[L2TP_ATTR_UDP_ZERO_CSUM6_RX]);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
if (attrs[L2TP_ATTR_IP_SADDR] && attrs[L2TP_ATTR_IP_DADDR]) {
|
||||||
|
cfg->local_ip.s_addr = nla_get_in_addr(attrs[L2TP_ATTR_IP_SADDR]);
|
||||||
|
cfg->peer_ip.s_addr = nla_get_in_addr(attrs[L2TP_ATTR_IP_DADDR]);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
static int l2tp_nl_cmd_tunnel_create(struct sk_buff *skb, struct genl_info *info)
|
static int l2tp_nl_cmd_tunnel_create(struct sk_buff *skb, struct genl_info *info)
|
||||||
{
|
{
|
||||||
u32 tunnel_id;
|
u32 tunnel_id;
|
||||||
u32 peer_tunnel_id;
|
u32 peer_tunnel_id;
|
||||||
int proto_version;
|
int proto_version;
|
||||||
int fd;
|
int fd = -1;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
struct l2tp_tunnel_cfg cfg = { 0, };
|
struct l2tp_tunnel_cfg cfg = { 0, };
|
||||||
struct l2tp_tunnel *tunnel;
|
struct l2tp_tunnel *tunnel;
|
||||||
|
@ -191,33 +217,16 @@ static int l2tp_nl_cmd_tunnel_create(struct sk_buff *skb, struct genl_info *info
|
||||||
}
|
}
|
||||||
cfg.encap = nla_get_u16(attrs[L2TP_ATTR_ENCAP_TYPE]);
|
cfg.encap = nla_get_u16(attrs[L2TP_ATTR_ENCAP_TYPE]);
|
||||||
|
|
||||||
fd = -1;
|
/* Managed tunnels take the tunnel socket from userspace.
|
||||||
|
* Unmanaged tunnels must call out the source and destination addresses
|
||||||
|
* for the kernel to create the tunnel socket itself.
|
||||||
|
*/
|
||||||
if (attrs[L2TP_ATTR_FD]) {
|
if (attrs[L2TP_ATTR_FD]) {
|
||||||
fd = nla_get_u32(attrs[L2TP_ATTR_FD]);
|
fd = nla_get_u32(attrs[L2TP_ATTR_FD]);
|
||||||
} else {
|
} else {
|
||||||
#if IS_ENABLED(CONFIG_IPV6)
|
ret = l2tp_nl_cmd_tunnel_create_get_addr(attrs, &cfg);
|
||||||
if (attrs[L2TP_ATTR_IP6_SADDR] && attrs[L2TP_ATTR_IP6_DADDR]) {
|
if (ret < 0)
|
||||||
cfg.local_ip6 = nla_data(attrs[L2TP_ATTR_IP6_SADDR]);
|
|
||||||
cfg.peer_ip6 = nla_data(attrs[L2TP_ATTR_IP6_DADDR]);
|
|
||||||
} else
|
|
||||||
#endif
|
|
||||||
if (attrs[L2TP_ATTR_IP_SADDR] && attrs[L2TP_ATTR_IP_DADDR]) {
|
|
||||||
cfg.local_ip.s_addr = nla_get_in_addr(attrs[L2TP_ATTR_IP_SADDR]);
|
|
||||||
cfg.peer_ip.s_addr = nla_get_in_addr(attrs[L2TP_ATTR_IP_DADDR]);
|
|
||||||
} else {
|
|
||||||
ret = -EINVAL;
|
|
||||||
goto out;
|
goto out;
|
||||||
}
|
|
||||||
if (attrs[L2TP_ATTR_UDP_SPORT])
|
|
||||||
cfg.local_udp_port = nla_get_u16(attrs[L2TP_ATTR_UDP_SPORT]);
|
|
||||||
if (attrs[L2TP_ATTR_UDP_DPORT])
|
|
||||||
cfg.peer_udp_port = nla_get_u16(attrs[L2TP_ATTR_UDP_DPORT]);
|
|
||||||
cfg.use_udp_checksums = nla_get_flag(attrs[L2TP_ATTR_UDP_CSUM]);
|
|
||||||
|
|
||||||
#if IS_ENABLED(CONFIG_IPV6)
|
|
||||||
cfg.udp6_zero_tx_checksums = nla_get_flag(attrs[L2TP_ATTR_UDP_ZERO_CSUM6_TX]);
|
|
||||||
cfg.udp6_zero_rx_checksums = nla_get_flag(attrs[L2TP_ATTR_UDP_ZERO_CSUM6_RX]);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (attrs[L2TP_ATTR_DEBUG])
|
if (attrs[L2TP_ATTR_DEBUG])
|
||||||
|
@ -310,16 +319,79 @@ static int l2tp_nl_cmd_tunnel_modify(struct sk_buff *skb, struct genl_info *info
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if IS_ENABLED(CONFIG_IPV6)
|
||||||
|
static int l2tp_nl_tunnel_send_addr6(struct sk_buff *skb, struct sock *sk,
|
||||||
|
enum l2tp_encap_type encap)
|
||||||
|
{
|
||||||
|
struct inet_sock *inet = inet_sk(sk);
|
||||||
|
struct ipv6_pinfo *np = inet6_sk(sk);
|
||||||
|
|
||||||
|
switch (encap) {
|
||||||
|
case L2TP_ENCAPTYPE_UDP:
|
||||||
|
if (udp_get_no_check6_tx(sk) &&
|
||||||
|
nla_put_flag(skb, L2TP_ATTR_UDP_ZERO_CSUM6_TX))
|
||||||
|
return -1;
|
||||||
|
if (udp_get_no_check6_rx(sk) &&
|
||||||
|
nla_put_flag(skb, L2TP_ATTR_UDP_ZERO_CSUM6_RX))
|
||||||
|
return -1;
|
||||||
|
if (nla_put_u16(skb, L2TP_ATTR_UDP_SPORT, ntohs(inet->inet_sport)) ||
|
||||||
|
nla_put_u16(skb, L2TP_ATTR_UDP_DPORT, ntohs(inet->inet_dport)))
|
||||||
|
return -1;
|
||||||
|
fallthrough;
|
||||||
|
case L2TP_ENCAPTYPE_IP:
|
||||||
|
if (nla_put_in6_addr(skb, L2TP_ATTR_IP6_SADDR, &np->saddr) ||
|
||||||
|
nla_put_in6_addr(skb, L2TP_ATTR_IP6_DADDR, &sk->sk_v6_daddr))
|
||||||
|
return -1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static int l2tp_nl_tunnel_send_addr4(struct sk_buff *skb, struct sock *sk,
|
||||||
|
enum l2tp_encap_type encap)
|
||||||
|
{
|
||||||
|
struct inet_sock *inet = inet_sk(sk);
|
||||||
|
|
||||||
|
switch (encap) {
|
||||||
|
case L2TP_ENCAPTYPE_UDP:
|
||||||
|
if (nla_put_u8(skb, L2TP_ATTR_UDP_CSUM, !sk->sk_no_check_tx) ||
|
||||||
|
nla_put_u16(skb, L2TP_ATTR_UDP_SPORT, ntohs(inet->inet_sport)) ||
|
||||||
|
nla_put_u16(skb, L2TP_ATTR_UDP_DPORT, ntohs(inet->inet_dport)))
|
||||||
|
return -1;
|
||||||
|
fallthrough;
|
||||||
|
case L2TP_ENCAPTYPE_IP:
|
||||||
|
if (nla_put_in_addr(skb, L2TP_ATTR_IP_SADDR, inet->inet_saddr) ||
|
||||||
|
nla_put_in_addr(skb, L2TP_ATTR_IP_DADDR, inet->inet_daddr))
|
||||||
|
return -1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Append attributes for the tunnel address, handling the different attribute types
|
||||||
|
* used for different tunnel encapsulation and AF_INET v.s. AF_INET6.
|
||||||
|
*/
|
||||||
|
static int l2tp_nl_tunnel_send_addr(struct sk_buff *skb, struct l2tp_tunnel *tunnel)
|
||||||
|
{
|
||||||
|
struct sock *sk = tunnel->sock;
|
||||||
|
|
||||||
|
if (!sk)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
#if IS_ENABLED(CONFIG_IPV6)
|
||||||
|
if (sk->sk_family == AF_INET6)
|
||||||
|
return l2tp_nl_tunnel_send_addr6(skb, sk, tunnel->encap);
|
||||||
|
#endif
|
||||||
|
return l2tp_nl_tunnel_send_addr4(skb, sk, tunnel->encap);
|
||||||
|
}
|
||||||
|
|
||||||
static int l2tp_nl_tunnel_send(struct sk_buff *skb, u32 portid, u32 seq, int flags,
|
static int l2tp_nl_tunnel_send(struct sk_buff *skb, u32 portid, u32 seq, int flags,
|
||||||
struct l2tp_tunnel *tunnel, u8 cmd)
|
struct l2tp_tunnel *tunnel, u8 cmd)
|
||||||
{
|
{
|
||||||
void *hdr;
|
void *hdr;
|
||||||
struct nlattr *nest;
|
struct nlattr *nest;
|
||||||
struct sock *sk = NULL;
|
|
||||||
struct inet_sock *inet;
|
|
||||||
#if IS_ENABLED(CONFIG_IPV6)
|
|
||||||
struct ipv6_pinfo *np = NULL;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
hdr = genlmsg_put(skb, portid, seq, &l2tp_nl_family, flags, cmd);
|
hdr = genlmsg_put(skb, portid, seq, &l2tp_nl_family, flags, cmd);
|
||||||
if (!hdr)
|
if (!hdr)
|
||||||
|
@ -333,7 +405,7 @@ static int l2tp_nl_tunnel_send(struct sk_buff *skb, u32 portid, u32 seq, int fla
|
||||||
goto nla_put_failure;
|
goto nla_put_failure;
|
||||||
|
|
||||||
nest = nla_nest_start_noflag(skb, L2TP_ATTR_STATS);
|
nest = nla_nest_start_noflag(skb, L2TP_ATTR_STATS);
|
||||||
if (nest == NULL)
|
if (!nest)
|
||||||
goto nla_put_failure;
|
goto nla_put_failure;
|
||||||
|
|
||||||
if (nla_put_u64_64bit(skb, L2TP_ATTR_TX_PACKETS,
|
if (nla_put_u64_64bit(skb, L2TP_ATTR_TX_PACKETS,
|
||||||
|
@ -363,58 +435,9 @@ static int l2tp_nl_tunnel_send(struct sk_buff *skb, u32 portid, u32 seq, int fla
|
||||||
goto nla_put_failure;
|
goto nla_put_failure;
|
||||||
nla_nest_end(skb, nest);
|
nla_nest_end(skb, nest);
|
||||||
|
|
||||||
sk = tunnel->sock;
|
if (l2tp_nl_tunnel_send_addr(skb, tunnel))
|
||||||
if (!sk)
|
goto nla_put_failure;
|
||||||
goto out;
|
|
||||||
|
|
||||||
#if IS_ENABLED(CONFIG_IPV6)
|
|
||||||
if (sk->sk_family == AF_INET6)
|
|
||||||
np = inet6_sk(sk);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
inet = inet_sk(sk);
|
|
||||||
|
|
||||||
switch (tunnel->encap) {
|
|
||||||
case L2TP_ENCAPTYPE_UDP:
|
|
||||||
switch (sk->sk_family) {
|
|
||||||
case AF_INET:
|
|
||||||
if (nla_put_u8(skb, L2TP_ATTR_UDP_CSUM, !sk->sk_no_check_tx))
|
|
||||||
goto nla_put_failure;
|
|
||||||
break;
|
|
||||||
#if IS_ENABLED(CONFIG_IPV6)
|
|
||||||
case AF_INET6:
|
|
||||||
if (udp_get_no_check6_tx(sk) &&
|
|
||||||
nla_put_flag(skb, L2TP_ATTR_UDP_ZERO_CSUM6_TX))
|
|
||||||
goto nla_put_failure;
|
|
||||||
if (udp_get_no_check6_rx(sk) &&
|
|
||||||
nla_put_flag(skb, L2TP_ATTR_UDP_ZERO_CSUM6_RX))
|
|
||||||
goto nla_put_failure;
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
if (nla_put_u16(skb, L2TP_ATTR_UDP_SPORT, ntohs(inet->inet_sport)) ||
|
|
||||||
nla_put_u16(skb, L2TP_ATTR_UDP_DPORT, ntohs(inet->inet_dport)))
|
|
||||||
goto nla_put_failure;
|
|
||||||
/* fall through */
|
|
||||||
case L2TP_ENCAPTYPE_IP:
|
|
||||||
#if IS_ENABLED(CONFIG_IPV6)
|
|
||||||
if (np) {
|
|
||||||
if (nla_put_in6_addr(skb, L2TP_ATTR_IP6_SADDR,
|
|
||||||
&np->saddr) ||
|
|
||||||
nla_put_in6_addr(skb, L2TP_ATTR_IP6_DADDR,
|
|
||||||
&sk->sk_v6_daddr))
|
|
||||||
goto nla_put_failure;
|
|
||||||
} else
|
|
||||||
#endif
|
|
||||||
if (nla_put_in_addr(skb, L2TP_ATTR_IP_SADDR,
|
|
||||||
inet->inet_saddr) ||
|
|
||||||
nla_put_in_addr(skb, L2TP_ATTR_IP_DADDR,
|
|
||||||
inet->inet_daddr))
|
|
||||||
goto nla_put_failure;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
out:
|
|
||||||
genlmsg_end(skb, hdr);
|
genlmsg_end(skb, hdr);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
@ -475,7 +498,7 @@ static int l2tp_nl_cmd_tunnel_dump(struct sk_buff *skb, struct netlink_callback
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
tunnel = l2tp_tunnel_get_nth(net, ti);
|
tunnel = l2tp_tunnel_get_nth(net, ti);
|
||||||
if (tunnel == NULL)
|
if (!tunnel)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (l2tp_nl_tunnel_send(skb, NETLINK_CB(cb->skb).portid,
|
if (l2tp_nl_tunnel_send(skb, NETLINK_CB(cb->skb).portid,
|
||||||
|
@ -598,14 +621,13 @@ static int l2tp_nl_cmd_session_create(struct sk_buff *skb, struct genl_info *inf
|
||||||
cfg.reorder_timeout = nla_get_msecs(info->attrs[L2TP_ATTR_RECV_TIMEOUT]);
|
cfg.reorder_timeout = nla_get_msecs(info->attrs[L2TP_ATTR_RECV_TIMEOUT]);
|
||||||
|
|
||||||
#ifdef CONFIG_MODULES
|
#ifdef CONFIG_MODULES
|
||||||
if (l2tp_nl_cmd_ops[cfg.pw_type] == NULL) {
|
if (!l2tp_nl_cmd_ops[cfg.pw_type]) {
|
||||||
genl_unlock();
|
genl_unlock();
|
||||||
request_module("net-l2tp-type-%u", cfg.pw_type);
|
request_module("net-l2tp-type-%u", cfg.pw_type);
|
||||||
genl_lock();
|
genl_lock();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if ((l2tp_nl_cmd_ops[cfg.pw_type] == NULL) ||
|
if (!l2tp_nl_cmd_ops[cfg.pw_type] || !l2tp_nl_cmd_ops[cfg.pw_type]->session_create) {
|
||||||
(l2tp_nl_cmd_ops[cfg.pw_type]->session_create == NULL)) {
|
|
||||||
ret = -EPROTONOSUPPORT;
|
ret = -EPROTONOSUPPORT;
|
||||||
goto out_tunnel;
|
goto out_tunnel;
|
||||||
}
|
}
|
||||||
|
@ -637,7 +659,7 @@ static int l2tp_nl_cmd_session_delete(struct sk_buff *skb, struct genl_info *inf
|
||||||
u16 pw_type;
|
u16 pw_type;
|
||||||
|
|
||||||
session = l2tp_nl_session_get(info);
|
session = l2tp_nl_session_get(info);
|
||||||
if (session == NULL) {
|
if (!session) {
|
||||||
ret = -ENODEV;
|
ret = -ENODEV;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
@ -662,7 +684,7 @@ static int l2tp_nl_cmd_session_modify(struct sk_buff *skb, struct genl_info *inf
|
||||||
struct l2tp_session *session;
|
struct l2tp_session *session;
|
||||||
|
|
||||||
session = l2tp_nl_session_get(info);
|
session = l2tp_nl_session_get(info);
|
||||||
if (session == NULL) {
|
if (!session) {
|
||||||
ret = -ENODEV;
|
ret = -ENODEV;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
@ -729,7 +751,7 @@ static int l2tp_nl_session_send(struct sk_buff *skb, u32 portid, u32 seq, int fl
|
||||||
goto nla_put_failure;
|
goto nla_put_failure;
|
||||||
|
|
||||||
nest = nla_nest_start_noflag(skb, L2TP_ATTR_STATS);
|
nest = nla_nest_start_noflag(skb, L2TP_ATTR_STATS);
|
||||||
if (nest == NULL)
|
if (!nest)
|
||||||
goto nla_put_failure;
|
goto nla_put_failure;
|
||||||
|
|
||||||
if (nla_put_u64_64bit(skb, L2TP_ATTR_TX_PACKETS,
|
if (nla_put_u64_64bit(skb, L2TP_ATTR_TX_PACKETS,
|
||||||
|
@ -774,7 +796,7 @@ static int l2tp_nl_cmd_session_get(struct sk_buff *skb, struct genl_info *info)
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
session = l2tp_nl_session_get(info);
|
session = l2tp_nl_session_get(info);
|
||||||
if (session == NULL) {
|
if (!session) {
|
||||||
ret = -ENODEV;
|
ret = -ENODEV;
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
@ -813,14 +835,14 @@ static int l2tp_nl_cmd_session_dump(struct sk_buff *skb, struct netlink_callback
|
||||||
int si = cb->args[1];
|
int si = cb->args[1];
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
if (tunnel == NULL) {
|
if (!tunnel) {
|
||||||
tunnel = l2tp_tunnel_get_nth(net, ti);
|
tunnel = l2tp_tunnel_get_nth(net, ti);
|
||||||
if (tunnel == NULL)
|
if (!tunnel)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
session = l2tp_session_get_nth(tunnel, si);
|
session = l2tp_session_get_nth(tunnel, si);
|
||||||
if (session == NULL) {
|
if (!session) {
|
||||||
ti++;
|
ti++;
|
||||||
l2tp_tunnel_dec_refcount(tunnel);
|
l2tp_tunnel_dec_refcount(tunnel);
|
||||||
tunnel = NULL;
|
tunnel = NULL;
|
||||||
|
|
|
@ -154,12 +154,12 @@ static inline struct l2tp_session *pppol2tp_sock_to_session(struct sock *sk)
|
||||||
{
|
{
|
||||||
struct l2tp_session *session;
|
struct l2tp_session *session;
|
||||||
|
|
||||||
if (sk == NULL)
|
if (!sk)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
sock_hold(sk);
|
sock_hold(sk);
|
||||||
session = (struct l2tp_session *)(sk->sk_user_data);
|
session = (struct l2tp_session *)(sk->sk_user_data);
|
||||||
if (session == NULL) {
|
if (!session) {
|
||||||
sock_put(sk);
|
sock_put(sk);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
@ -217,7 +217,7 @@ static void pppol2tp_recv(struct l2tp_session *session, struct sk_buff *skb, int
|
||||||
*/
|
*/
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
sk = rcu_dereference(ps->sk);
|
sk = rcu_dereference(ps->sk);
|
||||||
if (sk == NULL)
|
if (!sk)
|
||||||
goto no_sock;
|
goto no_sock;
|
||||||
|
|
||||||
/* If the first two bytes are 0xFF03, consider that it is the PPP's
|
/* If the first two bytes are 0xFF03, consider that it is the PPP's
|
||||||
|
@ -285,7 +285,7 @@ static int pppol2tp_sendmsg(struct socket *sock, struct msghdr *m,
|
||||||
/* Get session and tunnel contexts */
|
/* Get session and tunnel contexts */
|
||||||
error = -EBADF;
|
error = -EBADF;
|
||||||
session = pppol2tp_sock_to_session(sk);
|
session = pppol2tp_sock_to_session(sk);
|
||||||
if (session == NULL)
|
if (!session)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
tunnel = session->tunnel;
|
tunnel = session->tunnel;
|
||||||
|
@ -360,7 +360,7 @@ static int pppol2tp_xmit(struct ppp_channel *chan, struct sk_buff *skb)
|
||||||
|
|
||||||
/* Get session and tunnel contexts from the socket */
|
/* Get session and tunnel contexts from the socket */
|
||||||
session = pppol2tp_sock_to_session(sk);
|
session = pppol2tp_sock_to_session(sk);
|
||||||
if (session == NULL)
|
if (!session)
|
||||||
goto abort;
|
goto abort;
|
||||||
|
|
||||||
tunnel = session->tunnel;
|
tunnel = session->tunnel;
|
||||||
|
@ -703,7 +703,7 @@ static int pppol2tp_connect(struct socket *sock, struct sockaddr *uservaddr,
|
||||||
* tunnel id.
|
* tunnel id.
|
||||||
*/
|
*/
|
||||||
if (!info.session_id && !info.peer_session_id) {
|
if (!info.session_id && !info.peer_session_id) {
|
||||||
if (tunnel == NULL) {
|
if (!tunnel) {
|
||||||
struct l2tp_tunnel_cfg tcfg = {
|
struct l2tp_tunnel_cfg tcfg = {
|
||||||
.encap = L2TP_ENCAPTYPE_UDP,
|
.encap = L2TP_ENCAPTYPE_UDP,
|
||||||
.debug = 0,
|
.debug = 0,
|
||||||
|
@ -738,11 +738,11 @@ static int pppol2tp_connect(struct socket *sock, struct sockaddr *uservaddr,
|
||||||
} else {
|
} else {
|
||||||
/* Error if we can't find the tunnel */
|
/* Error if we can't find the tunnel */
|
||||||
error = -ENOENT;
|
error = -ENOENT;
|
||||||
if (tunnel == NULL)
|
if (!tunnel)
|
||||||
goto end;
|
goto end;
|
||||||
|
|
||||||
/* Error if socket is not prepped */
|
/* Error if socket is not prepped */
|
||||||
if (tunnel->sock == NULL)
|
if (!tunnel->sock)
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -802,8 +802,7 @@ static int pppol2tp_connect(struct socket *sock, struct sockaddr *uservaddr,
|
||||||
* the internal context for use by ioctl() and sockopt()
|
* the internal context for use by ioctl() and sockopt()
|
||||||
* handlers.
|
* handlers.
|
||||||
*/
|
*/
|
||||||
if ((session->session_id == 0) &&
|
if (session->session_id == 0 && session->peer_session_id == 0) {
|
||||||
(session->peer_session_id == 0)) {
|
|
||||||
error = 0;
|
error = 0;
|
||||||
goto out_no_ppp;
|
goto out_no_ppp;
|
||||||
}
|
}
|
||||||
|
@ -911,21 +910,21 @@ static int pppol2tp_getname(struct socket *sock, struct sockaddr *uaddr,
|
||||||
struct pppol2tp_session *pls;
|
struct pppol2tp_session *pls;
|
||||||
|
|
||||||
error = -ENOTCONN;
|
error = -ENOTCONN;
|
||||||
if (sk == NULL)
|
if (!sk)
|
||||||
goto end;
|
goto end;
|
||||||
if (!(sk->sk_state & PPPOX_CONNECTED))
|
if (!(sk->sk_state & PPPOX_CONNECTED))
|
||||||
goto end;
|
goto end;
|
||||||
|
|
||||||
error = -EBADF;
|
error = -EBADF;
|
||||||
session = pppol2tp_sock_to_session(sk);
|
session = pppol2tp_sock_to_session(sk);
|
||||||
if (session == NULL)
|
if (!session)
|
||||||
goto end;
|
goto end;
|
||||||
|
|
||||||
pls = l2tp_session_priv(session);
|
pls = l2tp_session_priv(session);
|
||||||
tunnel = session->tunnel;
|
tunnel = session->tunnel;
|
||||||
|
|
||||||
inet = inet_sk(tunnel->sock);
|
inet = inet_sk(tunnel->sock);
|
||||||
if ((tunnel->version == 2) && (tunnel->sock->sk_family == AF_INET)) {
|
if (tunnel->version == 2 && tunnel->sock->sk_family == AF_INET) {
|
||||||
struct sockaddr_pppol2tp sp;
|
struct sockaddr_pppol2tp sp;
|
||||||
|
|
||||||
len = sizeof(sp);
|
len = sizeof(sp);
|
||||||
|
@ -943,8 +942,7 @@ static int pppol2tp_getname(struct socket *sock, struct sockaddr *uaddr,
|
||||||
sp.pppol2tp.addr.sin_addr.s_addr = inet->inet_daddr;
|
sp.pppol2tp.addr.sin_addr.s_addr = inet->inet_daddr;
|
||||||
memcpy(uaddr, &sp, len);
|
memcpy(uaddr, &sp, len);
|
||||||
#if IS_ENABLED(CONFIG_IPV6)
|
#if IS_ENABLED(CONFIG_IPV6)
|
||||||
} else if ((tunnel->version == 2) &&
|
} else if (tunnel->version == 2 && tunnel->sock->sk_family == AF_INET6) {
|
||||||
(tunnel->sock->sk_family == AF_INET6)) {
|
|
||||||
struct sockaddr_pppol2tpin6 sp;
|
struct sockaddr_pppol2tpin6 sp;
|
||||||
|
|
||||||
len = sizeof(sp);
|
len = sizeof(sp);
|
||||||
|
@ -962,8 +960,7 @@ static int pppol2tp_getname(struct socket *sock, struct sockaddr *uaddr,
|
||||||
memcpy(&sp.pppol2tp.addr.sin6_addr, &tunnel->sock->sk_v6_daddr,
|
memcpy(&sp.pppol2tp.addr.sin6_addr, &tunnel->sock->sk_v6_daddr,
|
||||||
sizeof(tunnel->sock->sk_v6_daddr));
|
sizeof(tunnel->sock->sk_v6_daddr));
|
||||||
memcpy(uaddr, &sp, len);
|
memcpy(uaddr, &sp, len);
|
||||||
} else if ((tunnel->version == 3) &&
|
} else if (tunnel->version == 3 && tunnel->sock->sk_family == AF_INET6) {
|
||||||
(tunnel->sock->sk_family == AF_INET6)) {
|
|
||||||
struct sockaddr_pppol2tpv3in6 sp;
|
struct sockaddr_pppol2tpv3in6 sp;
|
||||||
|
|
||||||
len = sizeof(sp);
|
len = sizeof(sp);
|
||||||
|
@ -1179,7 +1176,7 @@ static int pppol2tp_session_setsockopt(struct sock *sk,
|
||||||
|
|
||||||
switch (optname) {
|
switch (optname) {
|
||||||
case PPPOL2TP_SO_RECVSEQ:
|
case PPPOL2TP_SO_RECVSEQ:
|
||||||
if ((val != 0) && (val != 1)) {
|
if (val != 0 && val != 1) {
|
||||||
err = -EINVAL;
|
err = -EINVAL;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1190,7 +1187,7 @@ static int pppol2tp_session_setsockopt(struct sock *sk,
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PPPOL2TP_SO_SENDSEQ:
|
case PPPOL2TP_SO_SENDSEQ:
|
||||||
if ((val != 0) && (val != 1)) {
|
if (val != 0 && val != 1) {
|
||||||
err = -EINVAL;
|
err = -EINVAL;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1208,7 +1205,7 @@ static int pppol2tp_session_setsockopt(struct sock *sk,
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PPPOL2TP_SO_LNSMODE:
|
case PPPOL2TP_SO_LNSMODE:
|
||||||
if ((val != 0) && (val != 1)) {
|
if (val != 0 && val != 1) {
|
||||||
err = -EINVAL;
|
err = -EINVAL;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1263,19 +1260,18 @@ static int pppol2tp_setsockopt(struct socket *sock, int level, int optname,
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
err = -ENOTCONN;
|
err = -ENOTCONN;
|
||||||
if (sk->sk_user_data == NULL)
|
if (!sk->sk_user_data)
|
||||||
goto end;
|
goto end;
|
||||||
|
|
||||||
/* Get session context from the socket */
|
/* Get session context from the socket */
|
||||||
err = -EBADF;
|
err = -EBADF;
|
||||||
session = pppol2tp_sock_to_session(sk);
|
session = pppol2tp_sock_to_session(sk);
|
||||||
if (session == NULL)
|
if (!session)
|
||||||
goto end;
|
goto end;
|
||||||
|
|
||||||
/* Special case: if session_id == 0x0000, treat as operation on tunnel
|
/* Special case: if session_id == 0x0000, treat as operation on tunnel
|
||||||
*/
|
*/
|
||||||
if ((session->session_id == 0) &&
|
if (session->session_id == 0 && session->peer_session_id == 0) {
|
||||||
(session->peer_session_id == 0)) {
|
|
||||||
tunnel = session->tunnel;
|
tunnel = session->tunnel;
|
||||||
err = pppol2tp_tunnel_setsockopt(sk, tunnel, optname, val);
|
err = pppol2tp_tunnel_setsockopt(sk, tunnel, optname, val);
|
||||||
} else {
|
} else {
|
||||||
|
@ -1382,18 +1378,17 @@ static int pppol2tp_getsockopt(struct socket *sock, int level, int optname,
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
err = -ENOTCONN;
|
err = -ENOTCONN;
|
||||||
if (sk->sk_user_data == NULL)
|
if (!sk->sk_user_data)
|
||||||
goto end;
|
goto end;
|
||||||
|
|
||||||
/* Get the session context */
|
/* Get the session context */
|
||||||
err = -EBADF;
|
err = -EBADF;
|
||||||
session = pppol2tp_sock_to_session(sk);
|
session = pppol2tp_sock_to_session(sk);
|
||||||
if (session == NULL)
|
if (!session)
|
||||||
goto end;
|
goto end;
|
||||||
|
|
||||||
/* Special case: if session_id == 0x0000, treat as operation on tunnel */
|
/* Special case: if session_id == 0x0000, treat as operation on tunnel */
|
||||||
if ((session->session_id == 0) &&
|
if (session->session_id == 0 && session->peer_session_id == 0) {
|
||||||
(session->peer_session_id == 0)) {
|
|
||||||
tunnel = session->tunnel;
|
tunnel = session->tunnel;
|
||||||
err = pppol2tp_tunnel_getsockopt(sk, tunnel, optname, &val);
|
err = pppol2tp_tunnel_getsockopt(sk, tunnel, optname, &val);
|
||||||
if (err)
|
if (err)
|
||||||
|
@ -1464,7 +1459,7 @@ static void pppol2tp_next_session(struct net *net, struct pppol2tp_seq_data *pd)
|
||||||
pd->session = l2tp_session_get_nth(pd->tunnel, pd->session_idx);
|
pd->session = l2tp_session_get_nth(pd->tunnel, pd->session_idx);
|
||||||
pd->session_idx++;
|
pd->session_idx++;
|
||||||
|
|
||||||
if (pd->session == NULL) {
|
if (!pd->session) {
|
||||||
pd->session_idx = 0;
|
pd->session_idx = 0;
|
||||||
pppol2tp_next_tunnel(net, pd);
|
pppol2tp_next_tunnel(net, pd);
|
||||||
}
|
}
|
||||||
|
@ -1479,17 +1474,17 @@ static void *pppol2tp_seq_start(struct seq_file *m, loff_t *offs)
|
||||||
if (!pos)
|
if (!pos)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
BUG_ON(m->private == NULL);
|
BUG_ON(!m->private);
|
||||||
pd = m->private;
|
pd = m->private;
|
||||||
net = seq_file_net(m);
|
net = seq_file_net(m);
|
||||||
|
|
||||||
if (pd->tunnel == NULL)
|
if (!pd->tunnel)
|
||||||
pppol2tp_next_tunnel(net, pd);
|
pppol2tp_next_tunnel(net, pd);
|
||||||
else
|
else
|
||||||
pppol2tp_next_session(net, pd);
|
pppol2tp_next_session(net, pd);
|
||||||
|
|
||||||
/* NULL tunnel and session indicates end of list */
|
/* NULL tunnel and session indicates end of list */
|
||||||
if ((pd->tunnel == NULL) && (pd->session == NULL))
|
if (!pd->tunnel && !pd->session)
|
||||||
pd = NULL;
|
pd = NULL;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
|
Loading…
Reference in New Issue