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