1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #ifndef __NET_RTNH_H 3*4882a593Smuzhiyun #define __NET_RTNH_H 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #include <linux/rtnetlink.h> 6*4882a593Smuzhiyun #include <net/netlink.h> 7*4882a593Smuzhiyun rtnh_ok(const struct rtnexthop * rtnh,int remaining)8*4882a593Smuzhiyunstatic inline int rtnh_ok(const struct rtnexthop *rtnh, int remaining) 9*4882a593Smuzhiyun { 10*4882a593Smuzhiyun return remaining >= (int)sizeof(*rtnh) && 11*4882a593Smuzhiyun rtnh->rtnh_len >= sizeof(*rtnh) && 12*4882a593Smuzhiyun rtnh->rtnh_len <= remaining; 13*4882a593Smuzhiyun } 14*4882a593Smuzhiyun rtnh_next(const struct rtnexthop * rtnh,int * remaining)15*4882a593Smuzhiyunstatic inline struct rtnexthop *rtnh_next(const struct rtnexthop *rtnh, 16*4882a593Smuzhiyun int *remaining) 17*4882a593Smuzhiyun { 18*4882a593Smuzhiyun int totlen = NLA_ALIGN(rtnh->rtnh_len); 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun *remaining -= totlen; 21*4882a593Smuzhiyun return (struct rtnexthop *) ((char *) rtnh + totlen); 22*4882a593Smuzhiyun } 23*4882a593Smuzhiyun rtnh_attrs(const struct rtnexthop * rtnh)24*4882a593Smuzhiyunstatic inline struct nlattr *rtnh_attrs(const struct rtnexthop *rtnh) 25*4882a593Smuzhiyun { 26*4882a593Smuzhiyun return (struct nlattr *) ((char *) rtnh + NLA_ALIGN(sizeof(*rtnh))); 27*4882a593Smuzhiyun } 28*4882a593Smuzhiyun rtnh_attrlen(const struct rtnexthop * rtnh)29*4882a593Smuzhiyunstatic inline int rtnh_attrlen(const struct rtnexthop *rtnh) 30*4882a593Smuzhiyun { 31*4882a593Smuzhiyun return rtnh->rtnh_len - NLA_ALIGN(sizeof(*rtnh)); 32*4882a593Smuzhiyun } 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun #endif 35