]> granicus.if.org Git - strace/blobdiff - rtnl_rule.c
rtnl_rule: decode new FRA_* attributes
[strace] / rtnl_rule.c
index 1ab4fd26cc9227b8e979345b116ce8be1da13aaa..740b0902594249e5005f07892e336f5640e61c2a 100644 (file)
@@ -79,6 +79,28 @@ decode_fib_rule_uid_range(struct tcb *const tcp,
 #endif
 }
 
+static bool
+decode_rule_port_range(struct tcb *const tcp,
+                      const kernel_ulong_t addr,
+                      const unsigned int len,
+                      const void *const opaque_data)
+{
+       struct /* fib_rule_port_range */ {
+               uint16_t start;
+               uint16_t end;
+       } range;
+
+       if (len < sizeof(range))
+               return false;
+       else if (!umove_or_printaddr(tcp, addr, &range)) {
+               PRINT_FIELD_U("{", range, start);
+               PRINT_FIELD_U(", ", range, end);
+               tprints("}");
+       }
+
+       return true;
+}
+
 static const nla_decoder_t fib_rule_hdr_nla_decoders[] = {
        [FRA_DST]                       = decode_rule_addr,
        [FRA_SRC]                       = decode_rule_addr,
@@ -95,7 +117,11 @@ static const nla_decoder_t fib_rule_hdr_nla_decoders[] = {
        [FRA_OIFNAME]                   = decode_nla_str,
        [FRA_PAD]                       = NULL,
        [FRA_L3MDEV]                    = decode_nla_u8,
-       [FRA_UID_RANGE]                 = decode_fib_rule_uid_range
+       [FRA_UID_RANGE]                 = decode_fib_rule_uid_range,
+       [FRA_PROTOCOL]                  = decode_nla_rt_proto,
+       [FRA_IP_PROTO]                  = decode_nla_ip_proto,
+       [FRA_SPORT_RANGE]               = decode_rule_port_range,
+       [FRA_DPORT_RANGE]               = decode_rule_port_range,
 };
 
 DECL_NETLINK_ROUTE_DECODER(decode_fib_rule_hdr)