lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:   Thu, 3 Aug 2017 16:26:15 -0700 (PDT)
From:   Mat Martineau <mathew.j.martineau@...ux.intel.com>
To:     Tom Herbert <tom@...ntonium.net>
cc:     netdev@...r.kernel.org, rohit@...ntonium.net, davejwatson@...com
Subject: Re: [PATCH v3 net-next 2/4] sock: ULP infrastructure


On Thu, 3 Aug 2017, Tom Herbert wrote:

> Generalize the TCP ULP infrastructure recently introduced to support
> kTLS. This adds a SO_ULP socket option and creates new fields in
> sock structure for ULP ops and ULP data. Also, the interface allows
> additional per ULP parameters to be set so that a ULP can be pushed
> and operations started in one shot.
>
> Signed-off-by: Tom Herbert <tom@...ntonium.net>
> ---
> arch/alpha/include/uapi/asm/socket.h   |   2 +
> arch/frv/include/uapi/asm/socket.h     |   2 +
> arch/ia64/include/uapi/asm/socket.h    |   2 +
> arch/m32r/include/uapi/asm/socket.h    |   2 +
> arch/mips/include/uapi/asm/socket.h    |   2 +
> arch/mn10300/include/uapi/asm/socket.h |   2 +
> arch/parisc/include/uapi/asm/socket.h  |   2 +
> arch/s390/include/uapi/asm/socket.h    |   2 +
> arch/sparc/include/uapi/asm/socket.h   |   2 +
> arch/xtensa/include/uapi/asm/socket.h  |   2 +
> include/linux/socket.h                 |   9 ++
> include/net/sock.h                     |   5 +
> include/net/ulp_sock.h                 |  75 +++++++++++++
> include/uapi/asm-generic/socket.h      |   2 +
> net/Kconfig                            |   4 +
> net/core/Makefile                      |   1 +
> net/core/sock.c                        |  14 +++
> net/core/sysctl_net_core.c             |  25 +++++
> net/core/ulp_sock.c                    | 194 +++++++++++++++++++++++++++++++++
> 19 files changed, 349 insertions(+)
> create mode 100644 include/net/ulp_sock.h
> create mode 100644 net/core/ulp_sock.c
>

...

> diff --git a/include/net/ulp_sock.h b/include/net/ulp_sock.h
> new file mode 100644
> index 000000000000..37bf4d2e16b9
> --- /dev/null
> +++ b/include/net/ulp_sock.h
> @@ -0,0 +1,75 @@
> +/*
> + * Pluggable upper layer protocol support in sockets.
> + *
> + * Copyright (c) 2016-2017, Mellanox Technologies. All rights reserved.
> + * Copyright (c) 2016-2017, Dave Watson <davejwatson@...com>. All rights reserved.
> + * Copyright (c) 2017, Tom Herbert <tom@...ntonium.net>. All rights reserved.
> + *
> + */
> +
> +#ifndef __NET_ULP_SOCK_H
> +#define __NET_ULP_SOCK_H
> +
> +#include <linux/socket.h>
> +
> +#define ULP_MAX             128
> +#define ULP_BUF_MAX         (ULP_NAME_MAX * ULP_MAX)
> +
> +struct ulp_ops {
> +	struct list_head list;
> +
> +	/* initialize ulp */
> +	int (*init)(struct sock *sk, char __user *optval, int len);
> +
> +	/* cleanup ulp */
> +	void (*release)(struct sock *sk);
> +
> +	/* Get ULP specific parameters in getsockopt */
> +	int (*get_params)(struct sock *sk, char __user *optval, int *optlen);
> +
> +	char name[ULP_NAME_MAX];
> +	struct module *owner;
> +};
> +
> +#ifdef CONFIG_ULP_SOCK
> +
> +int ulp_register(struct ulp_ops *type);
> +void ulp_unregister(struct ulp_ops *type);
> +int ulp_set(struct sock *sk, char __user *optval, int len);
> +int ulp_get_config(struct sock *sk, char __user *optval, int *optlen);
> +void ulp_get_available(char *buf, size_t len);
> +void ulp_cleanup(struct sock *sk);
> +
> +#else
> +
> +static inline int ulp_register(struct ulp_ops *type)
> +{
> +	return -EOPNOTSUPP;
> +}
> +
> +static inline void ulp_unregister(struct ulp_ops *type)
> +{
> +}
> +
> +static inline int ulp_set(struct sock *sk, char __user *optval, int len)
> +{
> +	return -EOPNOTSUPP;
> +}
> +
> +static inline int ulp_get_config(struct sock *sk, char __user *optval,
> +				 int *optlen)
> +{
> +	return -EOPNOTSUPP;
> +}
> +
> +static inline void ulp_get_available(char *buf, size_t len)
> +{

proc_ulp_available() doesn't initialize *buf, so the string needs to be 
NUL-terminated here.

> +}
> +
> +static inline void ulp_cleanup(struct sock *sk)
> +{
> +}
> +
> +#endif
> +
> +#endif /* __NET_ULP_SOCK_H */

...

> diff --git a/net/core/sysctl_net_core.c b/net/core/sysctl_net_core.c
> index b7cd9aafe99e..9e14f91b57eb 100644
> --- a/net/core/sysctl_net_core.c
> +++ b/net/core/sysctl_net_core.c
> @@ -21,6 +21,7 @@
> #include <net/net_ratelimit.h>
> #include <net/busy_poll.h>
> #include <net/pkt_sched.h>
> +#include <net/ulp_sock.h>
>
> static int zero = 0;
> static int one = 1;
> @@ -249,6 +250,24 @@ static int proc_do_rss_key(struct ctl_table *table, int write,
> 	return proc_dostring(&fake_table, write, buffer, lenp, ppos);
> }
>
> +static int proc_ulp_available(struct ctl_table *ctl,
> +			      int write,
> +			      void __user *buffer, size_t *lenp,
> +			      loff_t *ppos)
> +{
> +	struct ctl_table tbl = { .maxlen = ULP_BUF_MAX, };
> +	int ret;
> +
> +	tbl.data = kmalloc(tbl.maxlen, GFP_USER);

(Just flagging this to provide context for the uninitialized data comment 
above)

> +	if (!tbl.data)
> +		return -ENOMEM;
> +	ulp_get_available(tbl.data, ULP_BUF_MAX);
> +	ret = proc_dostring(&tbl, write, buffer, lenp, ppos);
> +	kfree(tbl.data);
> +
> +	return ret;
> +}
> +
> static struct ctl_table net_core_table[] = {
> #ifdef CONFIG_NET
> 	{
> @@ -460,6 +479,12 @@ static struct ctl_table net_core_table[] = {
> 		.proc_handler	= proc_dointvec_minmax,
> 		.extra1		= &zero,
> 	},
> +	{
> +		.procname	= "ulp_available",
> +		.maxlen		= ULP_BUF_MAX,
> +		.mode		= 0444,
> +		.proc_handler	= proc_ulp_available,
> +	},
> 	{ }
> };
>


Regards,

--
Mat Martineau
Intel OTC

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ