2017-06-16 15:49:15 +03:00
/*
* Copyright ( c ) 2016 Fabien Siron < fabien . siron @ epita . fr >
* Copyright ( c ) 2017 JingPiao Chen < chenjingpiao @ gmail . com >
2018-12-25 02:46:43 +03:00
* Copyright ( c ) 2016 - 2018 The strace developers .
2017-06-16 15:49:15 +03:00
* All rights reserved .
*
2018-12-10 03:00:00 +03:00
* SPDX - License - Identifier : LGPL - 2.1 - or - later
2017-06-16 15:49:15 +03:00
*/
# include "defs.h"
# include "netlink.h"
2017-06-16 16:11:23 +03:00
# include "netlink_route.h"
# include <linux/rtnetlink.h>
2017-06-16 15:49:15 +03:00
2017-06-16 15:58:38 +03:00
# include "xlat/nl_route_types.h"
2017-06-16 15:49:15 +03:00
static void
decode_family ( struct tcb * const tcp , const uint8_t family ,
const kernel_ulong_t addr , const unsigned int len )
{
tprints ( " {family= " ) ;
printxval ( addrfams , family , " AF_??? " ) ;
if ( len > sizeof ( family ) ) {
tprints ( " , " ) ;
printstr_ex ( tcp , addr + sizeof ( family ) ,
len - sizeof ( family ) , QUOTE_FORCE_HEX ) ;
}
tprints ( " } " ) ;
}
2017-06-16 16:11:23 +03:00
typedef DECL_NETLINK_ROUTE_DECODER ( ( * netlink_route_decoder_t ) ) ;
static const netlink_route_decoder_t route_decoders [ ] = {
[ RTM_DELLINK - RTM_BASE ] = decode_ifinfomsg ,
[ RTM_GETLINK - RTM_BASE ] = decode_ifinfomsg ,
[ RTM_NEWLINK - RTM_BASE ] = decode_ifinfomsg ,
2017-08-13 05:22:19 +03:00
[ RTM_SETLINK - RTM_BASE ] = decode_ifinfomsg ,
[ RTM_DELADDR - RTM_BASE ] = decode_ifaddrmsg ,
[ RTM_GETADDR - RTM_BASE ] = decode_ifaddrmsg ,
[ RTM_GETANYCAST - RTM_BASE ] = decode_ifaddrmsg ,
[ RTM_GETMULTICAST - RTM_BASE ] = decode_ifaddrmsg ,
2017-08-13 05:22:21 +03:00
[ RTM_NEWADDR - RTM_BASE ] = decode_ifaddrmsg ,
[ RTM_DELROUTE - RTM_BASE ] = decode_rtmsg ,
[ RTM_GETROUTE - RTM_BASE ] = decode_rtmsg ,
2017-08-13 05:22:23 +03:00
[ RTM_NEWROUTE - RTM_BASE ] = decode_rtmsg ,
[ RTM_DELRULE - RTM_BASE ] = decode_fib_rule_hdr ,
[ RTM_GETRULE - RTM_BASE ] = decode_fib_rule_hdr ,
2017-08-13 05:22:25 +03:00
[ RTM_NEWRULE - RTM_BASE ] = decode_fib_rule_hdr ,
[ RTM_DELNEIGH - RTM_BASE ] = decode_ndmsg ,
[ RTM_GETNEIGH - RTM_BASE ] = decode_rtm_getneigh ,
2017-08-13 05:22:27 +03:00
[ RTM_NEWNEIGH - RTM_BASE ] = decode_ndmsg ,
[ RTM_GETNEIGHTBL - RTM_BASE ] = decode_ndtmsg ,
[ RTM_NEWNEIGHTBL - RTM_BASE ] = decode_ndtmsg ,
2017-08-13 05:22:29 +03:00
[ RTM_SETNEIGHTBL - RTM_BASE ] = decode_ndtmsg ,
[ RTM_DELQDISC - RTM_BASE ] = decode_tcmsg ,
[ RTM_GETQDISC - RTM_BASE ] = decode_tcmsg ,
[ RTM_NEWQDISC - RTM_BASE ] = decode_tcmsg ,
[ RTM_DELTCLASS - RTM_BASE ] = decode_tcmsg ,
[ RTM_GETTCLASS - RTM_BASE ] = decode_tcmsg ,
[ RTM_NEWTCLASS - RTM_BASE ] = decode_tcmsg ,
[ RTM_DELTFILTER - RTM_BASE ] = decode_tcmsg ,
[ RTM_GETTFILTER - RTM_BASE ] = decode_tcmsg ,
2017-08-13 05:22:31 +03:00
[ RTM_NEWTFILTER - RTM_BASE ] = decode_tcmsg ,
[ RTM_DELACTION - RTM_BASE ] = decode_tcamsg ,
[ RTM_GETACTION - RTM_BASE ] = decode_tcamsg ,
2017-08-13 05:27:24 +03:00
[ RTM_NEWACTION - RTM_BASE ] = decode_tcamsg ,
# ifdef HAVE_STRUCT_IFADDRLBLMSG
[ RTM_DELADDRLABEL - RTM_BASE ] = decode_ifaddrlblmsg ,
[ RTM_GETADDRLABEL - RTM_BASE ] = decode_ifaddrlblmsg ,
2017-08-13 05:27:26 +03:00
[ RTM_NEWADDRLABEL - RTM_BASE ] = decode_ifaddrlblmsg ,
# endif
# ifdef HAVE_STRUCT_DCBMSG
[ RTM_GETDCB - RTM_BASE ] = decode_dcbmsg ,
2017-08-13 05:27:28 +03:00
[ RTM_SETDCB - RTM_BASE ] = decode_dcbmsg ,
# endif
# ifdef HAVE_STRUCT_NETCONFMSG
[ RTM_DELNETCONF - RTM_BASE ] = decode_netconfmsg ,
[ RTM_GETNETCONF - RTM_BASE ] = decode_netconfmsg ,
2017-08-13 05:27:30 +03:00
[ RTM_NEWNETCONF - RTM_BASE ] = decode_netconfmsg ,
# endif
# ifdef HAVE_STRUCT_BR_PORT_MSG
[ RTM_DELMDB - RTM_BASE ] = decode_br_port_msg ,
[ RTM_GETMDB - RTM_BASE ] = decode_br_port_msg ,
2017-08-13 05:29:02 +03:00
[ RTM_NEWMDB - RTM_BASE ] = decode_br_port_msg ,
2017-08-13 05:27:24 +03:00
# endif
2017-08-13 05:29:02 +03:00
[ RTM_DELNSID - RTM_BASE ] = decode_rtgenmsg ,
[ RTM_GETNSID - RTM_BASE ] = decode_rtgenmsg ,
[ RTM_NEWNSID - RTM_BASE ] = decode_rtgenmsg
2017-06-16 16:11:23 +03:00
} ;
2017-06-16 15:49:15 +03:00
bool
decode_netlink_route ( struct tcb * const tcp ,
const struct nlmsghdr * const nlmsghdr ,
const kernel_ulong_t addr ,
const unsigned int len )
{
uint8_t family ;
if ( nlmsghdr - > nlmsg_type = = NLMSG_DONE )
return false ;
2017-06-16 16:11:23 +03:00
if ( ! umove_or_printaddr ( tcp , addr , & family ) ) {
const unsigned int index = nlmsghdr - > nlmsg_type - RTM_BASE ;
if ( index < ARRAY_SIZE ( route_decoders )
& & route_decoders [ index ] ) {
route_decoders [ index ] ( tcp , nlmsghdr , family , addr , len ) ;
} else {
decode_family ( tcp , family , addr , len ) ;
}
}
2017-06-16 15:49:15 +03:00
return true ;
}