13c618c1dSDavid Ahern /* SPDX-License-Identifier: GPL-2.0 */ 23c618c1dSDavid Ahern #ifndef __NET_RTNH_H 33c618c1dSDavid Ahern #define __NET_RTNH_H 43c618c1dSDavid Ahern 53c618c1dSDavid Ahern #include <linux/rtnetlink.h> 63c618c1dSDavid Ahern #include <net/netlink.h> 73c618c1dSDavid Ahern rtnh_ok(const struct rtnexthop * rtnh,int remaining)83c618c1dSDavid Ahernstatic inline int rtnh_ok(const struct rtnexthop *rtnh, int remaining) 93c618c1dSDavid Ahern { 103c618c1dSDavid Ahern return remaining >= (int)sizeof(*rtnh) && 113c618c1dSDavid Ahern rtnh->rtnh_len >= sizeof(*rtnh) && 123c618c1dSDavid Ahern rtnh->rtnh_len <= remaining; 133c618c1dSDavid Ahern } 143c618c1dSDavid Ahern rtnh_next(const struct rtnexthop * rtnh,int * remaining)153c618c1dSDavid Ahernstatic inline struct rtnexthop *rtnh_next(const struct rtnexthop *rtnh, 163c618c1dSDavid Ahern int *remaining) 173c618c1dSDavid Ahern { 183c618c1dSDavid Ahern int totlen = NLA_ALIGN(rtnh->rtnh_len); 193c618c1dSDavid Ahern 203c618c1dSDavid Ahern *remaining -= totlen; 213c618c1dSDavid Ahern return (struct rtnexthop *) ((char *) rtnh + totlen); 223c618c1dSDavid Ahern } 233c618c1dSDavid Ahern rtnh_attrs(const struct rtnexthop * rtnh)243c618c1dSDavid Ahernstatic inline struct nlattr *rtnh_attrs(const struct rtnexthop *rtnh) 253c618c1dSDavid Ahern { 263c618c1dSDavid Ahern return (struct nlattr *) ((char *) rtnh + NLA_ALIGN(sizeof(*rtnh))); 273c618c1dSDavid Ahern } 283c618c1dSDavid Ahern rtnh_attrlen(const struct rtnexthop * rtnh)293c618c1dSDavid Ahernstatic inline int rtnh_attrlen(const struct rtnexthop *rtnh) 303c618c1dSDavid Ahern { 313c618c1dSDavid Ahern return rtnh->rtnh_len - NLA_ALIGN(sizeof(*rtnh)); 323c618c1dSDavid Ahern } 333c618c1dSDavid Ahern 343c618c1dSDavid Ahern #endif 35