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