[CRIU] [PATCH 2/2] crit: Print IP addresses in nice mode
Pavel Emelyanov
xemul at parallels.com
Wed Jan 28 06:16:34 PST 2015
There are two places where we store IP addresses (both IPv4 and IPv6).
Mark them with custom option and print them in compressed form for
--nice output.
Signed-off-by: Pavel Emelyanov <xemul at parallels.com>
---
protobuf/opts.proto | 1 +
protobuf/sk-inet.proto | 4 ++--
pycriu/images/pb2dict.py | 22 ++++++++++++++++++++--
3 files changed, 23 insertions(+), 4 deletions(-)
diff --git a/protobuf/opts.proto b/protobuf/opts.proto
index a04bfad..ddfffd5 100644
--- a/protobuf/opts.proto
+++ b/protobuf/opts.proto
@@ -2,6 +2,7 @@ import "google/protobuf/descriptor.proto";
message CRIU_Opts {
optional bool hex = 1; // Idicate that CRIT should treat this field as hex.
+ optional bool ipadd = 2; // The field is IPv4/v6 address
}
extend google.protobuf.FieldOptions {
diff --git a/protobuf/sk-inet.proto b/protobuf/sk-inet.proto
index fa4d16e..bd8f074 100644
--- a/protobuf/sk-inet.proto
+++ b/protobuf/sk-inet.proto
@@ -22,8 +22,8 @@ message inet_sk_entry {
required uint32 flags = 9 [(criu).hex = true];
required uint32 backlog = 10;
- repeated uint32 src_addr = 11;
- repeated uint32 dst_addr = 12;
+ repeated uint32 src_addr = 11 [(criu).ipadd = true];
+ repeated uint32 dst_addr = 12 [(criu).ipadd = true];
required fown_entry fown = 13;
required sk_opts_entry opts = 14;
diff --git a/pycriu/images/pb2dict.py b/pycriu/images/pb2dict.py
index b76390f..cdd07a5 100644
--- a/pycriu/images/pb2dict.py
+++ b/pycriu/images/pb2dict.py
@@ -1,5 +1,7 @@
from google.protobuf.descriptor import FieldDescriptor as FD
import opts_pb2
+import ipaddr
+import socket
# pb2dict and dict2pb are methods to convert pb to/from dict.
# Inspired by:
@@ -43,6 +45,9 @@ _basic_cast = {
def _marked_as_hex(field):
return field.GetOptions().Extensions[opts_pb2.criu].hex
+def _marked_as_ip(field):
+ return field.GetOptions().Extensions[opts_pb2.criu].ipadd
+
def _pb2dict_cast(field, value, nice = False, is_hex = False):
if not is_hex:
is_hex = _marked_as_hex(field)
@@ -73,8 +78,21 @@ def pb2dict(pb, nice = False, is_hex = False):
for field, value in pb.ListFields():
if field.label == FD.LABEL_REPEATED:
d_val = []
- for v in value:
- d_val.append(_pb2dict_cast(field, v, nice, is_hex))
+ if nice and _marked_as_ip(field):
+ if len(value) == 1:
+ v = socket.ntohl(value[0])
+ addr = ipaddr.IPv4Address(v)
+ else:
+ v = 0 + (socket.ntohl(value[0]) << (32 * 3)) + \
+ (socket.ntohl(value[1]) << (32 * 2)) + \
+ (socket.ntohl(value[2]) << (32 * 1)) + \
+ (socket.ntohl(value[3]))
+ addr = ipaddr.IPv6Address(v)
+
+ d_val.append(addr.compressed)
+ else:
+ for v in value:
+ d_val.append(_pb2dict_cast(field, v, nice, is_hex))
else:
d_val = _pb2dict_cast(field, value, nice, is_hex)
--
1.8.4.2
More information about the CRIU
mailing list