1*4dc78e53SAndroid Build Coastguard Worker /* SPDX-License-Identifier: LGPL-2.1-only */ 2*4dc78e53SAndroid Build Coastguard Worker /* 3*4dc78e53SAndroid Build Coastguard Worker * Copyright (c) 2003-2013 Thomas Graf <[email protected]> 4*4dc78e53SAndroid Build Coastguard Worker */ 5*4dc78e53SAndroid Build Coastguard Worker 6*4dc78e53SAndroid Build Coastguard Worker #ifndef NETLINK_LINK_API_H_ 7*4dc78e53SAndroid Build Coastguard Worker #define NETLINK_LINK_API_H_ 8*4dc78e53SAndroid Build Coastguard Worker 9*4dc78e53SAndroid Build Coastguard Worker #include <netlink/netlink.h> 10*4dc78e53SAndroid Build Coastguard Worker #include <netlink/route/link.h> 11*4dc78e53SAndroid Build Coastguard Worker 12*4dc78e53SAndroid Build Coastguard Worker #include "nl-priv-dynamic-core/nl-core.h" 13*4dc78e53SAndroid Build Coastguard Worker 14*4dc78e53SAndroid Build Coastguard Worker /** 15*4dc78e53SAndroid Build Coastguard Worker * @ingroup link_api 16*4dc78e53SAndroid Build Coastguard Worker * 17*4dc78e53SAndroid Build Coastguard Worker * Available operations to modules implementing a link info type. 18*4dc78e53SAndroid Build Coastguard Worker */ 19*4dc78e53SAndroid Build Coastguard Worker struct rtnl_link_info_ops 20*4dc78e53SAndroid Build Coastguard Worker { 21*4dc78e53SAndroid Build Coastguard Worker /** Name of link info type, must match name on kernel side */ 22*4dc78e53SAndroid Build Coastguard Worker char * io_name; 23*4dc78e53SAndroid Build Coastguard Worker 24*4dc78e53SAndroid Build Coastguard Worker /** Reference count, DO NOT MODIFY */ 25*4dc78e53SAndroid Build Coastguard Worker int io_refcnt; 26*4dc78e53SAndroid Build Coastguard Worker 27*4dc78e53SAndroid Build Coastguard Worker /** Called to assign an info type to a link. 28*4dc78e53SAndroid Build Coastguard Worker * Has to allocate enough resources to hold attributes. Can 29*4dc78e53SAndroid Build Coastguard Worker * use link->l_info to store a pointer. */ 30*4dc78e53SAndroid Build Coastguard Worker int (*io_alloc)(struct rtnl_link *); 31*4dc78e53SAndroid Build Coastguard Worker 32*4dc78e53SAndroid Build Coastguard Worker /** Called to parse the link info attribute. 33*4dc78e53SAndroid Build Coastguard Worker * Must parse the attribute and assign all values to the link. 34*4dc78e53SAndroid Build Coastguard Worker */ 35*4dc78e53SAndroid Build Coastguard Worker int (*io_parse)(struct rtnl_link *, 36*4dc78e53SAndroid Build Coastguard Worker struct nlattr *, 37*4dc78e53SAndroid Build Coastguard Worker struct nlattr *); 38*4dc78e53SAndroid Build Coastguard Worker 39*4dc78e53SAndroid Build Coastguard Worker /** Called when the link object is dumped. 40*4dc78e53SAndroid Build Coastguard Worker * Must dump the info type specific attributes. */ 41*4dc78e53SAndroid Build Coastguard Worker void (*io_dump[NL_DUMP_MAX+1])(struct rtnl_link *, 42*4dc78e53SAndroid Build Coastguard Worker struct nl_dump_params *); 43*4dc78e53SAndroid Build Coastguard Worker 44*4dc78e53SAndroid Build Coastguard Worker /** Called when a link object is cloned. 45*4dc78e53SAndroid Build Coastguard Worker * Must clone all info type specific attributes. */ 46*4dc78e53SAndroid Build Coastguard Worker int (*io_clone)(struct rtnl_link *, struct rtnl_link *); 47*4dc78e53SAndroid Build Coastguard Worker 48*4dc78e53SAndroid Build Coastguard Worker /** Called when construction a link netlink message. 49*4dc78e53SAndroid Build Coastguard Worker * Must append all info type specific attributes to the message. */ 50*4dc78e53SAndroid Build Coastguard Worker int (*io_put_attrs)(struct nl_msg *, struct rtnl_link *); 51*4dc78e53SAndroid Build Coastguard Worker 52*4dc78e53SAndroid Build Coastguard Worker /** Called to release all resources previously allocated 53*4dc78e53SAndroid Build Coastguard Worker * in either io_alloc() or io_parse(). */ 54*4dc78e53SAndroid Build Coastguard Worker void (*io_free)(struct rtnl_link *); 55*4dc78e53SAndroid Build Coastguard Worker 56*4dc78e53SAndroid Build Coastguard Worker /** Called to compare link info parameters between two links. */ 57*4dc78e53SAndroid Build Coastguard Worker int (*io_compare)(struct rtnl_link *, struct rtnl_link *, 58*4dc78e53SAndroid Build Coastguard Worker int flags); 59*4dc78e53SAndroid Build Coastguard Worker 60*4dc78e53SAndroid Build Coastguard Worker struct nl_list_head io_list; 61*4dc78e53SAndroid Build Coastguard Worker }; 62*4dc78e53SAndroid Build Coastguard Worker 63*4dc78e53SAndroid Build Coastguard Worker extern struct rtnl_link_info_ops *rtnl_link_info_ops_lookup(const char *); 64*4dc78e53SAndroid Build Coastguard Worker extern void rtnl_link_info_ops_get(struct rtnl_link_info_ops *); 65*4dc78e53SAndroid Build Coastguard Worker extern void rtnl_link_info_ops_put(struct rtnl_link_info_ops *); 66*4dc78e53SAndroid Build Coastguard Worker extern int rtnl_link_register_info(struct rtnl_link_info_ops *); 67*4dc78e53SAndroid Build Coastguard Worker extern int rtnl_link_unregister_info(struct rtnl_link_info_ops *); 68*4dc78e53SAndroid Build Coastguard Worker 69*4dc78e53SAndroid Build Coastguard Worker 70*4dc78e53SAndroid Build Coastguard Worker /** 71*4dc78e53SAndroid Build Coastguard Worker * @ingroup link_api 72*4dc78e53SAndroid Build Coastguard Worker * 73*4dc78e53SAndroid Build Coastguard Worker * Available operations to modules implementing a link address family. 74*4dc78e53SAndroid Build Coastguard Worker */ 75*4dc78e53SAndroid Build Coastguard Worker struct rtnl_link_af_ops 76*4dc78e53SAndroid Build Coastguard Worker { 77*4dc78e53SAndroid Build Coastguard Worker /** The address family this operations set implements */ 78*4dc78e53SAndroid Build Coastguard Worker const unsigned int ao_family; 79*4dc78e53SAndroid Build Coastguard Worker 80*4dc78e53SAndroid Build Coastguard Worker /** Number of users of this operations, DO NOT MODIFY. */ 81*4dc78e53SAndroid Build Coastguard Worker int ao_refcnt; 82*4dc78e53SAndroid Build Coastguard Worker 83*4dc78e53SAndroid Build Coastguard Worker /** Validation policy for IFLA_PROTINFO attribute. This pointer 84*4dc78e53SAndroid Build Coastguard Worker * can be set to a nla_policy structure describing the minimal 85*4dc78e53SAndroid Build Coastguard Worker * requirements the attribute must meet. Failure of meeting these 86*4dc78e53SAndroid Build Coastguard Worker * requirements will result in a parsing error. */ 87*4dc78e53SAndroid Build Coastguard Worker const struct nla_policy *ao_protinfo_policy; 88*4dc78e53SAndroid Build Coastguard Worker 89*4dc78e53SAndroid Build Coastguard Worker /** Called after address family has been assigned to link. Must 90*4dc78e53SAndroid Build Coastguard Worker * allocate data buffer to hold address family specific data and 91*4dc78e53SAndroid Build Coastguard Worker * store it in link->l_af_data. */ 92*4dc78e53SAndroid Build Coastguard Worker void * (*ao_alloc)(struct rtnl_link *); 93*4dc78e53SAndroid Build Coastguard Worker 94*4dc78e53SAndroid Build Coastguard Worker /** Called when the link is cloned, must allocate a clone of the 95*4dc78e53SAndroid Build Coastguard Worker * address family specific buffer and return it. */ 96*4dc78e53SAndroid Build Coastguard Worker void * (*ao_clone)(struct rtnl_link *, void *); 97*4dc78e53SAndroid Build Coastguard Worker 98*4dc78e53SAndroid Build Coastguard Worker /** Called when the link gets freed. Must free all allocated data */ 99*4dc78e53SAndroid Build Coastguard Worker void (*ao_free)(struct rtnl_link *, void *); 100*4dc78e53SAndroid Build Coastguard Worker 101*4dc78e53SAndroid Build Coastguard Worker /** Called if a IFLA_PROTINFO attribute needs to be parsed. Typically 102*4dc78e53SAndroid Build Coastguard Worker * stores the parsed data in the address family specific buffer. */ 103*4dc78e53SAndroid Build Coastguard Worker int (*ao_parse_protinfo)(struct rtnl_link *, 104*4dc78e53SAndroid Build Coastguard Worker struct nlattr *, void *); 105*4dc78e53SAndroid Build Coastguard Worker 106*4dc78e53SAndroid Build Coastguard Worker /** Called if a IFLA_AF_SPEC attribute needs to be parsed. Typically 107*4dc78e53SAndroid Build Coastguard Worker * stores the parsed data in the address family specific buffer. */ 108*4dc78e53SAndroid Build Coastguard Worker int (*ao_parse_af)(struct rtnl_link *, 109*4dc78e53SAndroid Build Coastguard Worker struct nlattr *, void *); 110*4dc78e53SAndroid Build Coastguard Worker 111*4dc78e53SAndroid Build Coastguard Worker /** Called if a link message is sent to the kernel. Must append the 112*4dc78e53SAndroid Build Coastguard Worker * link address family specific attributes to the message. */ 113*4dc78e53SAndroid Build Coastguard Worker int (*ao_fill_af)(struct rtnl_link *, 114*4dc78e53SAndroid Build Coastguard Worker struct nl_msg *msg, void *); 115*4dc78e53SAndroid Build Coastguard Worker 116*4dc78e53SAndroid Build Coastguard Worker /** Called if the full IFLA_AF_SPEC data needs to be parsed. Typically 117*4dc78e53SAndroid Build Coastguard Worker * stores the parsed data in the address family specific buffer. */ 118*4dc78e53SAndroid Build Coastguard Worker int (*ao_parse_af_full)(struct rtnl_link *, 119*4dc78e53SAndroid Build Coastguard Worker struct nlattr *, void *); 120*4dc78e53SAndroid Build Coastguard Worker 121*4dc78e53SAndroid Build Coastguard Worker /** Called for GETLINK message to the kernel. Used to append 122*4dc78e53SAndroid Build Coastguard Worker * link address family specific attributes to the request message. */ 123*4dc78e53SAndroid Build Coastguard Worker int (*ao_get_af)(struct nl_msg *msg, 124*4dc78e53SAndroid Build Coastguard Worker uint32_t *ext_filter_mask); 125*4dc78e53SAndroid Build Coastguard Worker 126*4dc78e53SAndroid Build Coastguard Worker /** Dump address family specific link attributes */ 127*4dc78e53SAndroid Build Coastguard Worker void (*ao_dump[NL_DUMP_MAX+1])(struct rtnl_link *, 128*4dc78e53SAndroid Build Coastguard Worker struct nl_dump_params *, 129*4dc78e53SAndroid Build Coastguard Worker void *); 130*4dc78e53SAndroid Build Coastguard Worker 131*4dc78e53SAndroid Build Coastguard Worker /** Comparison function 132*4dc78e53SAndroid Build Coastguard Worker * 133*4dc78e53SAndroid Build Coastguard Worker * Will be called when two links are compared for their af data. It 134*4dc78e53SAndroid Build Coastguard Worker * takes two link objects in question, an object specific bitmask 135*4dc78e53SAndroid Build Coastguard Worker * defining which attributes should be compared and flags to control 136*4dc78e53SAndroid Build Coastguard Worker * the behaviour 137*4dc78e53SAndroid Build Coastguard Worker * 138*4dc78e53SAndroid Build Coastguard Worker * The function must return a bitmask with the relevant bit set for 139*4dc78e53SAndroid Build Coastguard Worker * each attribute that mismatches 140*4dc78e53SAndroid Build Coastguard Worker */ 141*4dc78e53SAndroid Build Coastguard Worker int (*ao_compare)(struct rtnl_link *, 142*4dc78e53SAndroid Build Coastguard Worker struct rtnl_link *, int, uint32_t, int); 143*4dc78e53SAndroid Build Coastguard Worker 144*4dc78e53SAndroid Build Coastguard Worker /* RTM_NEWLINK override 145*4dc78e53SAndroid Build Coastguard Worker * 146*4dc78e53SAndroid Build Coastguard Worker * Called if a change link request is set to the kernel. If this returns 147*4dc78e53SAndroid Build Coastguard Worker * anything other than zero, RTM_NEWLINK will be overriden with 148*4dc78e53SAndroid Build Coastguard Worker * RTM_SETLINK when rtnl_link_build_change_request() is called. 149*4dc78e53SAndroid Build Coastguard Worker */ 150*4dc78e53SAndroid Build Coastguard Worker int (*ao_override_rtm)(struct rtnl_link *); 151*4dc78e53SAndroid Build Coastguard Worker 152*4dc78e53SAndroid Build Coastguard Worker /** Called if a link message is sent to the kernel. Must append the 153*4dc78e53SAndroid Build Coastguard Worker * link protocol specific attributes to the message. (IFLA_PROTINFO) */ 154*4dc78e53SAndroid Build Coastguard Worker int (*ao_fill_pi)(struct rtnl_link *, 155*4dc78e53SAndroid Build Coastguard Worker struct nl_msg *msg, void *); 156*4dc78e53SAndroid Build Coastguard Worker 157*4dc78e53SAndroid Build Coastguard Worker /** PROTINFO type 158*4dc78e53SAndroid Build Coastguard Worker * 159*4dc78e53SAndroid Build Coastguard Worker * Called if a link message is sent to the kernel. If this is set, 160*4dc78e53SAndroid Build Coastguard Worker * the default IFLA_PROTINFO is bitmasked with what is specified 161*4dc78e53SAndroid Build Coastguard Worker * here. (eg. NLA_F_NESTED) 162*4dc78e53SAndroid Build Coastguard Worker */ 163*4dc78e53SAndroid Build Coastguard Worker const int ao_fill_pi_flags; 164*4dc78e53SAndroid Build Coastguard Worker 165*4dc78e53SAndroid Build Coastguard Worker /** IFLA_AF_SPEC nesting override 166*4dc78e53SAndroid Build Coastguard Worker * 167*4dc78e53SAndroid Build Coastguard Worker * Called if a link message is sent to the kernel. If this is set, 168*4dc78e53SAndroid Build Coastguard Worker * the AF specific nest is not created. Instead, AF specific attributes 169*4dc78e53SAndroid Build Coastguard Worker * are nested directly in the IFLA_AF_SPEC attribute. 170*4dc78e53SAndroid Build Coastguard Worker */ 171*4dc78e53SAndroid Build Coastguard Worker const int ao_fill_af_no_nest; 172*4dc78e53SAndroid Build Coastguard Worker }; 173*4dc78e53SAndroid Build Coastguard Worker 174*4dc78e53SAndroid Build Coastguard Worker extern struct rtnl_link_af_ops *rtnl_link_af_ops_lookup(unsigned int); 175*4dc78e53SAndroid Build Coastguard Worker extern void rtnl_link_af_ops_put(struct rtnl_link_af_ops *); 176*4dc78e53SAndroid Build Coastguard Worker extern void * rtnl_link_af_alloc(struct rtnl_link *, 177*4dc78e53SAndroid Build Coastguard Worker const struct rtnl_link_af_ops *); 178*4dc78e53SAndroid Build Coastguard Worker extern void * rtnl_link_af_data(const struct rtnl_link *, 179*4dc78e53SAndroid Build Coastguard Worker const struct rtnl_link_af_ops *); 180*4dc78e53SAndroid Build Coastguard Worker extern int rtnl_link_af_register(struct rtnl_link_af_ops *); 181*4dc78e53SAndroid Build Coastguard Worker extern int rtnl_link_af_unregister(struct rtnl_link_af_ops *); 182*4dc78e53SAndroid Build Coastguard Worker extern int rtnl_link_af_data_compare(struct rtnl_link *a, 183*4dc78e53SAndroid Build Coastguard Worker struct rtnl_link *b, 184*4dc78e53SAndroid Build Coastguard Worker int family); 185*4dc78e53SAndroid Build Coastguard Worker extern int rtnl_link_info_data_compare(struct rtnl_link *a, 186*4dc78e53SAndroid Build Coastguard Worker struct rtnl_link *b, 187*4dc78e53SAndroid Build Coastguard Worker int flags); 188*4dc78e53SAndroid Build Coastguard Worker 189*4dc78e53SAndroid Build Coastguard Worker extern struct rtnl_link *link_lookup(struct nl_cache *cache, int ifindex); 190*4dc78e53SAndroid Build Coastguard Worker 191*4dc78e53SAndroid Build Coastguard Worker #endif 192