From nobody Tue May 9 15:00:12 2023 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4QG1Y855Wzz4BHZG; Tue, 9 May 2023 15:00:12 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4QG1Y82djLz3mDJ; Tue, 9 May 2023 15:00:12 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1683644412; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=gZkLIyODHBCbYuSBaNz153+PCriI7Cjiv2GCq0X3AxY=; b=QTbiOwPIJ5s8PTnMyyt20eBCXM34zEI0OAeITQxlEMqGYLONlXtZKR5NVnkB9Z2T0r3esi gYFEscNJBbvrROx3SoqOADRDU0u/5dcrORIEjUC8sRmfazq/PirKbpQUL1rInct3WD8spi QnwjLzu1T7bfoEgZLk0zVdOHRBv/dx+qAxRFv9yC+G3eCzx0nlii/ygmtf3fnQNIXYWa2i wVbVyazDLEAK5JB1x/Iam+xj33g0anoAXXcvgggvpjzw1YM75eJazPcHMqWqCfqt1gXwy8 Hley3wSld0mQfwOz9LlB6oF37avzQ02a+I9kq7ELW9seGpuN49ACQWcwuKnlzQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1683644412; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=gZkLIyODHBCbYuSBaNz153+PCriI7Cjiv2GCq0X3AxY=; b=f7VhADGHmMbfjy8rWx2YG9Al8Z5/0KqOa0qrjWRQvIzV+sJqQBpKSzHJqa9cu/N5g7Emo4 Pmjleu37X5mbEIA5kpr5HeGNdO7wIaq+ICQXNPmM1EhxcuvuJGeqzEY0StxFpZxbSPKYfI L5KX0B531wHP69Sw2Bd/d82noNPm4MuQKV4qQyBI3NiEasz5o8Q61VZ8SkDVrGgf0+/hwL VTidIh/3nnozbhZ4rjViHhgm6XJVcHWFmc9Cjrs65A2KZprOU6I8xaVjoYeYFHDYyk2qy1 NgZheVHeNhiEut06rFwPOX2AxKE1rsqbeIPfZEvqe+DFssBZFLauS2uPr6WCwg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1683644412; a=rsa-sha256; cv=none; b=hisyMpIT6UjnFBb8GwwbdR1ATRwl6VraorL106XXBF8pFkNIgrYlyUC6lPNBcePTXXx/Fw Md7uZhpAqMOtdkWl38H2Wenl/0ZXXXi32qJUV5ET/nz5kTJzlCW21cqiP3m4BGD+ultmSb 2lQdVNNLo9WnLiQiOLa8qoBcsOMXssp8sgPfIT3+NzxcAqUQFwuEgrhKrzl+ri8YFU5ryr Y72bPu3q+nY/r/gllFaZOZuYE/ysi1J9T+gpHFwICV3FgDsx1JzHNaojOBT46rPgtSBiWf +FMwEPj5nQyQpa9RRg+uIoJIwMbewn1rDfcOw84dhQ7iwFbh7PK8S1/j9kptig== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4QG1Y81gqmzXDC; Tue, 9 May 2023 15:00:12 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 349F0CJb071336; Tue, 9 May 2023 15:00:12 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 349F0CvC071330; Tue, 9 May 2023 15:00:12 GMT (envelope-from git) Date: Tue, 9 May 2023 15:00:12 GMT Message-Id: <202305091500.349F0CvC071330@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: "Alexander V. Chernikov" Subject: git: 88bd9ef618d6 - main - netlink: automatically fill sin6_scope_id in the default snl(3) parsers. List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-main@freebsd.org X-BeenThere: dev-commits-src-main@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: melifaro X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 88bd9ef618d62171fa9e192f2c3c91e9becdc555 Auto-Submitted: auto-generated X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by melifaro: URL: https://cgit.FreeBSD.org/src/commit/?id=88bd9ef618d62171fa9e192f2c3c91e9becdc555 commit 88bd9ef618d62171fa9e192f2c3c91e9becdc555 Author: Alexander V. Chernikov AuthorDate: 2023-05-09 14:55:47 +0000 Commit: Alexander V. Chernikov CommitDate: 2023-05-09 14:55:47 +0000 netlink: automatically fill sin6_scope_id in the default snl(3) parsers. Add the optional post-parse hook to the snl(3) parser declaration. Use this hook to automatically add the interface indexes to the link-local sockaddrs. MFC after: 2 weeks --- sys/netlink/netlink_snl.h | 12 +++++- sys/netlink/netlink_snl_route_parsers.h | 73 +++++++++++++++++++++++++++++---- 2 files changed, 76 insertions(+), 9 deletions(-) diff --git a/sys/netlink/netlink_snl.h b/sys/netlink/netlink_snl.h index 83892c156273..1bf8a9cf07c8 100644 --- a/sys/netlink/netlink_snl.h +++ b/sys/netlink/netlink_snl.h @@ -146,23 +146,30 @@ struct snl_attr_parser { }; }; +typedef bool snl_parse_post_f(struct snl_state *ss, void *target); + struct snl_hdr_parser { int hdr_off; /* aligned header size */ int fp_size; int np_size; const struct snl_field_parser *fp; /* array of header field parsers */ const struct snl_attr_parser *np; /* array of attribute parsers */ + snl_parse_post_f *cb_post; /* post-parse callback */ }; -#define SNL_DECLARE_PARSER(_name, _t, _fp, _np) \ +#define SNL_DECLARE_PARSER_EXT(_name, _t, _fp, _np, _cb) \ static const struct snl_hdr_parser _name = { \ .hdr_off = sizeof(_t), \ .fp = &((_fp)[0]), \ .np = &((_np)[0]), \ .fp_size = NL_ARRAY_LEN(_fp), \ .np_size = NL_ARRAY_LEN(_np), \ + .cb_post = _cb, \ } +#define SNL_DECLARE_PARSER(_name, _t, _fp, _np) \ + SNL_DECLARE_PARSER_EXT(_name, _t, _fp, _np, NULL) + #define SNL_DECLARE_ATTR_PARSER(_name, _np) \ static const struct snl_hdr_parser _name = { \ .np = &((_np)[0]), \ @@ -471,6 +478,9 @@ snl_parse_header(struct snl_state *ss, void *hdr, int len, bool result = snl_parse_attrs_raw(ss, nla_head, len - parser->hdr_off, parser->np, parser->np_size, target); + if (result && parser->cb_post != NULL) + result = parser->cb_post(ss, target); + return (result); } diff --git a/sys/netlink/netlink_snl_route_parsers.h b/sys/netlink/netlink_snl_route_parsers.h index 1afbe3feeeb9..6332f9f9e0d9 100644 --- a/sys/netlink/netlink_snl_route_parsers.h +++ b/sys/netlink/netlink_snl_route_parsers.h @@ -33,6 +33,17 @@ /* TODO: this file should be generated automatically */ +static inline void +finalize_sockaddr(struct sockaddr *sa, uint32_t ifindex) +{ + if (sa != NULL && sa->sa_family == AF_INET6) { + struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sa; + + if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr)) + sin6->sin6_scope_id = ifindex; + } +} + /* RTM_ROUTE message parser */ struct rta_mpath_nh { @@ -63,9 +74,18 @@ static const struct snl_field_parser _fp_p_mp_nh[] = { { .off_in = _IN(rtnh_hops), .off_out = _OUT(rtnh_weight), .cb = snl_field_get_uint8 }, { .off_in = _IN(rtnh_ifindex), .off_out = _OUT(ifindex), .cb = snl_field_get_uint32 }, }; + +static inline bool +_cb_p_mp_nh(struct snl_state *ss, void *_target) +{ + struct rta_mpath_nh *target = _target; + + finalize_sockaddr(target->gw, target->ifindex); + return (true); +} #undef _IN #undef _OUT -SNL_DECLARE_PARSER(_mpath_nh_parser, struct rtnexthop, _fp_p_mp_nh, _nla_p_mp_nh); +SNL_DECLARE_PARSER_EXT(_mpath_nh_parser, struct rtnexthop, _fp_p_mp_nh, _nla_p_mp_nh, _cb_p_mp_nh); struct rta_mpath { int num_nhops; @@ -153,9 +173,19 @@ static const struct snl_field_parser _fp_p_route[] = { {.off_in = _IN(rtm_protocol), .off_out = _OUT(rtm_protocol), .cb = snl_field_get_uint8 }, {.off_in = _IN(rtm_dst_len), .off_out = _OUT(rtm_dst_len), .cb = snl_field_get_uint8 }, }; + +static inline bool +_cb_p_route(struct snl_state *ss, void *_target) +{ + struct snl_parsed_route *target = _target; + + finalize_sockaddr(target->rta_dst, target->rta_oif); + finalize_sockaddr(target->rta_gw, target->rta_oif); + return (true); +} #undef _IN #undef _OUT -SNL_DECLARE_PARSER(snl_rtm_route_parser, struct rtmsg, _fp_p_route, _nla_p_route); +SNL_DECLARE_PARSER_EXT(snl_rtm_route_parser, struct rtmsg, _fp_p_route, _nla_p_route, _cb_p_route); /* RTM_LINK message parser */ struct snl_parsed_link { @@ -251,9 +281,18 @@ static struct snl_field_parser _fp_p_neigh_s[] = { {.off_in = _IN(ndm_state), .off_out = _OUT(ndm_state), .cb = snl_field_get_uint16 }, {.off_in = _IN(ndm_ifindex), .off_out = _OUT(nda_ifindex), .cb = snl_field_get_uint32 }, }; + +static inline bool +_cb_p_neigh(struct snl_state *ss, void *_target) +{ + struct snl_parsed_neigh *target = _target; + + finalize_sockaddr(target->nda_dst, target->nda_ifindex); + return (true); +} #undef _IN #undef _OUT -SNL_DECLARE_PARSER(snl_rtm_neigh_parser, struct ndmsg, _fp_p_neigh_s, _nla_p_neigh_s); +SNL_DECLARE_PARSER_EXT(snl_rtm_neigh_parser, struct ndmsg, _fp_p_neigh_s, _nla_p_neigh_s, _cb_p_neigh); struct snl_parsed_addr { uint8_t ifa_family; @@ -267,21 +306,30 @@ struct snl_parsed_addr { #define _IN(_field) offsetof(struct ifaddrmsg, _field) #define _OUT(_field) offsetof(struct snl_parsed_addr, _field) -static struct snl_attr_parser _nla_p_addr_s[] = { +static const struct snl_attr_parser _nla_p_addr_s[] = { { .type = IFA_ADDRESS, .off = _OUT(ifa_address), .cb = snl_attr_get_ip }, { .type = IFA_LOCAL, .off = _OUT(ifa_local), .cb = snl_attr_get_ip }, { .type = IFA_LABEL, .off = _OUT(ifa_label), .cb = snl_attr_dup_string }, { .type = IFA_BROADCAST, .off = _OUT(ifa_broadcast), .cb = snl_attr_get_ip }, }; -static struct snl_field_parser _fp_p_addr_s[] = { +static const struct snl_field_parser _fp_p_addr_s[] = { {.off_in = _IN(ifa_family), .off_out = _OUT(ifa_family), .cb = snl_field_get_uint8 }, {.off_in = _IN(ifa_prefixlen), .off_out = _OUT(ifa_prefixlen), .cb = snl_field_get_uint8 }, {.off_in = _IN(ifa_index), .off_out = _OUT(ifa_index), .cb = snl_field_get_uint32 }, }; + +static inline bool +_cb_p_addr(struct snl_state *ss, void *_target) +{ + struct snl_parsed_addr *target = _target; + + finalize_sockaddr(target->ifa_address, target->ifa_index); + finalize_sockaddr(target->ifa_local, target->ifa_index); + return (true); +} #undef _IN #undef _OUT -SNL_DECLARE_PARSER(snl_rtm_addr_parser, struct ifaddrmsg, _fp_p_addr_s, _nla_p_addr_s); - +SNL_DECLARE_PARSER_EXT(snl_rtm_addr_parser, struct ifaddrmsg, _fp_p_addr_s, _nla_p_addr_s, _cb_p_addr); struct snl_parsed_nhop { uint32_t nha_id; @@ -320,9 +368,18 @@ static const struct snl_attr_parser _nla_p_nh[] = { { .type = NHA_GATEWAY, .off = _OUT(nha_gw), .cb = snl_attr_get_ip }, { .type = NHA_FREEBSD, .arg = &_nh_fbsd_parser, .cb = snl_attr_get_nested }, }; + +static inline bool +_cb_p_nh(struct snl_state *ss, void *_target) +{ + struct snl_parsed_nhop *target = _target; + + finalize_sockaddr(target->nha_gw, target->nha_oif); + return (true); +} #undef _IN #undef _OUT -SNL_DECLARE_PARSER(snl_nhmsg_parser, struct nhmsg, _fp_p_nh, _nla_p_nh); +SNL_DECLARE_PARSER_EXT(snl_nhmsg_parser, struct nhmsg, _fp_p_nh, _nla_p_nh, _cb_p_nh); static const struct snl_hdr_parser *snl_all_route_parsers[] = { &_metrics_mp_nh_parser, &_mpath_nh_parser, &_metrics_parser, &snl_rtm_route_parser,