[CRIU] [PATCH 1/2] sk-inet: handle the IP_FREEBIND option (v2)
Andrew Vagin
avagin at virtuozzo.com
Fri Nov 20 12:28:07 PST 2015
On Thu, Nov 19, 2015 at 05:48:21PM +0300, Andrey Vagin wrote:
> From: Andrew Vagin <avagin at virtuozzo.com>
>
> v2: set has_freebind
> Signed-off-by: Andrew Vagin <avagin at virtuozzo.com>
> ---
> protobuf/sk-inet.proto | 5 +++++
> sk-inet.c | 26 ++++++++++++++++++++++++++
> 2 files changed, 31 insertions(+)
>
> diff --git a/protobuf/sk-inet.proto b/protobuf/sk-inet.proto
> index bd8f074..ad49928 100644
> --- a/protobuf/sk-inet.proto
> +++ b/protobuf/sk-inet.proto
> @@ -2,6 +2,10 @@ import "opts.proto";
> import "fown.proto";
> import "sk-opts.proto";
>
> +message ip_opts_entry {
> + optional bool freebind = 1;
> +}
> +
> message inet_sk_entry {
> /*
> * We have two IDs here -- id and ino. The first one
> @@ -28,4 +32,5 @@ message inet_sk_entry {
> required fown_entry fown = 13;
> required sk_opts_entry opts = 14;
> optional bool v6only = 15;
> + optional ip_opts_entry ip_opts = 16;
> }
> diff --git a/sk-inet.c b/sk-inet.c
> index c06a0b2..65f103d 100644
> --- a/sk-inet.c
> +++ b/sk-inet.c
> @@ -230,10 +230,20 @@ err:
> return NULL;
> }
>
> +static int dump_ip_opts(int sk, IpOptsEntry *ioe)
> +{
> + int ret = 0;
> +
> + ret |= dump_opt(sk, SOL_IP, IP_FREEBIND, &ioe->freebind);
> + ioe->has_freebind = ioe->freebind;
> +
> + return ret;
> +}
> static int do_dump_one_inet_fd(int lfd, u32 id, const struct fd_parms *p, int family)
> {
> struct inet_sk_desc *sk;
> InetSkEntry ie = INET_SK_ENTRY__INIT;
> + IpOptsEntry ipopts = IP_OPTS_ENTRY__INIT;
> SkOptsEntry skopts = SK_OPTS_ENTRY__INIT;
> int ret = -1, err = -1, proto;
>
> @@ -272,6 +282,7 @@ static int do_dump_one_inet_fd(int lfd, u32 id, const struct fd_parms *p, int fa
>
> ie.fown = (FownEntry *)&p->fown;
> ie.opts = &skopts;
> + ie.ip_opts = &ipopts;
>
> ie.n_src_addr = PB_ALEN_INET;
> ie.n_dst_addr = PB_ALEN_INET;
> @@ -298,6 +309,9 @@ static int do_dump_one_inet_fd(int lfd, u32 id, const struct fd_parms *p, int fa
> memcpy(ie.src_addr, sk->src_addr, pb_repeated_size(&ie, src_addr));
> memcpy(ie.dst_addr, sk->dst_addr, pb_repeated_size(&ie, dst_addr));
>
> + if (dump_ip_opts(lfd, &ipopts))
> + goto err;
> +
> if (dump_socket_opts(lfd, &skopts))
> goto err;
>
> @@ -477,6 +491,15 @@ static int post_open_inet_sk(struct file_desc *d, int sk)
> return 0;
> }
>
> +int restore_ip_opts(int sk, IpOptsEntry *ioe)
> +{
> + int ret = 0;
> +
> + if (ioe->has_freebind)
> + ret |= restore_opt(sk, SOL_SOCKET, SO_PRIORITY, &ioe->freebind);
Ooops. s/SOL_SOCKET, SO_PRIORITY/SOL_IP, IP_FREEBIND/
> +
> + return ret;
> +}
> static int open_inet_sk(struct file_desc *d)
> {
> struct inet_sk_info *ii;
> @@ -565,6 +588,9 @@ done:
> if (rst_file_params(sk, ie->fown, ie->flags))
> goto err;
>
> + if (ie->ip_opts && restore_ip_opts(sk, ie->ip_opts))
> + goto err;
> +
> if (restore_socket_opts(sk, ie->opts))
> goto err;
>
> --
> 2.4.3
>
More information about the CRIU
mailing list