diff --git a/criu/sk-inet.c b/criu/sk-inet.c index b14dd2ed4..4bd5abff1 100644 --- a/criu/sk-inet.c +++ b/criu/sk-inet.c @@ -412,10 +412,13 @@ static int dump_ip_opts(int sk, int family, int type, int proto, IpOptsEntry *io else if (type != SOCK_RAW) /* Due to kernel code we can use SOL_IP instead of SOL_IPV6 */ ret |= dump_opt(sk, SOL_IP, IP_FREEBIND, &ioe->freebind); + ret |= dump_opt(sk, SOL_IPV6, IPV6_RECVPKTINFO, &ioe->pktinfo); } else { ret |= dump_opt(sk, SOL_IP, IP_FREEBIND, &ioe->freebind); + ret |= dump_opt(sk, SOL_IP, IP_PKTINFO, &ioe->pktinfo); } ioe->has_freebind = ioe->freebind; + ioe->has_pktinfo = !!ioe->pktinfo; return ret; } @@ -803,9 +806,13 @@ int restore_ip_opts(int sk, int family, int proto, IpOptsEntry *ioe) if (family == AF_INET6) { if (ioe->has_freebind) ret |= restore_opt(sk, SOL_IPV6, IPV6_FREEBIND, &ioe->freebind); + if (ioe->has_pktinfo) + ret |= restore_opt(sk, SOL_IPV6, IPV6_RECVPKTINFO, &ioe->pktinfo); } else { if (ioe->has_freebind) ret |= restore_opt(sk, SOL_IP, IP_FREEBIND, &ioe->freebind); + if (ioe->has_pktinfo) + ret |= restore_opt(sk, SOL_IP, IP_PKTINFO, &ioe->pktinfo); } if (ioe->raw) diff --git a/images/sk-inet.proto b/images/sk-inet.proto index 594e29c66..ee1f0ae41 100644 --- a/images/sk-inet.proto +++ b/images/sk-inet.proto @@ -17,6 +17,8 @@ message ip_opts_entry { optional bool freebind = 1; // Fields 2 and 3 are reserved for vz7 use optional ip_opts_raw_entry raw = 4; + + optional bool pktinfo = 5; } message inet_sk_entry {