On Wed, May 13, 2026 at 3:13 AM Ales Musil via dev <[email protected]> wrote:
> Add support for unicast compose_nd_ns that allows the caller to > specify if the packet should be created as multicast or unicast > to specified address. > > Signed-off-by: Ales Musil <[email protected]> > --- > Note: This is planned to be used by OVN for MAC binding refresh, > as that it would be nice if this could be backported. > --- > lib/packets.c | 16 ++++++++++------ > lib/packets.h | 1 + > ofproto/ofproto-dpif-xlate.c | 2 +- > 3 files changed, 12 insertions(+), 7 deletions(-) > > diff --git a/lib/packets.c b/lib/packets.c > index 998a73afe..fc4bc6c7f 100644 > --- a/lib/packets.c > +++ b/lib/packets.c > @@ -1869,19 +1869,23 @@ compose_ipv6(struct dp_packet *packet, uint8_t > proto, > /* Compose an IPv6 Neighbor Discovery Neighbor Solicitation message. */ > void > compose_nd_ns(struct dp_packet *b, const struct eth_addr eth_src, > + const struct eth_addr eth_dst, bool multicast, > const struct in6_addr *ipv6_src, const struct in6_addr > *ipv6_dst) > { > - struct in6_addr sn_addr; > - struct eth_addr eth_dst; > struct ovs_nd_msg *ns; > struct ovs_nd_lla_opt *lla_opt; > uint32_t icmp_csum; > > - in6_addr_solicited_node(&sn_addr, ipv6_dst); > - ipv6_multicast_to_ethernet(ð_dst, &sn_addr); > + struct in6_addr ipv6_dst_ = *ipv6_dst; > + struct eth_addr eth_dst_ = eth_dst; > Nit: Extra line break between variable declarations. Other than that, this looks good to me! -M > > - eth_compose(b, eth_dst, eth_src, ETH_TYPE_IPV6, IPV6_HEADER_LEN); > - ns = compose_ipv6(b, IPPROTO_ICMPV6, ipv6_src, &sn_addr, > + if (multicast) { > + in6_addr_solicited_node(&ipv6_dst_, ipv6_dst); > + ipv6_multicast_to_ethernet(ð_dst_, &ipv6_dst_); > + } > + > + eth_compose(b, eth_dst_, eth_src, ETH_TYPE_IPV6, IPV6_HEADER_LEN); > + ns = compose_ipv6(b, IPPROTO_ICMPV6, ipv6_src, &ipv6_dst_, > 0, 0, 255, ND_MSG_LEN + ND_LLA_OPT_LEN); > > ns->icmph.icmp6_type = ND_NEIGHBOR_SOLICIT; > diff --git a/lib/packets.h b/lib/packets.h > index 4d680412a..28aefae52 100644 > --- a/lib/packets.h > +++ b/lib/packets.h > @@ -1674,6 +1674,7 @@ void compose_arp(struct dp_packet *, uint16_t arp_op, > const struct eth_addr arp_tha, bool broadcast, > ovs_be32 arp_spa, ovs_be32 arp_tpa); > void compose_nd_ns(struct dp_packet *, const struct eth_addr eth_src, > + const struct eth_addr eth_dst, bool multicast, > const struct in6_addr *ipv6_src, > const struct in6_addr *ipv6_dst); > void compose_nd_na(struct dp_packet *, const struct eth_addr eth_src, > diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c > index c1ba447e9..8e94df9c5 100644 > --- a/ofproto/ofproto-dpif-xlate.c > +++ b/ofproto/ofproto-dpif-xlate.c > @@ -3761,7 +3761,7 @@ tnl_send_nd_request(struct xlate_ctx *ctx, const > struct xport *out_dev, > struct dp_packet packet; > > dp_packet_init(&packet, 0); > - compose_nd_ns(&packet, eth_src, ipv6_src, ipv6_dst); > + compose_nd_ns(&packet, eth_src, eth_addr_zero, true, ipv6_src, > ipv6_dst); > compose_table_xlate(ctx, out_dev, &packet); > dp_packet_uninit(&packet); > } > -- > 2.54.0 > > _______________________________________________ > dev mailing list > [email protected] > https://mail.openvswitch.org/mailman/listinfo/ovs-dev > > _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
