diff --git a/net/Makefile b/net/Makefile index b2af8c396c8c..74797b5532d4 100644 --- a/net/Makefile +++ b/net/Makefile @@ -1,1737 +1,1738 @@ COMMENT = Networking tools SUBDIR += 3proxy SUBDIR += 44bsd-rdist SUBDIR += 6tunnel SUBDIR += R-cran-pingr SUBDIR += R-cran-twitteR SUBDIR += Sockets SUBDIR += activemq SUBDIR += addrwatch SUBDIR += afpfs-ng SUBDIR += aget SUBDIR += akhq SUBDIR += akonadi-calendar SUBDIR += akonadi-contacts SUBDIR += akonadi-mime SUBDIR += akonadi-search SUBDIR += alligator SUBDIR += aluminum SUBDIR += amnezia-kmod SUBDIR += amnezia-tools SUBDIR += amneziawg-go SUBDIR += amqpcat SUBDIR += aoe SUBDIR += apache-commons-net SUBDIR += apinger SUBDIR += aprsc SUBDIR += aquantia-atlantic-kmod SUBDIR += arataga SUBDIR += arp-scan SUBDIR += arp-sk SUBDIR += arpdig SUBDIR += arping SUBDIR += arpoison SUBDIR += arprelease SUBDIR += arrowdl SUBDIR += asio SUBDIR += asio130 SUBDIR += asterisk-chan_sccp SUBDIR += asterisk-g72x SUBDIR += asterisk20 SUBDIR += asterisk22 SUBDIR += astron SUBDIR += avahi SUBDIR += avahi-app SUBDIR += avahi-autoipd SUBDIR += avahi-gtk SUBDIR += avahi-gtk3 SUBDIR += avahi-header SUBDIR += avahi-libdns SUBDIR += avahi-qt5 SUBDIR += avahi-sharp SUBDIR += aws-ec2-imdsv2-get SUBDIR += axa SUBDIR += babeld SUBDIR += balance SUBDIR += bctoolbox SUBDIR += beacon SUBDIR += beanstalkd SUBDIR += belle-sip SUBDIR += bindtest SUBDIR += binkd SUBDIR += bird2 SUBDIR += bird3 SUBDIR += bittwist SUBDIR += bmon SUBDIR += boinc-client SUBDIR += boinc_curses SUBDIR += boinctui SUBDIR += bounce SUBDIR += bredbandskollen SUBDIR += brynet SUBDIR += bsdec2-image-upload SUBDIR += bsdrcmds SUBDIR += bwi-firmware-kmod SUBDIR += bwn-firmware-kmod SUBDIR += bwping SUBDIR += c3270 SUBDIR += calendarsupport SUBDIR += ccxstream SUBDIR += charm SUBDIR += chrony SUBDIR += chrony-lite SUBDIR += citrix_ica SUBDIR += cjdns SUBDIR += claws SUBDIR += cloud-init SUBDIR += cloud-init-devel SUBDIR += cloudflared SUBDIR += cloudquery SUBDIR += clusterit SUBDIR += cnd SUBDIR += containernetworking-plugins SUBDIR += corkscrew SUBDIR += corosync2 SUBDIR += corosync3 SUBDIR += courier-authlib-ldap SUBDIR += courier-sox SUBDIR += cppzmq SUBDIR += croc SUBDIR += cryptcat SUBDIR += csync2 SUBDIR += ctrace SUBDIR += cvsup-static SUBDIR += cvsync SUBDIR += czmq SUBDIR += czmq4 SUBDIR += daemonlogger SUBDIR += dante SUBDIR += daq SUBDIR += datapipe SUBDIR += dataplaneapi SUBDIR += dbeacon SUBDIR += delegate SUBDIR += deltachat-rpc-server SUBDIR += devfile SUBDIR += deviceatlas-enterprise-c SUBDIR += dgd SUBDIR += dgd-kernel SUBDIR += dgd-lpmud SUBDIR += dhcp6 SUBDIR += dhcpcd SUBDIR += dhcpcd-ui SUBDIR += dhcpd SUBDIR += dhcpd-pools SUBDIR += dhcpdump SUBDIR += dhcperf SUBDIR += dhcping SUBDIR += dhcprelya SUBDIR += dico SUBDIR += dictd SUBDIR += dpdk SUBDIR += dpdk-20.11 SUBDIR += dpinger SUBDIR += drawterm SUBDIR += dropbox-api-command SUBDIR += dropbox-uploader SUBDIR += dshell SUBDIR += dtcp SUBDIR += dtcpclient SUBDIR += dual-dhclient SUBDIR += dual-dhclient-daemon SUBDIR += dumbpipe SUBDIR += ecal SUBDIR += echoping SUBDIR += empty SUBDIR += endlessh SUBDIR += enet SUBDIR += eternalterminal SUBDIR += eturnal SUBDIR += evans SUBDIR += eventviews SUBDIR += exabgp4 SUBDIR += exoscale-cli SUBDIR += fb303 SUBDIR += fiche SUBDIR += file2pcap SUBDIR += findmtu SUBDIR += findomain SUBDIR += foreman-proxy SUBDIR += fort SUBDIR += fping SUBDIR += freebsd-route6d SUBDIR += freebsd-routed SUBDIR += freebsd-telnetd SUBDIR += freebsd-uucp SUBDIR += freediameter SUBDIR += freeipa-client SUBDIR += freeradius-client SUBDIR += freeradius3 SUBDIR += freerdp SUBDIR += freerdp3 SUBDIR += freeswitch SUBDIR += freevrrpd SUBDIR += frp SUBDIR += frr10 SUBDIR += frr10-pythontools SUBDIR += frr8 SUBDIR += frr8-pythontools SUBDIR += frr9 SUBDIR += frr9-pythontools SUBDIR += fspclient SUBDIR += fspd SUBDIR += fsplib SUBDIR += gamenetworkingsockets SUBDIR += gdrive SUBDIR += gemget SUBDIR += gemserv SUBDIR += geoclue SUBDIR += geocode-glib SUBDIR += geocode-glib2 SUBDIR += geoipupdate SUBDIR += gerbera SUBDIR += gfbgraph SUBDIR += gitlab-agent SUBDIR += gitup SUBDIR += glflow SUBDIR += glib-networking SUBDIR += gmid SUBDIR += gnet2 SUBDIR += gnetcat SUBDIR += gnome-connections SUBDIR += gnome-nettool SUBDIR += gnome-online-accounts SUBDIR += gnu-radius SUBDIR += go-bapu SUBDIR += go-cs SUBDIR += go-pkgsite SUBDIR += go-tcping SUBDIR += gobgp SUBDIR += gofish SUBDIR += google-cloud-sdk SUBDIR += gopher SUBDIR += goreplay SUBDIR += gorss SUBDIR += gotify-cli SUBDIR += gotify-server SUBDIR += gotthard SUBDIR += graphpath SUBDIR += grilo SUBDIR += grilo-plugins SUBDIR += grive2 SUBDIR += grpcox SUBDIR += grpcui SUBDIR += grpcurl SUBDIR += grsync SUBDIR += gscloud SUBDIR += gsk SUBDIR += gsocket SUBDIR += gspoof SUBDIR += gssdp SUBDIR += gssdp14 SUBDIR += gstreamer1-plugins-sctp SUBDIR += gstreamer1-plugins-srtp SUBDIR += gtk-vnc SUBDIR += guacamole-server SUBDIR += gupnp SUBDIR += gupnp-av SUBDIR += gupnp-igd SUBDIR += gupnp-tools SUBDIR += gutenfetch SUBDIR += h323plus SUBDIR += hanstunnel SUBDIR += haproxy SUBDIR += haproxy-devel SUBDIR += haproxy24 SUBDIR += haproxy26 SUBDIR += haproxy28 SUBDIR += haproxy30 SUBDIR += haproxy33 SUBDIR += hblock SUBDIR += hexinject SUBDIR += hlmaster SUBDIR += honeyd SUBDIR += hostapd SUBDIR += hostapd-devel SUBDIR += hostapd210 SUBDIR += hostapd29 SUBDIR += hping3 SUBDIR += hsflowd SUBDIR += htpdate SUBDIR += http_ping SUBDIR += httping SUBDIR += httpry SUBDIR += icmpinfo SUBDIR += icpld SUBDIR += identme SUBDIR += ifdepd SUBDIR += iffinder SUBDIR += ifstat SUBDIR += ifstated SUBDIR += igmpproxy SUBDIR += iipsrv SUBDIR += ilbc SUBDIR += imapproxy SUBDIR += incidenceeditor SUBDIR += intel-em-kmod SUBDIR += intel-iavf-kmod SUBDIR += intel-ice-kmod SUBDIR += intel-igb-kmod SUBDIR += intel-irdma-kmod SUBDIR += intel-ix-kmod SUBDIR += intel-ixl-kmod SUBDIR += intel-ixv-kmod SUBDIR += iodine SUBDIR += ip2location SUBDIR += ip2proxy SUBDIR += ip6_int SUBDIR += ipdecap SUBDIR += ipgrab SUBDIR += ipinfo-cli SUBDIR += ipsumdump SUBDIR += ipxe SUBDIR += irrd SUBDIR += isboot-kmod SUBDIR += isboot-kmod-devel SUBDIR += isc-dhcp44-client SUBDIR += isc-dhcp44-relay SUBDIR += isc-dhcp44-server SUBDIR += istgt SUBDIR += iwnet SUBDIR += java-beepcore SUBDIR += jcifs SUBDIR += jgroups SUBDIR += jicmp SUBDIR += jicmp6 SUBDIR += jose SUBDIR += jotta-cli SUBDIR += jrdesktop SUBDIR += jumpgate SUBDIR += jwhois SUBDIR += k6 SUBDIR += kafka SUBDIR += kamailio SUBDIR += kcalutils SUBDIR += kcat SUBDIR += kdenetwork SUBDIR += kdenetwork-filesharing SUBDIR += kea SUBDIR += kea-devel SUBDIR += keama SUBDIR += keycloak SUBDIR += kf5-kcalendarcore SUBDIR += kf5-kcontacts SUBDIR += kf5-kdav SUBDIR += kf5-kholidays SUBDIR += kf5-kxmlrpcclient SUBDIR += kf5-syndication SUBDIR += kf6-kcalendarcore SUBDIR += kf6-kcontacts SUBDIR += kf6-kdav SUBDIR += kf6-kholidays SUBDIR += kf6-syndication SUBDIR += kget SUBDIR += kidentitymanagement SUBDIR += kimap SUBDIR += kio-gdrive SUBDIR += kio-zeroconf SUBDIR += kippo SUBDIR += kitinerary SUBDIR += kldap SUBDIR += kmailtransport SUBDIR += kmbox SUBDIR += kmime SUBDIR += knc SUBDIR += knxd SUBDIR += kontactinterface SUBDIR += kpeoplevcard SUBDIR += kpimtextedit SUBDIR += krakend-ce SUBDIR += krdc SUBDIR += krfb SUBDIR += krill SUBDIR += ksmtp SUBDIR += ktcplist SUBDIR += ktnef SUBDIR += kube-apiserver SUBDIR += kube-controller-manager SUBDIR += kube-scheduler SUBDIR += l2tpd SUBDIR += ladvd SUBDIR += lambdamoo SUBDIR += latd SUBDIR += lavinmq SUBDIR += ldap-stats SUBDIR += ldapbrowser SUBDIR += ldapdiff SUBDIR += ldapscripts SUBDIR += ldapsdk SUBDIR += ldapsh SUBDIR += leproxy SUBDIR += lft SUBDIR += libarcus SUBDIR += libarms SUBDIR += libbgpdump SUBDIR += libcapn SUBDIR += libcharon SUBDIR += libcloudproviders SUBDIR += libcmis SUBDIR += libcoap SUBDIR += libdaq SUBDIR += libdmapsharing SUBDIR += libdnet SUBDIR += libexosip2 SUBDIR += libfabric SUBDIR += libfb SUBDIR += libfixbuf SUBDIR += libgravatar SUBDIR += libgrss SUBDIR += libgweather SUBDIR += libgweather4 SUBDIR += libifconfig SUBDIR += libilbc SUBDIR += libiscsi SUBDIR += libkgapi SUBDIR += libksieve SUBDIR += liblinphone SUBDIR += libmaia SUBDIR += libmateweather SUBDIR += libmaxminddb SUBDIR += libmdf SUBDIR += libnatpmp SUBDIR += libndp SUBDIR += libnet SUBDIR += libnfs SUBDIR += libngtcp2 SUBDIR += libngtcp2-gnutls SUBDIR += libngtcp2-wolfssl SUBDIR += libnids SUBDIR += libnpupnp SUBDIR += libnss-cache SUBDIR += libnss-mysql SUBDIR += libnss-pgsql SUBDIR += liboauth SUBDIR += libopennet SUBDIR += liboping SUBDIR += libosip2 SUBDIR += libpaho-mqtt3 SUBDIR += libpcap SUBDIR += libpcapnav SUBDIR += libpfctl SUBDIR += libproxy SUBDIR += librdkafka SUBDIR += librespeed-cli SUBDIR += librespeed-go SUBDIR += librest1 SUBDIR += librsync SUBDIR += libsignal-protocol-c SUBDIR += libslirp SUBDIR += libsockpp SUBDIR += libsrtp2 SUBDIR += libtrace SUBDIR += libunp SUBDIR += libusipp SUBDIR += libusrsctp SUBDIR += libvncserver SUBDIR += libwebsockets SUBDIR += libyang SUBDIR += libyang2 SUBDIR += libzapojit SUBDIR += libzmq3 SUBDIR += libzmq4 SUBDIR += liferea SUBDIR += linphone SUBDIR += linux-c7-avahi-libs SUBDIR += linux-c7-openldap SUBDIR += linux-c7-tcp_wrappers-libs SUBDIR += linux-rl9-avahi-libs SUBDIR += linux-rl9-openldap SUBDIR += linux-rl9-sdl_net SUBDIR += linux-rl9-tcp_wrappers-libs SUBDIR += liveMedia SUBDIR += lla SUBDIR += lldap SUBDIR += lua-luasocket SUBDIR += lualdap SUBDIR += mDNSResponder SUBDIR += macchanger SUBDIR += mad_fcl SUBDIR += madonctl SUBDIR += mailcommon SUBDIR += mailimporter SUBDIR += malo-firmware-kmod SUBDIR += mcast-bridge SUBDIR += mcjoin SUBDIR += mdns-bridge SUBDIR += mdns-repeater SUBDIR += measurement-kit SUBDIR += mediastreamer SUBDIR += megacmd SUBDIR += megatools SUBDIR += mercury SUBDIR += messagelib SUBDIR += mgen SUBDIR += micro_inetd SUBDIR += micro_proxy SUBDIR += microsocks SUBDIR += mihomo SUBDIR += mimetreeparser SUBDIR += minidlna SUBDIR += minissdpd SUBDIR += miniupnpc SUBDIR += miniupnpd SUBDIR += miredo SUBDIR += miruo SUBDIR += mlvpn SUBDIR += mobile-broadband-provider-info SUBDIR += mod_amd SUBDIR += mopd SUBDIR += mosh SUBDIR += mosquitto SUBDIR += motsognir SUBDIR += mpd-l2tp-ipv6pd-client SUBDIR += mpd5 SUBDIR += mpich SUBDIR += mpifx SUBDIR += mping SUBDIR += mptsd SUBDIR += mrouted SUBDIR += mrtparse SUBDIR += msend SUBDIR += msgraph SUBDIR += msoak SUBDIR += mtr SUBDIR += multicat SUBDIR += mvfst SUBDIR += nanomsg SUBDIR += narrowlink SUBDIR += nast SUBDIR += nats-nkeys SUBDIR += nats-nsc SUBDIR += nats-server SUBDIR += nats-streaming-server SUBDIR += nats-surveyor SUBDIR += nats-top SUBDIR += natscli SUBDIR += nbd-server SUBDIR += nbdkit SUBDIR += nc SUBDIR += ncp SUBDIR += ndisc6 SUBDIR += ndpi SUBDIR += ndproxy SUBDIR += neatvnc SUBDIR += nemesis SUBDIR += netatalk4 SUBDIR += netcat SUBDIR += netdiscover SUBDIR += netembryo SUBDIR += nethogs SUBDIR += netmap SUBDIR += netpeek SUBDIR += netpipes SUBDIR += netscript SUBDIR += netsed SUBDIR += netselect SUBDIR += netstrain SUBDIR += netwib SUBDIR += nfsshell SUBDIR += nfstrace SUBDIR += ng_mikrotik_eoip SUBDIR += ngrep SUBDIR += nifmon SUBDIR += nitroshare SUBDIR += nload SUBDIR += nmsg SUBDIR += nncp SUBDIR += nng SUBDIR += norm SUBDIR += nqptp SUBDIR += nsq SUBDIR += nss-pam-ldapd SUBDIR += nss-pam-ldapd-sasl SUBDIR += nss_ldap SUBDIR += ntimed SUBDIR += ntopng SUBDIR += ntp SUBDIR += ntpa SUBDIR += ntpd-rs SUBDIR += ntpsec SUBDIR += ntraceroute SUBDIR += nusoap SUBDIR += nxproxy SUBDIR += nyancat SUBDIR += nylon SUBDIR += ocserv SUBDIR += oha SUBDIR += olsrd SUBDIR += omnitty SUBDIR += onedrive SUBDIR += onedrivegui SUBDIR += onenetd SUBDIR += onioncat SUBDIR += onionprobe SUBDIR += ooni-mini SUBDIR += ooni-probe-cli SUBDIR += open-isns SUBDIR += openbgpd7 SUBDIR += openbgpd8 SUBDIR += openbgpd9 SUBDIR += openldap25-client SUBDIR += openldap25-server SUBDIR += openldap26-client SUBDIR += openldap26-server SUBDIR += openmdns SUBDIR += openmpi SUBDIR += openmpi4 SUBDIR += openntpd SUBDIR += openpgm SUBDIR += openradius SUBDIR += openrsync SUBDIR += openslp SUBDIR += openvswitch SUBDIR += ortp SUBDIR += osrtspproxy SUBDIR += otelcol-contrib SUBDIR += ovhcloud-cli SUBDIR += owamp SUBDIR += p5-Acme-HTTP SUBDIR += p5-AddressBook SUBDIR += p5-Amazon-SQS-Simple SUBDIR += p5-AnyEvent-MPRPC SUBDIR += p5-AnyEvent-MQTT SUBDIR += p5-AnyEvent-RabbitMQ SUBDIR += p5-AnyEvent-Twitter SUBDIR += p5-AnyEvent-Twitter-Stream SUBDIR += p5-AnyMQ-AMQP SUBDIR += p5-Apache2-SOAP SUBDIR += p5-BBS-Client SUBDIR += p5-BBS-UserInfo SUBDIR += p5-BBS-UserInfo-Maple3 SUBDIR += p5-BBS-UserInfo-Maple3itoc SUBDIR += p5-BBS-UserInfo-Ptt SUBDIR += p5-BBS-UserInfo-SOB SUBDIR += p5-BBS-UserInfo-Wretch SUBDIR += p5-Beanstalk-Client SUBDIR += p5-Cisco-IPPhone SUBDIR += p5-Crypt-DH-GMP SUBDIR += p5-Daemon-Generic SUBDIR += p5-Data-IPV4-Range-Parse SUBDIR += p5-EasyTCP SUBDIR += p5-Event-tcp SUBDIR += p5-File-Rsync SUBDIR += p5-File-RsyncP SUBDIR += p5-Frontier-RPC SUBDIR += p5-Geo-IP-PurePerl SUBDIR += p5-Geo-IPfree SUBDIR += p5-GeoIP2 SUBDIR += p5-Google-SAML-Request SUBDIR += p5-Google-SAML-Response SUBDIR += p5-Growl-GNTP SUBDIR += p5-IO-Interface SUBDIR += p5-IO-Socket-INET6 SUBDIR += p5-IO-Socket-IP SUBDIR += p5-IO-Socket-Multicast SUBDIR += p5-IO-Socket-Multicast6 SUBDIR += p5-IO-Socket-Socks SUBDIR += p5-IO-Socket-Socks-Wrapper SUBDIR += p5-IO-Socket-Timeout SUBDIR += p5-IO-Socket-UNIX-Util SUBDIR += p5-IP-Anonymous SUBDIR += p5-IP-Country SUBDIR += p5-IPC-Session SUBDIR += p5-IPv6-Address SUBDIR += p5-JavaScript-RPC SUBDIR += p5-Kafka SUBDIR += p5-MaxMind-DB-Common SUBDIR += p5-MaxMind-DB-Reader SUBDIR += p5-MaxMind-DB-Reader-XS SUBDIR += p5-Mojo-RabbitMQ-Client SUBDIR += p5-Net SUBDIR += p5-Net-ACME2 SUBDIR += p5-Net-AMQP SUBDIR += p5-Net-AMQP-RabbitMQ SUBDIR += p5-Net-APNS SUBDIR += p5-Net-APNs-Extended SUBDIR += p5-Net-ARP SUBDIR += p5-Net-Address-Ethernet SUBDIR += p5-Net-Address-IPv4-Local SUBDIR += p5-Net-Amazon SUBDIR += p5-Net-Amazon-AWSSign SUBDIR += p5-Net-Amazon-EC2 SUBDIR += p5-Net-Amazon-MechanicalTurk SUBDIR += p5-Net-Amazon-S3 SUBDIR += p5-Net-Amazon-Signature SUBDIR += p5-Net-Amazon-Signature-V3 SUBDIR += p5-Net-Amazon-Signature-V4 SUBDIR += p5-Net-Amazon-Thumbnail SUBDIR += p5-Net-Analysis SUBDIR += p5-Net-Appliance-Phrasebook SUBDIR += p5-Net-Appliance-Session SUBDIR += p5-Net-BGP SUBDIR += p5-Net-Blogger SUBDIR += p5-Net-CIDR-Lite SUBDIR += p5-Net-CIDR-MobileJP SUBDIR += p5-Net-CIDR-Set SUBDIR += p5-Net-CLI-Interact SUBDIR += p5-Net-CSTA SUBDIR += p5-Net-CascadeCopy SUBDIR += p5-Net-Cassandra SUBDIR += p5-Net-Cassandra-Easy SUBDIR += p5-Net-Connection SUBDIR += p5-Net-Connection-Match SUBDIR += p5-Net-Connection-Sort SUBDIR += p5-Net-Connection-lsof SUBDIR += p5-Net-Connection-ncnetstat SUBDIR += p5-Net-DAV-Server SUBDIR += p5-Net-DHCP SUBDIR += p5-Net-DHCP-Watch SUBDIR += p5-Net-DHCPClient SUBDIR += p5-Net-DLookup SUBDIR += p5-Net-Daemon SUBDIR += p5-Net-Delicious SUBDIR += p5-Net-Dict SUBDIR += p5-Net-Divert SUBDIR += p5-Net-Dropbox-API SUBDIR += p5-Net-EPP SUBDIR += p5-Net-EPP-Proxy SUBDIR += p5-Net-FS-Flickr SUBDIR += p5-Net-FS-Gmail SUBDIR += p5-Net-FTP-AutoReconnect SUBDIR += p5-Net-FTP-File SUBDIR += p5-Net-Finger SUBDIR += p5-Net-Flow SUBDIR += p5-Net-Frame SUBDIR += p5-Net-Frame-Device SUBDIR += p5-Net-Frame-Dump SUBDIR += p5-Net-Frame-Layer-ICMPv6 SUBDIR += p5-Net-Frame-Layer-IPv6 SUBDIR += p5-Net-Frame-Simple SUBDIR += p5-Net-GitHub SUBDIR += p5-Net-Gnats SUBDIR += p5-Net-Google SUBDIR += p5-Net-Google-Analytics SUBDIR += p5-Net-Google-AuthSub SUBDIR += p5-Net-Google-Calendar SUBDIR += p5-Net-Google-Code SUBDIR += p5-Net-Google-DataAPI SUBDIR += p5-Net-Google-PicasaWeb SUBDIR += p5-Net-Google-SafeBrowsing2 SUBDIR += p5-Net-Google-Spreadsheets SUBDIR += p5-Net-Growl SUBDIR += p5-Net-GrowlClient SUBDIR += p5-Net-HL7 SUBDIR += p5-Net-HTTP SUBDIR += p5-Net-HTTP-Spore SUBDIR += p5-Net-HTTP-Spore-Middleware-Header SUBDIR += p5-Net-HTTPS-Any SUBDIR += p5-Net-HTTPS-NB SUBDIR += p5-Net-Hiveminder SUBDIR += p5-Net-INET6Glue SUBDIR += p5-Net-IP-Minimal SUBDIR += p5-Net-IP-RangeCompare SUBDIR += p5-Net-IPTrie SUBDIR += p5-Net-IRR SUBDIR += p5-Net-Ident SUBDIR += p5-Net-Ifconfig-Wrapper SUBDIR += p5-Net-Interface SUBDIR += p5-Net-Jifty SUBDIR += p5-Net-LDAP-AutoDNs SUBDIR += p5-Net-LDAP-AutoServer SUBDIR += p5-Net-LDAP-Express SUBDIR += p5-Net-LDAP-FilterBuilder SUBDIR += p5-Net-LDAP-LDAPhash SUBDIR += p5-Net-LDAP-Makepath SUBDIR += p5-Net-LDAP-Server SUBDIR += p5-Net-LDAP-Server-Test SUBDIR += p5-Net-LDAP-posixAccount SUBDIR += p5-Net-LDAP-posixGroup SUBDIR += p5-Net-Libdnet SUBDIR += p5-Net-Libdnet6 SUBDIR += p5-Net-LimeLight-Purge SUBDIR += p5-Net-MAC SUBDIR += p5-Net-MAC-Vendor SUBDIR += p5-Net-MQTT SUBDIR += p5-Net-Mosso-CloudFiles SUBDIR += p5-Net-MovableType SUBDIR += p5-Net-NBName SUBDIR += p5-Net-NBsocket SUBDIR += p5-Net-NIS SUBDIR += p5-Net-NIS-Listgroup SUBDIR += p5-Net-NTP SUBDIR += p5-Net-Nessus-XMLRPC SUBDIR += p5-Net-Netcat SUBDIR += p5-Net-Nmsg SUBDIR += p5-Net-OAuth SUBDIR += p5-Net-OAuth-Simple SUBDIR += p5-Net-OAuth2 SUBDIR += p5-Net-OpenID-Consumer SUBDIR += p5-Net-OpenSSH SUBDIR += p5-Net-OpenSSH-Parallel SUBDIR += p5-Net-OpenStack-Attack SUBDIR += p5-Net-Packet SUBDIR += p5-Net-Packet-Target SUBDIR += p5-Net-ParseWhois SUBDIR += p5-Net-Patricia SUBDIR += p5-Net-Pcap SUBDIR += p5-Net-PcapUtils SUBDIR += p5-Net-Ping SUBDIR += p5-Net-Ping-External SUBDIR += p5-Net-Proxy SUBDIR += p5-Net-PubSubHubbub-Publisher SUBDIR += p5-Net-RTP SUBDIR += p5-Net-RabbitFoot SUBDIR += p5-Net-RabbitMQ SUBDIR += p5-Net-Radius SUBDIR += p5-Net-Random SUBDIR += p5-Net-RawIP SUBDIR += p5-Net-Rendezvous-Publish SUBDIR += p5-Net-Riak SUBDIR += p5-Net-Rsh SUBDIR += p5-Net-SAP SUBDIR += p5-Net-SCP SUBDIR += p5-Net-SCP-Expect SUBDIR += p5-Net-SDP SUBDIR += p5-Net-SFTP SUBDIR += p5-Net-SFTP-Foreign SUBDIR += p5-Net-SIP SUBDIR += p5-Net-SMPP SUBDIR += p5-Net-SMS-Clickatell SUBDIR += p5-Net-SMS-Mollie SUBDIR += p5-Net-SMS-PChome SUBDIR += p5-Net-SNPP SUBDIR += p5-Net-SSH SUBDIR += p5-Net-SSH-Expect SUBDIR += p5-Net-SSH-Mechanize SUBDIR += p5-Net-SSH-Perl SUBDIR += p5-Net-SSH2 SUBDIR += p5-Net-STOMP-Client SUBDIR += p5-Net-Server SUBDIR += p5-Net-Server-Coro SUBDIR += p5-Net-Server-SS-PreFork SUBDIR += p5-Net-Subnet SUBDIR += p5-Net-Syslog SUBDIR += p5-Net-TCLink SUBDIR += p5-Net-TacacsPlus SUBDIR += p5-Net-TcpDumpLog SUBDIR += p5-Net-Telnet SUBDIR += p5-Net-Telnet-Netscreen SUBDIR += p5-Net-TiVo SUBDIR += p5-Net-Todoist SUBDIR += p5-Net-Traceroute SUBDIR += p5-Net-Traceroute-PurePerl SUBDIR += p5-Net-Traceroute6 SUBDIR += p5-Net-Trackback SUBDIR += p5-Net-Twitter SUBDIR += p5-Net-Twitter-Lite SUBDIR += p5-Net-VNC SUBDIR += p5-Net-Wake SUBDIR += p5-Net-WhitePages SUBDIR += p5-Net-Whois SUBDIR += p5-Net-Whois-ARIN SUBDIR += p5-Net-Whois-IP SUBDIR += p5-Net-Whois-RIPE SUBDIR += p5-Net-Whois-Raw SUBDIR += p5-Net-Works SUBDIR += p5-Net-Write SUBDIR += p5-Net-XWhois SUBDIR += p5-Net-Yadis SUBDIR += p5-Net-Z3950-SimpleServer SUBDIR += p5-Net-Z3950-ZOOM SUBDIR += p5-Net-ext SUBDIR += p5-Net-sFlow SUBDIR += p5-Net-uFTP SUBDIR += p5-NetAddr-IP-Count SUBDIR += p5-NetAddr-MAC SUBDIR += p5-NetPacket SUBDIR += p5-OAI-Harvester SUBDIR += p5-OurNet-BBS SUBDIR += p5-OurNet-BBSAgent SUBDIR += p5-POE-Component-Client-Ident SUBDIR += p5-POE-Component-Client-Keepalive SUBDIR += p5-POE-Component-Client-Ping SUBDIR += p5-POE-Component-Client-Telnet SUBDIR += p5-POE-Component-Client-Traceroute SUBDIR += p5-POE-Component-Client-Twitter SUBDIR += p5-POE-Component-Client-Whois SUBDIR += p5-POE-Component-ControlPort SUBDIR += p5-POE-Component-Generic SUBDIR += p5-POE-Component-Jabber SUBDIR += p5-POE-Component-Pcap SUBDIR += p5-POE-Component-PubSub SUBDIR += p5-POE-Component-Server-Twirc SUBDIR += p5-POEx-Role-TCPServer SUBDIR += p5-POSIX-Socket SUBDIR += p5-POSIX-getpeername SUBDIR += p5-Parallel-Pvm SUBDIR += p5-Parse-Netstat SUBDIR += p5-Phone-Info SUBDIR += p5-PlRPC SUBDIR += p5-Queue-Beanstalk SUBDIR += p5-REST-Application SUBDIR += p5-REST-Google SUBDIR += p5-RPC-EPC-Service SUBDIR += p5-RPC-Simple SUBDIR += p5-RPC-XML SUBDIR += p5-ResourcePool-Resource-Net-LDAP SUBDIR += p5-ResourcePool-Resource-SOAP-Lite SUBDIR += p5-Rose-URI SUBDIR += p5-S3 SUBDIR += p5-SOAP SUBDIR += p5-SOAP-Amazon-S3 SUBDIR += p5-SOAP-Data-Builder SUBDIR += p5-SOAP-Lite SUBDIR += p5-SOAP-MySOAP SUBDIR += p5-SOAP-XML-Client SUBDIR += p5-Samba-LDAP SUBDIR += p5-Server-Starter SUBDIR += p5-Socket SUBDIR += p5-Socket-Class SUBDIR += p5-Socket-GetAddrInfo SUBDIR += p5-Socket-Multicast6 SUBDIR += p5-Socket-Netlink SUBDIR += p5-Socket6 SUBDIR += p5-Socks SUBDIR += p5-Sort-Key-IPv4 SUBDIR += p5-TFTP SUBDIR += p5-Test-URI SUBDIR += p5-Text-Authinfo SUBDIR += p5-Twitter-API SUBDIR += p5-URI SUBDIR += p5-URI-Based SUBDIR += p5-URI-Encode-XS SUBDIR += p5-URI-Fast SUBDIR += p5-URI-FromHash SUBDIR += p5-URI-Match SUBDIR += p5-URI-NamespaceMap SUBDIR += p5-URI-Nested SUBDIR += p5-URI-OpenURL SUBDIR += p5-URI-Query SUBDIR += p5-URI-SmartURI SUBDIR += p5-URI-Template SUBDIR += p5-URI-Template-Restrict SUBDIR += p5-URI-cpan SUBDIR += p5-URI-db SUBDIR += p5-VM-EC2 SUBDIR += p5-VM-EC2-Security-CredentialCache SUBDIR += p5-Validate-Net SUBDIR += p5-WebService-Dropbox SUBDIR += p5-WebService-Prowl SUBDIR += p5-What SUBDIR += p5-X500-DN SUBDIR += p5-XML-Compile-SOAP SUBDIR += p5-XML-Compile-SOAP-AnyEvent SUBDIR += p5-XML-Compile-SOAP-Daemon SUBDIR += p5-XML-Compile-SOAP-WSA SUBDIR += p5-XML-Compile-WSDL11 SUBDIR += p5-XML-Fast SUBDIR += p5-XML-RPC SUBDIR += p5-XML-RPC-Fast SUBDIR += p5-XMLRPC-Lite SUBDIR += p5-XPC SUBDIR += p5-ZMQ-FFI SUBDIR += p5-ip2location-perl SUBDIR += p5-ldap2pf SUBDIR += p5-ldap2pw SUBDIR += p5-perl-ldap SUBDIR += p5-srv2pf SUBDIR += pacemaker2 SUBDIR += packetdrill SUBDIR += packter-agent SUBDIR += parpd SUBDIR += pathneck SUBDIR += pbnc SUBDIR += pear-Auth_RADIUS SUBDIR += pear-File_Bittorrent2 SUBDIR += pear-Horde_Kolab_Server SUBDIR += pear-Horde_Kolab_Session SUBDIR += pear-Horde_Ldap SUBDIR += pear-Horde_Rpc SUBDIR += pear-Horde_Scribe SUBDIR += pear-Horde_Socket_Client SUBDIR += pear-Horde_Url SUBDIR += pear-Net_CheckIP SUBDIR += pear-Net_DIME SUBDIR += pear-Net_DNSBL SUBDIR += pear-Net_Dict SUBDIR += pear-Net_Finger SUBDIR += pear-Net_Geo SUBDIR += pear-Net_GeoIP SUBDIR += pear-Net_Growl SUBDIR += pear-Net_IDNA SUBDIR += pear-Net_IPv4 SUBDIR += pear-Net_IPv6 SUBDIR += pear-Net_Ident SUBDIR += pear-Net_LDAP SUBDIR += pear-Net_LDAP2 SUBDIR += pear-Net_MAC SUBDIR += pear-Net_NNTP SUBDIR += pear-Net_Nmap SUBDIR += pear-Net_POP3 SUBDIR += pear-Net_Ping SUBDIR += pear-Net_SMS SUBDIR += pear-Net_SMTP SUBDIR += pear-Net_Server SUBDIR += pear-Net_Sieve SUBDIR += pear-Net_Socket SUBDIR += pear-Net_Traceroute SUBDIR += pear-Net_URL SUBDIR += pear-Net_URL2 SUBDIR += pear-Net_URL_Mapper SUBDIR += pear-Net_UserAgent_Detect SUBDIR += pear-Net_UserAgent_Mobile SUBDIR += pear-Net_Vpopmaild SUBDIR += pear-Net_Whois SUBDIR += pear-SOAP SUBDIR += pear-Services_Pingback SUBDIR += pear-Services_Twitter SUBDIR += pear-URI_Template SUBDIR += pear-XML_RPC SUBDIR += pear-XML_RPC2 SUBDIR += pecl-amqp SUBDIR += pecl-oauth2 SUBDIR += pecl-radius SUBDIR += pecl-rdkafka SUBDIR += pecl-smbclient SUBDIR += pecl-xmlrpc SUBDIR += pen SUBDIR += php82-ldap SUBDIR += php82-soap SUBDIR += php82-sockets SUBDIR += php83-ldap SUBDIR += php83-soap SUBDIR += php83-sockets SUBDIR += php84-ldap SUBDIR += php84-soap SUBDIR += php84-sockets SUBDIR += php85-ldap SUBDIR += php85-soap SUBDIR += php85-sockets SUBDIR += phpldapadmin SUBDIR += pimcommon SUBDIR += pimd SUBDIR += pimdd SUBDIR += pjsip SUBDIR += pkt-gen SUBDIR += pktanon SUBDIR += pload SUBDIR += plugdaemon SUBDIR += pmix SUBDIR += poptop SUBDIR += portfwd SUBDIR += pptpclient SUBDIR += proby SUBDIR += proftpd-mod_ldap SUBDIR += prosearch SUBDIR += proxy-suite SUBDIR += proxychains SUBDIR += proxychains-ng SUBDIR += prrte SUBDIR += prtunnel SUBDIR += ptpd2 SUBDIR += ptunnel SUBDIR += pvm SUBDIR += pwhois SUBDIR += pwnat SUBDIR += pxe SUBDIR += pxe-pdhcp SUBDIR += py-DTLSSocket SUBDIR += py-GeoIP2 SUBDIR += py-aiocoap SUBDIR += py-aiohappyeyeballs SUBDIR += py-aiohttp-socks SUBDIR += py-aiostalk SUBDIR += py-amqp SUBDIR += py-amqplib SUBDIR += py-avahi SUBDIR += py-blobfile SUBDIR += py-bonsai SUBDIR += py-casttube SUBDIR += py-cepa SUBDIR += py-cjdns SUBDIR += py-cloudflare-scrape SUBDIR += py-cloudflare-scrape-js2py SUBDIR += py-cloudscraper SUBDIR += py-confluent-kafka SUBDIR += py-cymruwhois SUBDIR += py-dpkt SUBDIR += py-duet SUBDIR += py-dugong SUBDIR += py-ephemeral-port-reserve SUBDIR += py-err-backend-discord SUBDIR += py-err-backend-mattermost SUBDIR += py-errbot SUBDIR += py-errbot-backend-slackv3 SUBDIR += py-eventlet SUBDIR += py-gdown SUBDIR += py-geopy SUBDIR += py-gntp SUBDIR += py-google-cloud-pubsub SUBDIR += py-greenstalk SUBDIR += py-gspread SUBDIR += py-h11 SUBDIR += py-haproxy-cli SUBDIR += py-haproxy-log-analysis SUBDIR += py-haproxyctl SUBDIR += py-httpstat SUBDIR += py-icmplib SUBDIR += py-ifaddr SUBDIR += py-impacket SUBDIR += py-iplib SUBDIR += py-iptools SUBDIR += py-kafka-python SUBDIR += py-kombu SUBDIR += py-ldap0 SUBDIR += py-ldap3 SUBDIR += py-ldapdomaindump SUBDIR += py-ldappool SUBDIR += py-libcloud SUBDIR += py-libdnet SUBDIR += py-magic-wormhole SUBDIR += py-matrix-synapse-ldap3 SUBDIR += py-maxminddb SUBDIR += py-miniupnpc SUBDIR += py-mpi4py SUBDIR += py-mpi4py-mpich SUBDIR += py-msrplib SUBDIR += py-ndg-httpsclient SUBDIR += py-netaddr SUBDIR += py-netifaces SUBDIR += py-netifaces-plus SUBDIR += py-netsnmpagent SUBDIR += py-nnpy SUBDIR += py-ntplib SUBDIR += py-oauth SUBDIR += py-oauth2 SUBDIR += py-paho-mqtt SUBDIR += py-pamqp SUBDIR += py-pcapy SUBDIR += py-pcapy-ng SUBDIR += py-pook SUBDIR += py-port-for SUBDIR += py-portend SUBDIR += py-pychromecast SUBDIR += py-pyenet SUBDIR += py-pyfixbuf SUBDIR += py-pygeoip SUBDIR += py-pyicap SUBDIR += py-pynamecheap SUBDIR += py-pynmsg SUBDIR += py-pynsq SUBDIR += py-pypacker SUBDIR += py-pypcap SUBDIR += py-pyprowl SUBDIR += py-pyroute2 SUBDIR += py-pyroute2.minimal SUBDIR += py-pyroute2.protocols SUBDIR += py-pysendfile SUBDIR += py-pyshark SUBDIR += py-pysimplesoap SUBDIR += py-pysmb SUBDIR += py-pysocks SUBDIR += py-pystun SUBDIR += py-pystun3 SUBDIR += py-python-barbicanclient SUBDIR += py-python-bitcoinrpc SUBDIR += py-python-cinderclient SUBDIR += py-python-designateclient SUBDIR += py-python-glanceclient SUBDIR += py-python-heatclient SUBDIR += py-python-ipware SUBDIR += py-python-keystoneclient SUBDIR += py-python-ldap SUBDIR += py-python-neutronclient SUBDIR += py-python-novaclient SUBDIR += py-python-openstackclient SUBDIR += py-python-socks SUBDIR += py-python-twitter SUBDIR += py-pytradfri SUBDIR += py-pyu2f SUBDIR += py-pyvmomi SUBDIR += py-pyzmq SUBDIR += py-qt5-networkauth SUBDIR += py-qt6-networkauth SUBDIR += py-rabbitpy SUBDIR += py-radix SUBDIR += py-raet SUBDIR += py-ripe.atlas.cousteau SUBDIR += py-ripe.atlas.sagan SUBDIR += py-ripe.atlas.tools SUBDIR += py-s3cmd SUBDIR += py-s3transfer SUBDIR += py-s4cmd SUBDIR += py-saltyrtc.server SUBDIR += py-sbws SUBDIR += py-scamper SUBDIR += py-shodan SUBDIR += py-siosocks SUBDIR += py-smart-open SUBDIR += py-smbpasswd SUBDIR += py-smbprotocol SUBDIR += py-socketio-client SUBDIR += py-socksio SUBDIR += py-softlayer SUBDIR += py-speedometer SUBDIR += py-speedtest-cli SUBDIR += py-sshtunnel SUBDIR += py-sshuttle SUBDIR += py-stomp.py SUBDIR += py-suds SUBDIR += py-terminado SUBDIR += py-tiny-proxy SUBDIR += py-tofu SUBDIR += py-transip SUBDIR += py-trio SUBDIR += py-trio-websocket SUBDIR += py-tweepy SUBDIR += py-twitter-tools SUBDIR += py-txamqp SUBDIR += py-txrestapi SUBDIR += py-uri-template SUBDIR += py-uritemplate SUBDIR += py-uritools SUBDIR += py-url-normalize SUBDIR += py-urlextract SUBDIR += py-urllib3 SUBDIR += py-urllib3-future SUBDIR += py-whois SUBDIR += py-wmi-query SUBDIR += py-wsdd SUBDIR += py-wsproto SUBDIR += py-zeep SUBDIR += py-zeroconf SUBDIR += py-zope.proxy SUBDIR += pyrad SUBDIR += qadsl SUBDIR += qoauth-qt5 SUBDIR += qrcp SUBDIR += qt5-network SUBDIR += qt5-networkauth SUBDIR += qt6-coap SUBDIR += qt6-mqtt SUBDIR += qt6-networkauth SUBDIR += quagga SUBDIR += quiche SUBDIR += quoted SUBDIR += rabbitmq SUBDIR += rabbitmq-c SUBDIR += rabbitmqadmin SUBDIR += radcli SUBDIR += raddump SUBDIR += radiator SUBDIR += radiusclient SUBDIR += radreport SUBDIR += radsecproxy SUBDIR += radvd SUBDIR += rathole SUBDIR += rclone SUBDIR += rclone-browser SUBDIR += rdapper SUBDIR += rdesktop SUBDIR += rdist6 SUBDIR += rdist7 SUBDIR += rdp2tcp SUBDIR += read_bbrlog SUBDIR += realtek-re-kmod SUBDIR += realtek-re-kmod198 SUBDIR += realtek-rge-kmod SUBDIR += reaver SUBDIR += recvnet SUBDIR += redir SUBDIR += redpanda-connect SUBDIR += relayd SUBDIR += remarkable-devd SUBDIR += remmina SUBDIR += remotebox SUBDIR += remotedesk SUBDIR += repeater SUBDIR += revsocks SUBDIR += rfbproxy SUBDIR += rinetd SUBDIR += ripe-whois SUBDIR += rosenpass SUBDIR += rospo SUBDIR += routinator SUBDIR += rpki-client SUBDIR += rscsi SUBDIR += rsplib SUBDIR += rssguard SUBDIR += rsyn SUBDIR += rsync SUBDIR += rsync-bpc SUBDIR += rtg SUBDIR += rtpproxy SUBDIR += rtptools SUBDIR += rubygem-activestorage-gitlab SUBDIR += rubygem-activestorage52 SUBDIR += rubygem-activestorage60 SUBDIR += rubygem-activestorage61 SUBDIR += rubygem-activestorage70 SUBDIR += rubygem-activestorage71 SUBDIR += rubygem-activestorage72 SUBDIR += rubygem-activestorage80 SUBDIR += rubygem-activestorage81 SUBDIR += rubygem-amazon-ec2 SUBDIR += rubygem-amq-protocol SUBDIR += rubygem-amqp SUBDIR += rubygem-amqp-utils SUBDIR += rubygem-apollo_upload_server SUBDIR += rubygem-app_store_connect SUBDIR += rubygem-asset_sync SUBDIR += rubygem-aws-s3 SUBDIR += rubygem-aws-ses SUBDIR += rubygem-azure SUBDIR += rubygem-azure-core SUBDIR += rubygem-beefcake SUBDIR += rubygem-bunny SUBDIR += rubygem-cloudflare SUBDIR += rubygem-connection_pool SUBDIR += rubygem-devfile SUBDIR += rubygem-docker-api SUBDIR += rubygem-dogapi SUBDIR += rubygem-domain_name SUBDIR += rubygem-dropbox-sdk SUBDIR += rubygem-epp-client-afnic SUBDIR += rubygem-epp-client-base SUBDIR += rubygem-epp-client-rgp SUBDIR += rubygem-epp-client-secdns SUBDIR += rubygem-epp-client-smallregistry SUBDIR += rubygem-fog-aliyun SUBDIR += rubygem-fog-aliyun-gitlab SUBDIR += rubygem-fog-atmos SUBDIR += rubygem-fog-aws SUBDIR += rubygem-fog-aws-gitlab SUBDIR += rubygem-fog-azure SUBDIR += rubygem-fog-brightbox SUBDIR += rubygem-fog-cloudatcost SUBDIR += rubygem-fog-cloudstack SUBDIR += rubygem-fog-digitalocean SUBDIR += rubygem-fog-dnsimple SUBDIR += rubygem-fog-dynect SUBDIR += rubygem-fog-ecloud SUBDIR += rubygem-fog-google SUBDIR += rubygem-fog-google-gitlab SUBDIR += rubygem-fog-gridscale SUBDIR += rubygem-fog-internet-archive SUBDIR += rubygem-fog-joyent SUBDIR += rubygem-fog-local SUBDIR += rubygem-fog-local-gitlab SUBDIR += rubygem-fog-openstack SUBDIR += rubygem-fog-ovirt SUBDIR += rubygem-fog-powerdns SUBDIR += rubygem-fog-profitbricks SUBDIR += rubygem-fog-rackspace SUBDIR += rubygem-fog-radosgw SUBDIR += rubygem-fog-riakcs SUBDIR += rubygem-fog-sakuracloud SUBDIR += rubygem-fog-serverlove SUBDIR += rubygem-fog-softlayer SUBDIR += rubygem-fog-storm_on_demand SUBDIR += rubygem-fog-terremark SUBDIR += rubygem-fog-vmfusion SUBDIR += rubygem-fog-voxel SUBDIR += rubygem-fog-vsphere SUBDIR += rubygem-fog-xenserver SUBDIR += rubygem-gitaly SUBDIR += rubygem-gitaly-proto SUBDIR += rubygem-gitlab-fog-azure-rm SUBDIR += rubygem-gitlab-kas-grpc SUBDIR += rubygem-gitlab_omniauth-ldap SUBDIR += rubygem-gitlab_omniauth-ldap-gitlab SUBDIR += rubygem-google-cloud-bigquery SUBDIR += rubygem-google-cloud-bigtable SUBDIR += rubygem-google-cloud-bigtable-admin-v2 SUBDIR += rubygem-google-cloud-bigtable-v2 SUBDIR += rubygem-google-cloud-compute-v1 SUBDIR += rubygem-google-cloud-core SUBDIR += rubygem-google-cloud-core-gitlab SUBDIR += rubygem-google-cloud-env SUBDIR += rubygem-google-cloud-env-gitlab SUBDIR += rubygem-google-cloud-errors SUBDIR += rubygem-google-cloud-location SUBDIR += rubygem-google-cloud-location-gitlab SUBDIR += rubygem-google-cloud-logging SUBDIR += rubygem-google-cloud-logging-v2 SUBDIR += rubygem-google-cloud-monitoring SUBDIR += rubygem-google-cloud-monitoring-dashboard-v1 SUBDIR += rubygem-google-cloud-monitoring-metrics_scope-v1 SUBDIR += rubygem-google-cloud-monitoring-v3 SUBDIR += rubygem-google-cloud-pubsub SUBDIR += rubygem-google-cloud-pubsub-v1 SUBDIR += rubygem-google-cloud-resource_manager SUBDIR += rubygem-google-cloud-spanner SUBDIR += rubygem-google-cloud-spanner-admin-database-v1 SUBDIR += rubygem-google-cloud-spanner-admin-instance-v1 SUBDIR += rubygem-google-cloud-spanner-v1 SUBDIR += rubygem-google-cloud-storage SUBDIR += rubygem-google-cloud-storage-gitlab SUBDIR += rubygem-google-cloud-storage_transfer SUBDIR += rubygem-google-cloud-storage_transfer-gitlab SUBDIR += rubygem-google-cloud-storage_transfer-v1 SUBDIR += rubygem-google-cloud-storage_transfer-v1-gitlab SUBDIR += rubygem-google-cloud-storage_transfer12 SUBDIR += rubygem-google-cloud-trace SUBDIR += rubygem-google-cloud-trace-v1 SUBDIR += rubygem-google-cloud-trace-v2 SUBDIR += rubygem-grpc SUBDIR += rubygem-grpc-gitlab SUBDIR += rubygem-grpc-tools SUBDIR += rubygem-grpc_reflection SUBDIR += rubygem-hangouts-chat SUBDIR += rubygem-http-parser SUBDIR += rubygem-http_parser.rb SUBDIR += rubygem-httpauth SUBDIR += rubygem-interfacez SUBDIR += rubygem-ipaddr SUBDIR += rubygem-ipaddress SUBDIR += rubygem-iproto SUBDIR += rubygem-lita-gems SUBDIR += rubygem-macaddr SUBDIR += rubygem-maxmind-db SUBDIR += rubygem-mqtt SUBDIR += rubygem-nats-pure SUBDIR += rubygem-net-ldap SUBDIR += rubygem-net-ldap017 SUBDIR += rubygem-net-netrc SUBDIR += rubygem-net-ntp SUBDIR += rubygem-net-ping SUBDIR += rubygem-net-protocol SUBDIR += rubygem-net-protocol01 SUBDIR += rubygem-netrc SUBDIR += rubygem-network_interface SUBDIR += rubygem-nkf SUBDIR += rubygem-no_proxy_fix SUBDIR += rubygem-oauth SUBDIR += rubygem-oauth-tty SUBDIR += rubygem-oauth0 SUBDIR += rubygem-oauth2 SUBDIR += rubygem-oauth2-gitlab SUBDIR += rubygem-oauth21 SUBDIR += rubygem-octokit SUBDIR += rubygem-octokit-gitlab SUBDIR += rubygem-octokit4 SUBDIR += rubygem-octopress-deploy SUBDIR += rubygem-omniauth-auth0 SUBDIR += rubygem-omniauth-auth0-gitlab SUBDIR += rubygem-omniauth-authentiq SUBDIR += rubygem-omniauth-azure-activedirectory-v2 SUBDIR += rubygem-omniauth-azure-oauth2 SUBDIR += rubygem-omniauth-facebook SUBDIR += rubygem-omniauth-github SUBDIR += rubygem-omniauth-github-discourse SUBDIR += rubygem-omniauth-github-gitlab SUBDIR += rubygem-omniauth-google-oauth2 SUBDIR += rubygem-omniauth-google-oauth2-gitlab SUBDIR += rubygem-omniauth-kerberos SUBDIR += rubygem-omniauth-oauth SUBDIR += rubygem-omniauth-oauth2 SUBDIR += rubygem-omniauth-oauth2-gitlab SUBDIR += rubygem-omniauth-openid SUBDIR += rubygem-omniauth-salesforce SUBDIR += rubygem-omniauth-twitter SUBDIR += rubygem-omniauth-ultraauth SUBDIR += rubygem-omniauth_openid_connect SUBDIR += rubygem-open-uri SUBDIR += rubygem-open-uri-cached SUBDIR += rubygem-openid_connect SUBDIR += rubygem-opennebula SUBDIR += rubygem-orchestrator_client SUBDIR += rubygem-ovirt-engine-sdk SUBDIR += rubygem-packetfu SUBDIR += rubygem-packetgen SUBDIR += rubygem-pcaprub SUBDIR += rubygem-private_address_check SUBDIR += rubygem-proxifier SUBDIR += rubygem-proxifier2 SUBDIR += rubygem-qiniu SUBDIR += rubygem-rabbiter SUBDIR += rubygem-rbvmomi SUBDIR += rubygem-rbvmomi2 SUBDIR += rubygem-right_aws SUBDIR += rubygem-right_flexiscale SUBDIR += rubygem-right_gogrid SUBDIR += rubygem-right_http_connection SUBDIR += rubygem-right_slicehost SUBDIR += rubygem-rsync SUBDIR += rubygem-ruby-growl SUBDIR += rubygem-ruby-openid SUBDIR += rubygem-ruby-yadis SUBDIR += rubygem-ruby_smb SUBDIR += rubygem-rubyntlm SUBDIR += rubygem-rubytter SUBDIR += rubygem-rudy SUBDIR += rubygem-rye SUBDIR += rubygem-serverengine SUBDIR += rubygem-simple_oauth SUBDIR += rubygem-spamcheck SUBDIR += rubygem-stackdriver-core SUBDIR += rubygem-stompserver SUBDIR += rubygem-t SUBDIR += rubygem-train SUBDIR += rubygem-train-core SUBDIR += rubygem-train-rest SUBDIR += rubygem-train-winrm SUBDIR += rubygem-tweetstream SUBDIR += rubygem-twitter SUBDIR += rubygem-twitter-stream SUBDIR += rubygem-twitter4r SUBDIR += rubygem-u2f SUBDIR += rubygem-uri SUBDIR += rubygem-uri-gitlab SUBDIR += rubygem-uri-redis SUBDIR += rubygem-uri_template SUBDIR += rubygem-whois SUBDIR += rubygem-x SUBDIR += rubygem-xmlrpc SUBDIR += rude SUBDIR += rustdesk-server SUBDIR += ryu SUBDIR += s3m SUBDIR += s5cmd SUBDIR += sacc SUBDIR += sakisafecli SUBDIR += samba416 SUBDIR += samba419 SUBDIR += samba420 SUBDIR += samba422 SUBDIR += samba423 SUBDIR += samplicator SUBDIR += savvycan SUBDIR += sbm SUBDIR += scamper SUBDIR += scapy SUBDIR += scr_ipfm SUBDIR += sctplib SUBDIR += sdl2_net SUBDIR += sdl_net SUBDIR += seaweedfs SUBDIR += seda SUBDIR += self-service-password SUBDIR += sems SUBDIR += sendemail SUBDIR += sendme SUBDIR += sendsms SUBDIR += sendsnpp SUBDIR += serveez SUBDIR += serviio SUBDIR += sflowtool SUBDIR += shadowsocks-rust SUBDIR += shelldap SUBDIR += shmux SUBDIR += sie-nmsg SUBDIR += simpleproxy SUBDIR += sing-box SUBDIR += siproxd SUBDIR += sipsak SUBDIR += sl2tps SUBDIR += slackcat SUBDIR += slurm SUBDIR += smb4k SUBDIR += smbldap-tools SUBDIR += smcroute SUBDIR += smm++ SUBDIR += sngrep SUBDIR += sniffit SUBDIR += sniffnet SUBDIR += sniproxy SUBDIR += sntop SUBDIR += socat SUBDIR += sock SUBDIR += socketapi SUBDIR += socketbind SUBDIR += socketpipe SUBDIR += socketw SUBDIR += sofia-sip SUBDIR += speedtest SUBDIR += speedtest-go SUBDIR += spiritvnc SUBDIR += spoofdpi SUBDIR += spoofer SUBDIR += spread SUBDIR += spread-j SUBDIR += sqtop SUBDIR += srelay SUBDIR += ss5 SUBDIR += sshping SUBDIR += ssldump SUBDIR += sslh SUBDIR += ssspl SUBDIR += stc SUBDIR += stone SUBDIR += storj SUBDIR += stund SUBDIR += subnetcalc SUBDIR += suckblow SUBDIR += sup SUBDIR += svnup SUBDIR += syncthing SUBDIR += syncthing1 SUBDIR += tableutil SUBDIR += tac_plus4 SUBDIR += tacacs SUBDIR += tapidbus SUBDIR += tayga SUBDIR += tclsoap SUBDIR += tcludp SUBDIR += tcpcat SUBDIR += tcpdump SUBDIR += tcpflow SUBDIR += tcpick SUBDIR += tcpillust SUBDIR += tcping SUBDIR += tcplog_dumper SUBDIR += tcpmssd SUBDIR += tcpproxy SUBDIR += tcpreen SUBDIR += tcprtt SUBDIR += tcpsg SUBDIR += tcpshow SUBDIR += tcpslice SUBDIR += tcpsplit SUBDIR += tcpstat SUBDIR += tcptestsuite SUBDIR += tcptrace SUBDIR += tcptraceroute SUBDIR += tcpview SUBDIR += tcpwatch SUBDIR += tcpxd SUBDIR += tcpxtract SUBDIR += td-system-tools SUBDIR += tdetect SUBDIR += teddycloud SUBDIR += termshark SUBDIR += tftpgrab SUBDIR += throttled SUBDIR += tigervnc-server SUBDIR += tigervnc-viewer SUBDIR += tigervnc-viewer-java SUBDIR += tightvnc SUBDIR += timed SUBDIR += tintin++ SUBDIR += tiny-network-utilities SUBDIR += tinyfugue SUBDIR += tinyfugue-devel SUBDIR += tinyldap SUBDIR += tn5250 SUBDIR += toonel SUBDIR += torsocks SUBDIR += toxiproxy-cli SUBDIR += toxiproxy-server SUBDIR += traefik SUBDIR += traff SUBDIR += trafshow SUBDIR += trafshow3 SUBDIR += trantor SUBDIR += trickle SUBDIR += trippy SUBDIR += ts-warp SUBDIR += tsclient SUBDIR += tsctp SUBDIR += tsocks SUBDIR += tunneller SUBDIR += turnserver SUBDIR += u6rd SUBDIR += ucarp + SUBDIR += ucx SUBDIR += udp-over-tcp SUBDIR += udpbroadcastrelay SUBDIR += udptunnel SUBDIR += udpxy SUBDIR += udt SUBDIR += uget SUBDIR += uhttpmock SUBDIR += uhttpmock0 SUBDIR += ulxmlrpcpp SUBDIR += unfs3 SUBDIR += unison SUBDIR += unison240 SUBDIR += unison248 SUBDIR += unison251 SUBDIR += unix2tcp SUBDIR += urelay SUBDIR += uriparser SUBDIR += urlendec SUBDIR += usbredir SUBDIR += usockets SUBDIR += utftpd SUBDIR += uvgrtp SUBDIR += v2ray SUBDIR += vde SUBDIR += vde2 SUBDIR += vether-kmod SUBDIR += viamillipede SUBDIR += vinagre SUBDIR += vino SUBDIR += vmware-vsphere-cli SUBDIR += vncreflector SUBDIR += vnstat SUBDIR += vortex SUBDIR += vpp SUBDIR += wackamole SUBDIR += wakeonlan SUBDIR += wangle SUBDIR += waypipe SUBDIR += wayvnc SUBDIR += webalizer-geodb SUBDIR += wgcf SUBDIR += whois SUBDIR += widentd SUBDIR += wifi-firmware-ath10k-kmod SUBDIR += wifi-firmware-ath11k-kmod SUBDIR += wifi-firmware-ath12k-kmod SUBDIR += wifi-firmware-iwlwifi-kmod SUBDIR += wifi-firmware-kmod SUBDIR += wifi-firmware-mt76-kmod SUBDIR += wifi-firmware-mt7601u-kmod SUBDIR += wifi-firmware-rtw88-kmod SUBDIR += wifi-firmware-rtw89-kmod SUBDIR += wifibox SUBDIR += wifibox-alpine SUBDIR += wifibox-core SUBDIR += wireguard-go SUBDIR += wireguard-tools SUBDIR += wireproxy SUBDIR += wireshark SUBDIR += wlan2eth SUBDIR += wlvncc SUBDIR += wmnd SUBDIR += wmnet SUBDIR += wmnetload SUBDIR += wmping SUBDIR += wmwave SUBDIR += wmwifi SUBDIR += wol SUBDIR += wpa_supplicant_gui SUBDIR += wping SUBDIR += wstunnel SUBDIR += wutil SUBDIR += x11vnc SUBDIR += x2goclient SUBDIR += x2goclient-cli SUBDIR += xapsd SUBDIR += xisp SUBDIR += xmlrpc-c SUBDIR += xmlrpc-epi SUBDIR += xprobe SUBDIR += xrdesktop2 SUBDIR += xrdp SUBDIR += xrdp-devel SUBDIR += yami4 SUBDIR += yaph SUBDIR += yate SUBDIR += yaz SUBDIR += yaz++ SUBDIR += yazproxy SUBDIR += yconalyzer SUBDIR += yggdrasil SUBDIR += yptransitd SUBDIR += zapret SUBDIR += zapret2 SUBDIR += zebra-server SUBDIR += zerotier SUBDIR += zmap SUBDIR += zmate SUBDIR += zsync SUBDIR += zyre .include diff --git a/net/ucx/Makefile b/net/ucx/Makefile new file mode 100644 index 000000000000..f7cdf5e1385b --- /dev/null +++ b/net/ucx/Makefile @@ -0,0 +1,66 @@ +PORTNAME= ucx +DISTVERSION= 1.20.0 +CATEGORIES= net +MASTER_SITES= https://github.com/openucx/ucx/releases/download/v${DISTVERSION}/ + +MAINTAINER= rikka.goering@outlook.de +COMMENT= Unified Communication X framework (UCX) +WWW= https://openucx.org/ + +LICENSE= BSD3CLAUSE + +ONLY_FOR_ARCHS= aarch64 amd64 powerpc64le +ONLY_FOR_ARCHS_REASON= uses arch-specific CPU backends; armv7 is not supported upstream and does not build on FreeBSD + +BUILD_DEPENDS= ${LOCALBASE}/share/aclocal/ax_c_float_words_bigendian.m4:devel/autoconf-archive + +USES= autoreconf gmake libtool pkgconfig +USE_LDCONFIG= yes + +GNU_CONFIGURE= yes +CONFIGURE_ARGS= --enable-mt \ + --with-go=no \ + --enable-compiler-opt=0 \ + --disable-doxygen-doc +CONFIGURE_ENV+= GIT=/usr/bin/false + +INSTALL_TARGET= install-strip + +TEST_ENV+= LD_LIBRARY_PATH=${STAGEDIR}${PREFIX}/lib + +CFLAGS+= -Wno-error +CXXFLAGS+= -Wno-error +LDFLAGS+= -lexecinfo + +PORTDOCS= * +PORTEXAMPLES= * + +OPTIONS_DEFINE= DOCS EXAMPLES FUSE IBVERBS IODEMO UMAD PERFTEST +OPTIONS_DEFAULT= IODEMO PERFTEST FUSE +OPTIONS_SUB= yes + +IBVERBS_DESC= Enable InfiniBand/RDMA (verbs) transport +IODEMO_DESC= Install io_demo test application +PERFTEST_DESC= Install ucx_perftest benchmarks +UMAD_DESC= Build/install perftest MAD plugin (umad) + +FUSE_LIB_DEPENDS= libfuse3.so:filesystems/fusefs-libs3 +FUSE_CONFIGURE_ON= --with-fuse3=${LOCALBASE} +FUSE_CONFIGURE_OFF= --with-fuse3=no + +IBVERBS_CONFIGURE_ON= --with-verbs=${LOCALBASE} +IBVERBS_CONFIGURE_OFF= --with-verbs=no + +UMAD_IMPLIES= IBVERBS PERFTEST +UMAD_CONFIGURE_ON= --with-mad=${LOCALBASE} +UMAD_CONFIGURE_OFF= --with-mad=no + +post-install: + ${MV} ${STAGEDIR}${ETCDIR}/ucx.conf ${STAGEDIR}${ETCDIR}/ucx.conf.sample + +do-test: + @${ECHO_MSG} "===> Running UCX smoke tests (ucx_info)" + ${SETENVI} ${TEST_ENV} ${STAGEDIR}${PREFIX}/bin/ucx_info -v >/dev/null + ${SETENVI} ${TEST_ENV} ${STAGEDIR}${PREFIX}/bin/ucx_info -d >/dev/null + +.include diff --git a/net/ucx/distinfo b/net/ucx/distinfo new file mode 100644 index 000000000000..03dfb53b5e8e --- /dev/null +++ b/net/ucx/distinfo @@ -0,0 +1,3 @@ +TIMESTAMP = 1771060207 +SHA256 (ucx-1.20.0.tar.gz) = 7c8a6093cada179aa1d851b83625e3b25ed5658966e309de5118c27a038c7ef9 +SIZE (ucx-1.20.0.tar.gz) = 3500736 diff --git a/net/ucx/files/patch-Makefile.am b/net/ucx/files/patch-Makefile.am new file mode 100644 index 000000000000..8993d3b04bd6 --- /dev/null +++ b/net/ucx/files/patch-Makefile.am @@ -0,0 +1,13 @@ +--- Makefile.am.orig 2026-02-05 12:41:56 UTC ++++ Makefile.am +@@ -59,8 +59,10 @@ SUBDIRS += \ + cmake \ + config + ++if BUILD_GTEST + if HAVE_GTEST + SUBDIRS += test/gtest ++endif + endif + + if HAVE_MPICC diff --git a/net/ucx/files/patch-config_m4_ucm.m4 b/net/ucx/files/patch-config_m4_ucm.m4 new file mode 100644 index 000000000000..7ba238108c02 --- /dev/null +++ b/net/ucx/files/patch-config_m4_ucm.m4 @@ -0,0 +1,33 @@ +--- config/m4/ucm.m4.orig 2026-02-04 09:52:46 UTC ++++ config/m4/ucm.m4 +@@ -15,11 +15,18 @@ AC_ARG_WITH([allocator], + [], + [with_allocator=ptmalloc286]) + ++AC_CHECK_FUNCS([brk sbrk], [], [], [#include ]) ++ ++HAVE_UCM_PTMALLOC286=no ++ + case ${with_allocator} in + ptmalloc286) + AC_MSG_NOTICE(Memory allocator is ptmalloc-2.8.6 version) +- AC_DEFINE([HAVE_UCM_PTMALLOC286], 1, [Use ptmalloc-2.8.6 version]) +- HAVE_UCM_PTMALLOC286=yes ++ AS_IF([test "x$ac_cv_func_brk" = "xyes" && test "x$ac_cv_func_sbrk" = "xyes"], ++ [AC_DEFINE([HAVE_UCM_PTMALLOC286], 1, [Use ptmalloc-2.8.6 version]) ++ HAVE_UCM_PTMALLOC286=yes], ++ [AC_MSG_WARN([brk()/sbrk() not available; disabling ptmalloc286 allocator]) ++ HAVE_UCM_PTMALLOC286=no]) + ;; + *) + AC_MSG_ERROR(Cannot continue. Unsupported memory allocator name +@@ -83,6 +90,9 @@ AS_IF([test "x$mmap_hooks_happy" = "xyes"], + AS_IF([test "x$mmap_hooks_happy" = "xyes"], + AS_IF([test "x$ipc_hooks_happy" = "xyes" -o "x$shm_hooks_happy" = "xyes"], + [bistro_hooks_happy=yes])) ++ ++AS_IF([test "x$ac_cv_func_brk" != "xyes" -o "x$ac_cv_func_sbrk" != "xyes"], ++ [bistro_hooks_happy=no]) + + AS_IF([test "x$bistro_hooks_happy" = "xyes"], + [AC_DEFINE([UCM_BISTRO_HOOKS], [1], [Enable BISTRO hooks])], diff --git a/net/ucx/files/patch-configure.ac b/net/ucx/files/patch-configure.ac new file mode 100644 index 000000000000..59c76d368312 --- /dev/null +++ b/net/ucx/files/patch-configure.ac @@ -0,0 +1,108 @@ +--- configure.ac.orig 2026-02-05 12:41:56 UTC ++++ configure.ac +@@ -14,8 +14,6 @@ define([ucx_ver_extra], ) # Extra version string. Em + define([ucx_ver_patch], 0) # Patch version. Increased for a bugfix release. + define([ucx_ver_extra], ) # Extra version string. Empty for a general release. + +-define([ts], esyscmd([sh -c "date +%Y%m%d%H%M%S"])) +- + # This is the API version (see libtool library versioning) + # http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html + # current:rev:age +@@ -31,14 +29,20 @@ AC_CONFIG_HEADERS([config.h]) + AC_USE_SYSTEM_EXTENSIONS + AC_CONFIG_HEADERS([config.h]) + +-AC_CHECK_PROG(GITBIN, git, yes) +-AS_IF([test x"${GITBIN}" = x"yes"], +- [# remove preceding "refs/heads/" (11 characters) for symbolic ref +- AC_SUBST(SCM_BRANCH, esyscmd([sh -c 'git symbolic-ref --quiet HEAD | sed "s/^.\{11\}//"'])) +- AC_SUBST(SCM_VERSION, esyscmd([sh -c 'git rev-parse --short=7 HEAD']))], +- [AC_SUBST(SCM_BRANCH, "") +- AC_SUBST(SCM_VERSION, "0000000")]) ++AC_PATH_PROG([GIT], [git], [:]) + ++SCM_BRANCH="" ++SCM_VERSION="0000000" ++ ++AS_IF([test -d "${srcdir}/.git" && test "x$GIT" != "x:" && \ ++ $GIT -C "${srcdir}" rev-parse --is-inside-work-tree >/dev/null 2>&1], [ ++ SCM_BRANCH=`$GIT -C "${srcdir}" symbolic-ref --quiet HEAD 2>/dev/null | sed 's,^refs/heads/,,'` ++ SCM_VERSION=`$GIT -C "${srcdir}" rev-parse --short=7 HEAD 2>/dev/null` ++]) ++ ++AC_SUBST([SCM_BRANCH]) ++AC_SUBST([SCM_VERSION]) ++ + AH_TOP([ + #ifndef UCX_CONFIG_H + #define UCX_CONFIG_H +@@ -85,9 +89,44 @@ AC_FUNC_STRERROR_R + AC_C_RESTRICT + AC_FUNC_STRERROR_R + +-AC_PATH_TOOL([PKG_CONFIG], [pkg-config], [pkg-config]) ++PKG_PROG_PKG_CONFIG + ++dnl Float word order can differ from integer endianness on some ABIs. ++ dnl Prefer Autoconf's macro if available; otherwise fall back to autoconf-archive. ++ m4_ifdef([AC_C_FLOAT_WORDS_BIGENDIAN], ++ [AC_C_FLOAT_WORDS_BIGENDIAN], ++ [m4_ifdef([AX_C_FLOAT_WORDS_BIGENDIAN], ++ [AX_C_FLOAT_WORDS_BIGENDIAN], ++ [AC_MSG_ERROR([need AC_C_FLOAT_WORDS_BIGENDIAN or AX_C_FLOAT_WORDS_BIGENDIAN])])]) + ++AC_CHECK_HEADERS([sys/eventfd.h sys/timerfd.h]) ++AC_CHECK_HEADERS([netinet/in.h arpa/inet.h]) ++ ++AC_CHECK_FUNCS([brk sbrk]) ++ ++AS_IF([test "x$ac_cv_func_brk" = "xyes" && test "x$ac_cv_func_sbrk" = "xyes"], ++ [have_brk_sbrk=yes], ++ [have_brk_sbrk=no]) ++ ++have_ucm_malloc_hooks=no ++case "$host_os" in ++ linux*) have_ucm_malloc_hooks=yes ;; ++ *) have_ucm_malloc_hooks=no ;; ++esac ++AM_CONDITIONAL([HAVE_UCM_MALLOC_HOOKS], [test "x$have_ucm_malloc_hooks" = xyes]) ++ ++AM_CONDITIONAL([HAVE_BRK_SBRK], [test "x$have_brk_sbrk" = "xyes"]) ++AS_IF([test "x$have_brk_sbrk" = "xyes"], ++ [AC_DEFINE([HAVE_BRK_SBRK], [1], ++ [Define if both brk() and sbrk() are available])], ++ []) ++ ++case "$host_os" in ++ freebsd*) build_gtest=no ;; ++ *) build_gtest=yes ;; ++esac ++AM_CONDITIONAL([BUILD_GTEST], [test "x$build_gtest" = xyes]) ++ + # + # Define SHARED_LIB preprocessor macro when building a shared library + # +@@ -255,6 +294,22 @@ AS_IF([test "x$with_docs_only" = xyes], + m4_include([test/apps/iodemo/configure.m4]) + m4_include([test/apps/uct_info/configure.m4]) + ++AS_IF([test "x$with_docs_only" != xyes && test "x$build_gtest" = xyes], [ ++ PKG_CHECK_MODULES([GTEST], [gtest_main], ++ [have_gtest=yes], ++ [have_gtest=no]) ++], [ ++ have_gtest=no ++]) ++ ++AM_CONDITIONAL([HAVE_GTEST], [test "x$have_gtest" = "xyes"]) ++ ++GTEST_CPPFLAGS="${GTEST_CFLAGS}" ++GTEST_CXXFLAGS="${GTEST_CFLAGS}" ++GTEST_LDFLAGS="" ++AC_SUBST([GTEST_CPPFLAGS]) ++AC_SUBST([GTEST_CXXFLAGS]) ++AC_SUBST([GTEST_LDFLAGS]) + + # + # Disable checking user parameters diff --git a/net/ucx/files/patch-src_tools_info_Makefile.am b/net/ucx/files/patch-src_tools_info_Makefile.am new file mode 100644 index 000000000000..bb0ea71e540e --- /dev/null +++ b/net/ucx/files/patch-src_tools_info_Makefile.am @@ -0,0 +1,15 @@ +--- src/tools/info/Makefile.am.orig 2026-02-04 09:52:46 UTC ++++ src/tools/info/Makefile.am +@@ -14,7 +14,11 @@ build_config.h: $(top_builddir)/config.h Makefile + # Produce a C header file which contains all defined variables from config.h + # + build_config.h: $(top_builddir)/config.h Makefile +- $(SED) -nr 's:\s*#define\s+(\w+)(\s+(\w+)|\s+(".*")|\s*)$$:{"\1", UCS_PP_MAKE_STRING(\3\4)},:p' <$(top_builddir)/config.h >$@ ++ $(SED) -nE \ ++ -e 's/^[[:space:]]*#define[[:space:]]+([A-Za-z_][A-Za-z_0-9]*)[[:space:]]+(".*")$$/{"\1", UCS_PP_MAKE_STRING(\2)},/p' \ ++ -e 's/^[[:space:]]*#define[[:space:]]+([A-Za-z_][A-Za-z0-9_]*)[[:space:]]+([^[:space:]]+)$$/{"\1", UCS_PP_MAKE_STRING(\2)},/p' \ ++ -e 's/^[[:space:]]*#define[[:space:]]+([A-Za-z_][A-Za-z0-9_]*)$$/{"\1", ""},/p' \ ++ <$(top_builddir)/config.h >$@ + + ucx_info_CPPFLAGS = $(BASE_CPPFLAGS) + ucx_info_CFLAGS = $(BASE_CFLAGS) diff --git a/net/ucx/files/patch-src_tools_perf_mad_perftest__mad.c b/net/ucx/files/patch-src_tools_perf_mad_perftest__mad.c new file mode 100644 index 000000000000..4eddbc3e8082 --- /dev/null +++ b/net/ucx/files/patch-src_tools_perf_mad_perftest__mad.c @@ -0,0 +1,16 @@ +--- src/tools/perf/mad/perftest_mad.c.orig 2026-02-04 09:52:46 UTC ++++ src/tools/perf/mad/perftest_mad.c +@@ -20,7 +20,13 @@ + #include + #include + #include ++#if defined(__linux__) + #include /* __be64 */ ++#else ++#include ++#include /* be64toh */ ++typedef uint64_t __be64; ++#endif + + #include + #include diff --git a/net/ucx/files/patch-src_ucm_Makefile.am b/net/ucx/files/patch-src_ucm_Makefile.am new file mode 100644 index 000000000000..49b81a7ad4b8 --- /dev/null +++ b/net/ucx/files/patch-src_ucm_Makefile.am @@ -0,0 +1,50 @@ +--- src/ucm/Makefile.am.orig 2026-02-04 09:52:46 UTC ++++ src/ucm/Makefile.am +@@ -21,8 +21,6 @@ noinst_HEADERS = \ + + noinst_HEADERS = \ + event/event.h \ +- malloc/malloc_hook.h \ +- malloc/allocator.h \ + mmap/mmap.h \ + util/khash_safe.h \ + util/replace.h \ +@@ -38,7 +36,6 @@ libucm_la_SOURCES = \ + + libucm_la_SOURCES = \ + event/event.c \ +- malloc/malloc_hook.c \ + mmap/install.c \ + util/replace.c \ + util/log.c \ +@@ -50,6 +47,17 @@ libucm_la_SOURCES = \ + bistro/bistro_ppc64.c \ + bistro/bistro_rv64.c + ++if HAVE_UCM_MALLOC_HOOKS ++noinst_HEADERS += \ ++ malloc/malloc_hook.h \ ++ malloc/allocator.h ++ ++libucm_la_SOURCES += \ ++ malloc/malloc_hook.c ++else ++libucm_la_SOURCES += \ ++ malloc/malloc_hook_stub.c ++ + if HAVE_UCM_PTMALLOC286 + libucm_la_CPPFLAGS += \ + -fno-strict-aliasing \ +@@ -61,5 +69,12 @@ noinst_HEADERS += \ + + noinst_HEADERS += \ + ptmalloc286/malloc-2.8.6.h ++endif ++endif ++ ++if HAVE_BRK_SBRK ++else ++libucm_la_SOURCES += \ ++ malloc/brk_sbrk_override_stub.c + endif + diff --git a/net/ucx/files/patch-src_ucm_event_event.c b/net/ucx/files/patch-src_ucm_event_event.c new file mode 100644 index 000000000000..11a0577447e6 --- /dev/null +++ b/net/ucx/files/patch-src_ucm_event_event.c @@ -0,0 +1,18 @@ +--- src/ucm/event/event.c.orig 2026-02-04 09:52:46 UTC ++++ src/ucm/event/event.c +@@ -36,6 +36,15 @@ KHASH_INIT(ucm_ptr_size, const void*, size_t, 1, ucm_p + #define ucm_ptr_hash(_ptr) kh_int64_hash_func((uintptr_t)(_ptr)) + KHASH_INIT(ucm_ptr_size, const void*, size_t, 1, ucm_ptr_hash, kh_int64_hash_equal) + ++#if defined(__FreeBSD__) ++#ifndef MREMAP_FIXED ++#define MREMAP_FIXED 0 ++#endif ++#ifndef MREMAP_MAYMOVE ++#define MREMAP_MAYMOVE 0 ++#endif ++#endif ++ + static pthread_rwlock_t ucm_event_lock = PTHREAD_RWLOCK_INITIALIZER; + static ucs_init_once_t ucm_library_init_once = UCS_INIT_ONCE_INITIALIZER; + static ucs_list_link_t ucm_event_handlers; diff --git a/net/ucx/files/patch-src_ucm_malloc_brk__sbrk__override__stub.c b/net/ucx/files/patch-src_ucm_malloc_brk__sbrk__override__stub.c new file mode 100644 index 000000000000..7b8bcaa7accf --- /dev/null +++ b/net/ucx/files/patch-src_ucm_malloc_brk__sbrk__override__stub.c @@ -0,0 +1,28 @@ +--- src/ucm/malloc/brk_sbrk_override_stub.c.orig 2026-02-20 03:25:07 UTC ++++ src/ucm/malloc/brk_sbrk_override_stub.c +@@ -0,0 +1,25 @@ ++#include ++#include ++#include ++ ++/* ++ * Stubs for platforms/builds where we don't implement brk/sbrk overriding. ++ * Fail gracefully so callers can fall back or treat as unsupported. ++ * ++ * Marked weak so a real implementation (if later added) can override it. ++ */ ++__attribute__((weak)) ++int ucm_override_brk(void *addr) ++{ ++ (void)addr; ++ errno = ENOSYS; ++ return -1; ++} ++ ++__attribute__((weak)) ++void *ucm_override_sbrk(intptr_t increment) ++{ ++ (void)increment; ++ errno = ENOSYS; ++ return (void*)-1; ++} diff --git a/net/ucx/files/patch-src_ucm_malloc_malloc__hook.c b/net/ucx/files/patch-src_ucm_malloc_malloc__hook.c new file mode 100644 index 000000000000..197db69bab41 --- /dev/null +++ b/net/ucx/files/patch-src_ucm_malloc_malloc__hook.c @@ -0,0 +1,35 @@ +--- src/ucm/malloc/malloc_hook.c.orig 2026-02-04 09:52:46 UTC ++++ src/ucm/malloc/malloc_hook.c +@@ -35,6 +35,12 @@ + #include + #include + ++#if defined(__FreeBSD__) ++#include ++#include ++#include ++#include ++#endif + + #include + +@@ -45,7 +51,6 @@ + #define UCM_MALLOC_INSTALLED_OPT_SYMS UCS_BIT(2) /* Installed optional symbols */ + #define UCM_MALLOC_INSTALLED_MALL_SYMS UCS_BIT(3) /* Installed malloc symbols */ + +- + /* Mangled symbols of C++ allocators */ + #define UCM_OPERATOR_NEW_SYMBOL "_Znwm" + #define UCM_OPERATOR_DELETE_SYMBOL "_ZdlPv" +@@ -659,7 +664,11 @@ static void ucm_malloc_populate_glibc_cache() + + static void ucm_malloc_populate_glibc_cache() + { ++#if defined(__FreeBSD__) ++ static char hostname[UCS_HOST_NAME_MAX] = {0}; ++#else + char hostname[HOST_NAME_MAX]; ++#endif + + /* Trigger NSS initialization before we install malloc hooks. + * This is needed because NSS could allocate strings with our malloc(), but diff --git a/net/ucx/files/patch-src_ucm_malloc_malloc__hook__stub.c b/net/ucx/files/patch-src_ucm_malloc_malloc__hook__stub.c new file mode 100644 index 000000000000..3663f323d060 --- /dev/null +++ b/net/ucx/files/patch-src_ucm_malloc_malloc__hook__stub.c @@ -0,0 +1,58 @@ +--- src/ucm/malloc/malloc_hook_stub.c.orig 2026-02-20 02:50:52 UTC ++++ src/ucm/malloc/malloc_hook_stub.c +@@ -0,0 +1,55 @@ ++/* ++ * FreeBSD / non-glibc stub for UCX malloc hook support. ++ * ++ * This file provides the public API declared in malloc_hook.h, but does not ++ * attempt to install malloc hooks, relocate symbols, or tweak mallopt-style ++ * thresholds. Those mechanisms are glibc/ptmalloc-centric. ++ * ++ * The goal for now: link cleanly, behave safely, and fail gracefully when ++ * malloc hooking is actually required. ++ */ ++ ++#ifdef HAVE_CONFIG_H ++# include "config.h" ++#endif ++ ++#include "malloc_hook.h" ++ ++#include ++#include ++ ++ucs_status_t ucm_malloc_install(int events) ++{ ++ static int warned = 0; ++ ++ /* We don't implement malloc hook installation on this platform (yet). */ ++ if (!warned) { ++ ucm_debug("ucm_malloc_install(events=0x%x): stub (malloc hooks not supported on this build)", ++ events); ++ warned = 1; ++ } ++ ++ /* ++ * Conservative choice: ++ * - Return UNSUPPORTED so callers that *need* these hooks can fall back ++ * or disable the feature. ++ * ++ * If you find a call site that expects OK unconditionally, we can make this ++ * conditional (e.g., return OK when events==0), but UNSUPPORTED is the honest ++ * default. ++ */ ++ return (events == 0) ? UCS_OK : UCS_ERR_UNSUPPORTED; ++} ++ ++void ucm_init_malloc_hook(void) ++{ ++ /* No-op for stub. */ ++} ++ ++void ucm_malloc_state_reset(int default_mmap_thresh, int default_trim_thresh) ++{ ++ (void)default_mmap_thresh; ++ (void)default_trim_thresh; ++ ++ /* No-op for stub (no mallopt-style tuning here). */ ++} diff --git a/net/ucx/files/patch-src_ucm_mmap_install.c b/net/ucx/files/patch-src_ucm_mmap_install.c new file mode 100644 index 000000000000..33a4ea90b28f --- /dev/null +++ b/net/ucx/files/patch-src_ucm_mmap_install.c @@ -0,0 +1,55 @@ +--- src/ucm/mmap/install.c.orig 2026-02-04 09:52:46 UTC ++++ src/ucm/mmap/install.c +@@ -86,8 +86,10 @@ static ucm_mmap_func_t ucm_mmap_funcs[] = { + #endif + { UCM_MMAP_RELOC_ENTRY(shmat), UCM_EVENT_SHMAT, UCM_EVENT_NONE}, + { UCM_MMAP_RELOC_ENTRY(shmdt), UCM_EVENT_SHMDT, UCM_EVENT_SHMAT}, ++#ifdef HAVE_BRK_SBRK + { UCM_MMAP_RELOC_ENTRY(sbrk), UCM_EVENT_SBRK, UCM_EVENT_NONE}, + { UCM_MMAP_RELOC_ENTRY(brk), UCM_EVENT_BRK, UCM_EVENT_NONE}, ++#endif + { UCM_MMAP_RELOC_ENTRY(madvise), UCM_EVENT_MADVISE, UCM_EVENT_NONE}, + { {NULL, NULL, NULL}, UCM_EVENT_NONE} + }; +@@ -135,6 +137,7 @@ static void ucm_mmap_event_test_callback(ucm_event_typ + } + } + ++#ifdef HAVE_BRK_SBRK + /* Call brk() and check return value, to avoid compile error of unused result */ + static void ucm_brk_checked(void *addr) + { +@@ -143,6 +146,7 @@ static void ucm_brk_checked(void *addr) + ucm_diag("brk(addr=%p) failed: %m", addr); + } + } ++#endif + + /* Fire events with pre/post action. The problem is in call sequence: we + * can't just fire single event - most of the system calls require set of +@@ -199,6 +203,7 @@ ucm_fire_mmap_events_internal(int events, ucm_mmap_tes + } + + if (exclusive && !RUNNING_ON_VALGRIND) { ++#ifdef HAVE_BRK_SBRK + sbrk_size = ucm_get_page_size(); + if (events & (UCM_EVENT_BRK|UCM_EVENT_VM_MAPPED|UCM_EVENT_VM_UNMAPPED)) { + p = ucm_get_current_brk(); +@@ -213,14 +218,17 @@ ucm_fire_mmap_events_internal(int events, ucm_mmap_tes + UCM_FIRE_EVENT(events, UCM_EVENT_SBRK|UCM_EVENT_VM_UNMAPPED, + data, (void)sbrk(-sbrk_size)); + } ++#endif + } else { + /* To avoid side effects on other threads and valgrind heap corruption, + * pass invalid parameters. We assume that if the natives events are + * delivered, it means VM_MAPPED/UNMAPPED would be delivered as well. + */ ++#ifdef HAVE_BRK_SBRK + if (events & UCM_EVENT_BRK) { + UCM_FIRE_EVENT(events, UCM_EVENT_BRK, data, ucm_brk_checked(NULL)); + } ++#endif + } + + if (events & (UCM_EVENT_MADVISE|UCM_EVENT_VM_UNMAPPED)) { diff --git a/net/ucx/files/patch-src_ucm_util_log.c b/net/ucx/files/patch-src_ucm_util_log.c new file mode 100644 index 000000000000..26c2a7d8044d --- /dev/null +++ b/net/ucx/files/patch-src_ucm_util_log.c @@ -0,0 +1,40 @@ +--- src/ucm/util/log.c.orig 2026-02-04 09:52:46 UTC ++++ src/ucm/util/log.c +@@ -13,6 +13,7 @@ + + #include + #include ++#include + #include + #include + #include +@@ -23,12 +24,21 @@ + #include + #include + #include ++#if defined(__FreeBSD__) ++#include ++#include ++#else + #include ++#endif + + #define UCM_LOG_BUF_SIZE 512 + + static int ucm_log_fileno = 1; /* stdout */ ++#if defined(__FreeBSD__) ++static char ucm_log_hostname[UCS_HOST_NAME_MAX] = {0}; ++#else + static char ucm_log_hostname[HOST_NAME_MAX] = {0}; ++#endif + + const char *ucm_log_level_names[] = { + [UCS_LOG_LEVEL_FATAL] = "FATAL", +@@ -47,7 +57,6 @@ const char *ucm_log_level_names[] = { + #define UCM_LOG_LTOA_FLAG_LONG UCS_BIT(2) /* long number */ + #define UCM_LOG_LTOA_FLAG_PAD0 UCS_BIT(3) /* pad with zeroes */ + #define UCM_LOG_LTOA_PAD_LEFT UCS_BIT(4) /* pad to left */ +- + + static char *ucm_log_add_padding(char *p, char *end, int pad, char fill) + { diff --git a/net/ucx/files/patch-src_ucm_util_reloc.c b/net/ucx/files/patch-src_ucm_util_reloc.c new file mode 100644 index 000000000000..436cc4bd600e --- /dev/null +++ b/net/ucx/files/patch-src_ucm_util_reloc.c @@ -0,0 +1,18 @@ +--- src/ucm/util/reloc.c.orig 2026-02-04 09:52:46 UTC ++++ src/ucm/util/reloc.c +@@ -673,10 +673,13 @@ static int ucm_dlclose(void *handle) + * cached information anyway, and it may be re-added on the next call to + * ucm_reloc_apply_patch(). + */ +- dl_name = ucm_reloc_get_dl_name(lm_entry->l_name, lm_entry->l_addr, ++ ElfW(Addr) dlpi_addr; ++ dlpi_addr = (ElfW(Addr))(uintptr_t)lm_entry->l_addr; ++ ++ dl_name = ucm_reloc_get_dl_name(lm_entry->l_name, dlpi_addr, + dl_name_buffer, sizeof(dl_name_buffer)); + pthread_mutex_lock(&ucm_reloc_patch_list_lock); +- ucm_reloc_dl_info_cleanup(lm_entry->l_addr, dl_name); ++ ucm_reloc_dl_info_cleanup(dlpi_addr, dl_name); + pthread_mutex_unlock(&ucm_reloc_patch_list_lock); + } + diff --git a/net/ucx/files/patch-src_ucm_util_replace.c b/net/ucx/files/patch-src_ucm_util_replace.c new file mode 100644 index 000000000000..c14023c8fe4b --- /dev/null +++ b/net/ucx/files/patch-src_ucm_util_replace.c @@ -0,0 +1,68 @@ +--- src/ucm/util/replace.c.orig 2026-02-04 09:52:46 UTC ++++ src/ucm/util/replace.c +@@ -55,8 +55,10 @@ UCM_DEFINE_REPLACE_FUNC(shmdt, int, -1, co + #endif + UCM_DEFINE_REPLACE_FUNC(shmat, void*, MAP_FAILED, int, const void*, int) + UCM_DEFINE_REPLACE_FUNC(shmdt, int, -1, const void*) ++#ifdef HAVE_BRK_SBRK + UCM_DEFINE_REPLACE_FUNC(sbrk, void*, MAP_FAILED, intptr_t) + UCM_DEFINE_REPLACE_FUNC(brk, int, -1, void*) ++#endif + UCM_DEFINE_REPLACE_FUNC(madvise, int, -1, void*, size_t, int) + + UCM_DEFINE_SELECT_FUNC(mmap, void*, SYS_mmap, void*, size_t, int, int, int, +@@ -122,6 +124,7 @@ int ucm_orig_shmdt(const void *shmaddr) + + #endif + ++#ifdef HAVE_BRK_SBRK + _UCM_DEFINE_DLSYM_FUNC(brk, ucm_orig_dlsym_brk, ucm_override_brk, int, void*) + + int ucm_orig_brk(void *addr) +@@ -156,7 +159,32 @@ void *ucm_orig_sbrk(intptr_t increment) + (void*)-1 : prev; + } + } ++#else ++int ucm_orig_brk(void *addr) ++{ ++ (void)addr; ++ errno = ENOSYS; ++ return -1; ++} + ++void *ucm_orig_sbrk(intptr_t increment) ++{ ++ (void)increment; ++ errno = ENOSYS; ++ return MAP_FAILED; ++} ++ ++int ucm_override_brk(void *addr) ++{ ++ return ucm_orig_brk(addr); ++} ++ ++void *ucm_override_sbrk(intptr_t increment) ++{ ++ return ucm_orig_sbrk(increment); ++} ++#endif ++ + #else /* UCM_BISTRO_HOOKS */ + + UCM_DEFINE_DLSYM_FUNC(brk, int, void*) +@@ -168,9 +196,13 @@ void *ucm_get_current_brk() + + void *ucm_get_current_brk() + { ++#ifdef HAVE_BRK_SBRK + #if HAVE___CURBRK + return __curbrk; + #else + return ucm_brk_syscall(0); ++#endif ++#else ++ return NULL; + #endif + } diff --git a/net/ucx/files/patch-src_ucm_util_sys.c b/net/ucx/files/patch-src_ucm_util_sys.c new file mode 100644 index 000000000000..8982c6fd9cda --- /dev/null +++ b/net/ucx/files/patch-src_ucm_util_sys.c @@ -0,0 +1,103 @@ +--- src/ucm/util/sys.c.orig 2026-02-04 09:52:46 UTC ++++ src/ucm/util/sys.c +@@ -21,10 +21,17 @@ + #include + #include + #include ++#ifdef HAVE_LINUX_MMAN_H + #include ++#endif + #include + #include ++#ifdef __linux__ + #include ++#elif defined(__FreeBSD__) ++#include ++#include ++#endif + #include + #include + #include +@@ -34,6 +41,24 @@ + + #define UCM_PROC_SELF_MAPS "/proc/self/maps" + ++#if !defined(__linux__) ++#include ++#include ++ ++void *ucm_orig_mremap(void *old_address, size_t old_size, size_t new_size, ++ int flags, void *new_address) ++{ ++ (void)old_address; ++ (void)old_size; ++ (void)new_size; ++ (void)flags; ++ (void)new_address; ++ ++ errno = ENOSYS; ++ return MAP_FAILED; ++} ++#endif ++ + ucm_global_config_t ucm_global_opts = { + .log_level = UCS_LOG_LEVEL_WARN, + .enable_events = 1, +@@ -136,7 +161,22 @@ void *ucm_sys_realloc(void *ptr, size_t size) + return ptr; + } + ++#if defined(__linux__) + newptr = ucm_orig_mremap(oldptr, oldsize, sys_size, MREMAP_MAYMOVE, NULL); ++#else ++ /* FreeBSD: no Linux mremap/MREMAP_MAYMOVE. Fallback: allocate+copy+unmap. ++ * If upper layers can tolerate "not supported", you can instead: ++ * errno = ENOTSUP; return MAP_FAILED; ++ */ ++ newptr = mmap(NULL, sys_size, PROT_READ | PROT_WRITE, ++ MAP_PRIVATE | MAP_ANON, -1, 0); ++ if (newptr != MAP_FAILED) { ++ size_t copy_sz = (oldsize < sys_size) ? oldsize : sys_size; ++ memcpy(newptr, oldptr, copy_sz); ++ munmap(oldptr, oldsize); ++ } ++#endif ++ + if (newptr == MAP_FAILED) { + ucm_error("mremap(oldptr=%p oldsize=%zu, newsize=%zu) failed: %m", + oldptr, oldsize, sys_size); +@@ -377,15 +417,31 @@ void *ucm_brk_syscall(void *addr) + + void *ucm_brk_syscall(void *addr) + { ++#if defined(__linux__) + /* Return type is equivalent to full pointer size */ + UCS_STATIC_ASSERT(sizeof(syscall(0)) == sizeof(void*)); +- + return (void*)syscall(SYS_brk, addr); ++#else ++ (void)addr; ++ errno = ENOSYS; ++ return NULL; ++#endif + } + +-pid_t ucm_get_tid() ++pid_t ucm_get_tid(void) + { +- return syscall(SYS_gettid); ++#if defined(__linux__) ++ return (pid_t)syscall(SYS_gettid); ++#elif defined(__FreeBSD__) ++ long tid; ++ if (thr_self(&tid) == 0) { ++ return (pid_t)tid; ++ } ++ /* fallback */ ++ return (pid_t)getpid(); ++#else ++ return (pid_t)getpid(); ++#endif + } + + void UCS_F_CTOR ucm_init() diff --git a/net/ucx/files/patch-src_ucm_util_sys.h b/net/ucx/files/patch-src_ucm_util_sys.h new file mode 100644 index 000000000000..9cdbf800eda0 --- /dev/null +++ b/net/ucx/files/patch-src_ucm_util_sys.h @@ -0,0 +1,11 @@ +--- src/ucm/util/sys.h.orig 2026-02-04 09:52:46 UTC ++++ src/ucm/util/sys.h +@@ -108,7 +108,7 @@ void *ucm_brk_syscall(void *addr); + /** + * @return System thread id of the current thread. + */ +-pid_t ucm_get_tid(); ++pid_t ucm_get_tid(void); + + + /** diff --git a/net/ucx/files/patch-src_ucp_core_ucp__worker.c b/net/ucx/files/patch-src_ucp_core_ucp__worker.c new file mode 100644 index 000000000000..dbb3d655732e --- /dev/null +++ b/net/ucx/files/patch-src_ucp_core_ucp__worker.c @@ -0,0 +1,127 @@ +--- src/ucp/core/ucp_worker.c.orig 2026-02-05 12:41:56 UTC ++++ src/ucp/core/ucp_worker.c +@@ -9,6 +9,8 @@ + # include "config.h" + #endif + ++#include ++ + #include "ucp_am.h" + #include "ucp_ep_vfs.h" + #include "ucp_worker.h" +@@ -35,9 +37,15 @@ + #include + #include + #include +-#include +-#include +-#include ++#if defined(HAVE_SYS_EVENTFD_H) ++# include ++#endif ++#if defined(HAVE_SYS_TIMERFD_H) ++# include ++#endif ++#if defined(__linux__) ++# include ++#endif + #include + + +@@ -320,6 +328,7 @@ static ucs_status_t ucp_worker_wakeup_init(ucp_worker_ + worker->flags |= UCP_WORKER_FLAG_EDGE_TRIGGERED; + } + ++#if defined(HAVE_SYS_EVENTFD_H) + worker->eventfd = eventfd(0, EFD_CLOEXEC | EFD_NONBLOCK); + if (worker->eventfd == -1) { + ucs_error("Failed to create event fd: %m"); +@@ -328,6 +337,10 @@ static ucs_status_t ucp_worker_wakeup_init(ucp_worker_ + } + + ucp_worker_wakeup_ctl_fd(worker, UCP_WORKER_EPFD_OP_ADD, worker->eventfd); ++#else ++ /* No eventfd(). */ ++ worker->eventfd = -1; ++#endif + + worker->uct_events = 0; + +@@ -427,6 +440,10 @@ static ucs_status_t ucp_worker_wakeup_signal_fd(ucp_wo + + ucs_trace_func("worker=%p fd=%d", worker, worker->eventfd); + ++ if (worker->eventfd == -1) { ++ return UCS_OK; ++ } ++ + do { + ret = write(worker->eventfd, &dummy, sizeof(dummy)); + if (ret == sizeof(dummy)) { +@@ -3375,7 +3392,7 @@ void ucp_worker_print_info(ucp_worker_h worker, FILE * + UCP_WORKER_THREAD_CS_EXIT_CONDITIONAL(worker); + } + +-static UCS_F_ALWAYS_INLINE void ++static UCS_F_ALWAYS_INLINE ucs_status_t + ucp_worker_keepalive_timerfd_init(ucp_worker_h worker) + { + ucs_time_t ka_interval = worker->context->config.ext.keepalive_interval; +@@ -3385,14 +3402,18 @@ ucp_worker_keepalive_timerfd_init(ucp_worker_h worker) + + if (!(worker->context->config.features & UCP_FEATURE_WAKEUP) || + (worker->keepalive.timerfd >= 0)) { +- return; ++ return UCS_OK; + } + ++/* timerfd_* are Linux-only */ ++#if !defined(HAVE_SYS_TIMERFD_H) ++ worker->keepalive.timerfd = -1; ++ return UCS_OK; ++#else + worker->keepalive.timerfd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK); + if (worker->keepalive.timerfd < 0) { +- ucs_warn("worker %p: failed to create keepalive timer fd: %m", +- worker); +- return; ++ ucs_error("timerfd_create() failed: %m"); ++ return UCS_ERR_IO_ERROR; + } + + ucs_assert(ka_interval > 0); +@@ -3412,10 +3433,11 @@ ucp_worker_keepalive_timerfd_init(ucp_worker_h worker) + ucp_worker_wakeup_ctl_fd(worker, UCP_WORKER_EPFD_OP_ADD, + worker->keepalive.timerfd); + +- return; ++ return UCS_OK; + + err_close_timerfd: + close(worker->keepalive.timerfd); ++#endif + } + + static UCS_F_ALWAYS_INLINE void +@@ -3571,6 +3593,7 @@ void ucp_worker_keepalive_add_ep(ucp_ep_h ep) + void ucp_worker_keepalive_add_ep(ucp_ep_h ep) + { + ucp_worker_h worker = ep->worker; ++ ucs_status_t status; + + if (ucp_ep_config(ep)->key.keepalive_lane == UCP_NULL_LANE) { + ucs_trace("ep %p flags 0x%x cfg_index %d err_mode %d: keepalive lane" +@@ -3579,7 +3602,12 @@ void ucp_worker_keepalive_add_ep(ucp_ep_h ep) + return; + } + +- ucp_worker_keepalive_timerfd_init(worker); ++ status = ucp_worker_keepalive_timerfd_init(worker); ++ if ((status != UCS_OK) && (status != UCS_ERR_UNSUPPORTED)) { ++ ucs_warn("worker %p: failed to initialize keepalive timerfd: %s", ++ worker, ucs_status_string(status)); ++ } ++ + ucs_trace("ep %p flags 0x%x: set keepalive lane to %u", ep, + ep->flags, ucp_ep_config(ep)->key.keepalive_lane); + uct_worker_progress_register_safe(worker->uct, diff --git a/net/ucx/files/patch-src_ucs_arch_aarch64_cpu.h b/net/ucx/files/patch-src_ucs_arch_aarch64_cpu.h new file mode 100644 index 000000000000..74a17feb2179 --- /dev/null +++ b/net/ucx/files/patch-src_ucs_arch_aarch64_cpu.h @@ -0,0 +1,10 @@ +--- src/ucs/arch/aarch64/cpu.h.orig 2026-02-17 21:08:28 UTC ++++ src/ucs/arch/aarch64/cpu.h +@@ -15,6 +15,7 @@ + #include + #include + #include ++#include + #include + #include + #include diff --git a/net/ucx/files/patch-src_ucs_async_signal.c b/net/ucx/files/patch-src_ucs_async_signal.c new file mode 100644 index 000000000000..f344e0c5b364 --- /dev/null +++ b/net/ucx/files/patch-src_ucs_async_signal.c @@ -0,0 +1,47 @@ +--- src/ucs/async/signal.c.orig 2026-02-04 09:52:46 UTC ++++ src/ucs/async/signal.c +@@ -220,15 +220,30 @@ static void ucs_async_signal_handler(int signo, siginf + case POLL_ERR: + case POLL_MSG: + case POLL_PRI: ++ { ++#if defined(__linux__) + ucs_trace_async("async signal handler called for fd %d", siginfo->si_fd); + ucs_async_dispatch_handlers(&siginfo->si_fd, 1, + ucs_signal_map_to_events(siginfo->si_code)); ++#else ++ /* ++ * FreeBSD does not provide si_fd in siginfo_t for SIGIO-style delivery, ++ * so we can't know which fd triggered the signal here. ++ * ++ * Fallback: dispatch without a specific fd. UCX usually treats fd<0 as ++ * "dispatch all" ++ */ ++ int fd = -1; ++ ucs_trace_async("async signal handler called (no si_fd on this platform)"); ++ ucs_async_dispatch_handlers(&fd, 1, ucs_signal_map_to_events(siginfo->si_code)); ++#endif + return; + default: + ucs_warn("signal handler called with unexpected event code %d, ignoring", + siginfo->si_code); + return; + } ++ } + } + + static void ucs_async_signal_allow(int allow) +@@ -382,11 +397,13 @@ static ucs_status_t ucs_async_signal_add_event_fd(ucs_ + /* Send signal when fd is ready */ + ucs_trace_async("fcntl(F_STSIG, fd=%d, sig=%s)", event_fd, + ucs_signal_names[ucs_global_opts.async_signo]); ++#if defined(__linux__) + if (0 > fcntl(event_fd, F_SETSIG, ucs_global_opts.async_signo)) { + ucs_error("fcntl F_SETSIG failed: %m"); + status = UCS_ERR_IO_ERROR; + goto err_remove_handler; + } ++#endif + + /* Send the signal to the desired thread */ + tid = ucs_async_signal_context_tid(async); diff --git a/net/ucx/files/patch-src_ucs_config_parser.c b/net/ucx/files/patch-src_ucs_config_parser.c new file mode 100644 index 000000000000..8ab9c6cda94d --- /dev/null +++ b/net/ucx/files/patch-src_ucs_config_parser.c @@ -0,0 +1,54 @@ +--- src/ucs/config/parser.c.orig 2026-02-05 12:41:56 UTC ++++ src/ucs/config/parser.c +@@ -25,6 +25,7 @@ + #include + #include + #include ++#include + + + /* width of titles in docstring */ +@@ -693,6 +694,8 @@ int ucs_config_sscanf_signo(const char *buf, void *des + int ucs_config_sscanf_signo(const char *buf, void *dest, const void *arg) + { + char *endptr; ++ const char *name; ++ const char *name_nosig; + int signo; + + signo = strtol(buf, &endptr, 10); +@@ -701,11 +704,31 @@ int ucs_config_sscanf_signo(const char *buf, void *des + return 1; + } + +- if (!strncmp(buf, "SIG", 3)) { +- buf += 3; ++ name = buf; ++ if (!strncasecmp(name, "SIG", 3)) { ++ name_nosig = name + 3; ++ } else { ++ name_nosig = name; + } + +- return ucs_config_sscanf_enum(buf, dest, ucs_signal_names); ++#if defined(__FreeBSD__) ++ for (signo = 1; signo < NSIG; ++signo) { ++ if ((sys_signame[signo] != NULL) && ++ !strcasecmp(name_nosig, sys_signame[signo])) { ++ *(int*)dest = signo; ++ return 1; ++ } ++ } ++#endif ++ ++ if (ucs_config_sscanf_enum(name_nosig, dest, ucs_signal_names)) { ++ return 1; ++ } ++ if (name_nosig != name) { ++ return ucs_config_sscanf_enum(name, dest, ucs_signal_names); ++ } ++ ++ return 0; + } + + int ucs_config_sprintf_signo(char *buf, size_t max, diff --git a/net/ucx/files/patch-src_ucs_debug_debug.c b/net/ucx/files/patch-src_ucs_debug_debug.c new file mode 100644 index 000000000000..01aebbd3f7e3 --- /dev/null +++ b/net/ucx/files/patch-src_ucs_debug_debug.c @@ -0,0 +1,11 @@ +--- src/ucs/debug/debug.c.orig 2026-01-12 18:10:14 UTC ++++ src/ucs/debug/debug.c +@@ -24,6 +24,8 @@ + #include + #include + #include ++#include ++#include + #ifdef HAVE_DETAILED_BACKTRACE + # include + #endif /* HAVE_DETAILED_BACKTRACE */ diff --git a/net/ucx/files/patch-src_ucs_debug_log.c b/net/ucx/files/patch-src_ucs_debug_log.c new file mode 100644 index 000000000000..ab60cc2bdfe6 --- /dev/null +++ b/net/ucx/files/patch-src_ucs_debug_log.c @@ -0,0 +1,14 @@ +--- src/ucs/debug/log.c.orig 2026-02-04 09:52:46 UTC ++++ src/ucs/debug/log.c +@@ -78,7 +78,11 @@ static int __thread ucs_log_current_indent = 0; + static unsigned ucs_log_handlers_count = 0; + static int ucs_log_initialized = 0; + static int __thread ucs_log_current_indent = 0; ++#if defined(__FreeBSD__) ++static char ucs_log_hostname[UCS_HOST_NAME_MAX] = {0}; ++#else + static char ucs_log_hostname[HOST_NAME_MAX] = {0}; ++#endif + static int ucs_log_pid = 0; + static FILE *ucs_log_file = NULL; + static char *ucs_log_file_base_name = NULL; diff --git a/net/ucx/files/patch-src_ucs_memory_numa.c b/net/ucx/files/patch-src_ucs_memory_numa.c new file mode 100644 index 000000000000..4affe96870d5 --- /dev/null +++ b/net/ucx/files/patch-src_ucs_memory_numa.c @@ -0,0 +1,23 @@ +--- src/ucs/memory/numa.c.orig 2026-02-04 09:52:46 UTC ++++ src/ucs/memory/numa.c +@@ -20,6 +20,20 @@ + #include + #include + ++#ifndef __CPU_SETSIZE ++# if defined(__FreeBSD__) ++# include ++# include ++# endif ++# if defined(CPU_SETSIZE) ++# define __CPU_SETSIZE CPU_SETSIZE ++# elif defined(MAXCPU) ++# define __CPU_SETSIZE MAXCPU ++# else ++# define __CPU_SETSIZE 1024 ++# endif ++#endif ++ + #define UCS_NUMA_MIN_DISTANCE 10 + #define UCS_NUMA_NODE_MAX INT16_MAX + #define UCS_NUMA_CORE_DIR_PATH UCS_SYS_FS_CPUS_PATH "/cpu%d" diff --git a/net/ucx/files/patch-src_ucs_sys_compiler.h b/net/ucx/files/patch-src_ucs_sys_compiler.h new file mode 100644 index 000000000000..9fe706c4c951 --- /dev/null +++ b/net/ucx/files/patch-src_ucs_sys_compiler.h @@ -0,0 +1,17 @@ +--- src/ucs/sys/compiler.h.orig 2026-02-04 09:52:46 UTC ++++ src/ucs/sys/compiler.h +@@ -32,7 +32,13 @@ + + /* A function which should not be optimized */ + #if defined(HAVE_ATTRIBUTE_NOOPTIMIZE) && (HAVE_ATTRIBUTE_NOOPTIMIZE == 1) +-#define UCS_F_NOOPTIMIZE __attribute__((optimize("O0"))) ++#if defined(__clang__) ++# define UCS_F_NOOPTIMIZE __attribute__((optnone)) ++#elif defined(__GNUC__) ++# define UCS_F_NOOPTIMIZE __attribute__((optimize("O0"))) ++#else ++# define UCS_F_NOOPTIMIZE ++#endif + #else + #define UCS_F_NOOPTIMIZE + #endif diff --git a/net/ucx/files/patch-src_ucs_sys_event__set.c b/net/ucx/files/patch-src_ucs_sys_event__set.c new file mode 100644 index 000000000000..0c269c24c9c4 --- /dev/null +++ b/net/ucx/files/patch-src_ucs_sys_event__set.c @@ -0,0 +1,232 @@ +--- src/ucs/sys/event_set.c.orig 2026-02-04 09:52:46 UTC ++++ src/ucs/sys/event_set.c +@@ -19,9 +19,14 @@ + #include + #include + #include ++#if defined(__FreeBSD__) ++#include ++#include ++#include ++#else + #include ++#endif + +- + enum { + UCS_SYS_EVENT_SET_EXTERNAL_EVENT_FD = UCS_BIT(0), + }; +@@ -32,9 +37,46 @@ const unsigned ucs_sys_event_set_max_wait_events = + }; + + const unsigned ucs_sys_event_set_max_wait_events = ++#if defined(__FreeBSD__) ++ UCS_ALLOCA_MAX_SIZE / sizeof(struct kevent); ++#else + UCS_ALLOCA_MAX_SIZE / sizeof(struct epoll_event); ++#endif + + ++#if defined(__FreeBSD__) ++static inline int ucs_event_set_map_to_raw_flags(ucs_event_set_types_t events) ++{ ++ /* Approximate edge-triggered behavior with EV_CLEAR */ ++ return (events & UCS_EVENT_SET_EDGE_TRIGGERED) ? EV_CLEAR : 0; ++} ++ ++static inline int ucs_event_set_map_to_events(const struct kevent *kev) ++{ ++ ucs_event_set_types_t events = 0; ++ ++ if (kev->filter == EVFILT_READ) { ++ events |= UCS_EVENT_SET_EVREAD; ++ } else if (kev->filter == EVFILT_WRITE) { ++ events |= UCS_EVENT_SET_EVWRITE; ++ } ++ if (kev->flags & EV_ERROR) { ++ events |= UCS_EVENT_SET_EVERR; ++ } ++ return events; ++} ++ ++static int ucs_kqueue_ctl(int kq, int fd, int filter, int op_flags, ++ int fflags, intptr_t data, void *udata) ++{ ++ struct kevent kev; ++ EV_SET(&kev, (uintptr_t)fd, filter, op_flags, fflags, data, udata); ++ if (kevent(kq, &kev, 1, NULL, 0, NULL) < 0) { ++ return -1; ++ } ++ return 0; ++} ++#else + static inline int ucs_event_set_map_to_raw_events(ucs_event_set_types_t events) + { + int raw_events = 0; +@@ -72,6 +114,7 @@ static inline int ucs_event_set_map_to_events(int raw_ + } + return events; + } ++#endif + + static ucs_sys_event_set_t *ucs_event_set_alloc(int event_fd, unsigned flags) + { +@@ -105,12 +148,21 @@ ucs_status_t ucs_event_set_create(ucs_sys_event_set_t + ucs_status_t status; + int event_fd; + ++#if defined(__FreeBSD__) ++ /* Create kqueue set the thread will wait on */ ++ event_fd = kqueue(); ++ if (event_fd < 0) { ++ ucs_error("kqueue() failed: %m"); ++ return UCS_ERR_IO_ERROR; ++ } ++#else + /* Create epoll set the thread will wait on */ + event_fd = epoll_create(1); + if (event_fd < 0) { + ucs_error("epoll_create() failed: %m"); + return UCS_ERR_IO_ERROR; + } ++#endif + + *event_set_p = ucs_event_set_alloc(event_fd, 0); + if (*event_set_p == NULL) { +@@ -129,6 +181,26 @@ ucs_status_t ucs_event_set_add(ucs_sys_event_set_t *ev + ucs_event_set_types_t events, + void *callback_data) + { ++#if defined(__FreeBSD__) ++ int kq = event_set->event_fd; ++ int raw_flags = ucs_event_set_map_to_raw_flags(events); ++ ++ if (events & UCS_EVENT_SET_EVREAD) { ++ if (ucs_kqueue_ctl(kq, fd, EVFILT_READ, EV_ADD | EV_ENABLE | raw_flags, ++ 0, 0, callback_data) < 0) { ++ ucs_error("kevent(kq=%d, ADD, fd=%d, READ) failed: %m", kq, fd); ++ return UCS_ERR_IO_ERROR; ++ } ++ } ++ if (events & UCS_EVENT_SET_EVWRITE) { ++ if (ucs_kqueue_ctl(kq, fd, EVFILT_WRITE, EV_ADD | EV_ENABLE | raw_flags, ++ 0, 0, callback_data) < 0) { ++ ucs_error("kevent(kq=%d, ADD, fd=%d, WRITE) failed: %m", kq, fd); ++ return UCS_ERR_IO_ERROR; ++ } ++ } ++ return UCS_OK; ++#else + struct epoll_event raw_event; + int ret; + +@@ -144,12 +216,18 @@ ucs_status_t ucs_event_set_add(ucs_sys_event_set_t *ev + } + + return UCS_OK; ++#endif + } + + ucs_status_t ucs_event_set_mod(ucs_sys_event_set_t *event_set, int fd, + ucs_event_set_types_t events, + void *callback_data) + { ++#if defined(__FreeBSD__) ++ /* Simplest: delete then re-add with new mask */ ++ (void)ucs_event_set_del(event_set, fd); ++ return ucs_event_set_add(event_set, fd, events, callback_data); ++#else + struct epoll_event raw_event; + int ret; + +@@ -165,10 +243,28 @@ ucs_status_t ucs_event_set_mod(ucs_sys_event_set_t *ev + } + + return UCS_OK; ++#endif + } + + ucs_status_t ucs_event_set_del(ucs_sys_event_set_t *event_set, int fd) + { ++#if defined(__FreeBSD__) ++ int kq = event_set->event_fd; ++ int ret = 0; ++ ++ /* Delete both filters; ignore ENOENT (not registered). */ ++ if ((ucs_kqueue_ctl(kq, fd, EVFILT_READ, EV_DELETE, 0, 0, NULL) < 0) && ++ (errno != ENOENT)) { ++ ucs_error("kevent(kq=%d, DEL, fd=%d, READ) failed: %m", kq, fd); ++ ret = -1; ++ } ++ if ((ucs_kqueue_ctl(kq, fd, EVFILT_WRITE, EV_DELETE, 0, 0, NULL) < 0) && ++ (errno != ENOENT)) { ++ ucs_error("kevent(kq=%d, DEL, fd=%d, WRITE) failed: %m", kq, fd); ++ ret = -1; ++ } ++ return (ret < 0) ? UCS_ERR_IO_ERROR : UCS_OK; ++#else + int ret; + + ret = epoll_ctl(event_set->event_fd, EPOLL_CTL_DEL, fd, NULL); +@@ -179,6 +275,7 @@ ucs_status_t ucs_event_set_del(ucs_sys_event_set_t *ev + } + + return UCS_OK; ++#endif + } + + ucs_status_t ucs_event_set_wait(ucs_sys_event_set_t *event_set, +@@ -186,6 +283,45 @@ ucs_status_t ucs_event_set_wait(ucs_sys_event_set_t *e + ucs_event_set_handler_t event_set_handler, + void *arg) + { ++#if defined(__FreeBSD__) ++ struct kevent *events; ++ int nready, i, io_events; ++ struct timespec ts, *tsp; ++ ++ ucs_assert(event_set_handler != NULL); ++ ucs_assert(num_events != NULL); ++ ucs_assert(*num_events <= ucs_sys_event_set_max_wait_events); ++ ++ events = ucs_alloca(sizeof(*events) * *num_events); ++ ++ if (timeout_ms < 0) { ++ tsp = NULL; ++ } else { ++ ts.tv_sec = timeout_ms / 1000; ++ ts.tv_nsec = (timeout_ms % 1000) * 1000000; ++ tsp = &ts; ++ } ++ ++ nready = kevent(event_set->event_fd, NULL, 0, events, *num_events, tsp); ++ if (ucs_unlikely(nready < 0)) { ++ *num_events = 0; ++ if (errno == EINTR) { ++ return UCS_INPROGRESS; ++ } ++ ucs_error("kevent() failed: %m"); ++ return UCS_ERR_IO_ERROR; ++ } ++ ++ ucs_assert(nready <= *num_events); ++ ++ for (i = 0; i < nready; i++) { ++ io_events = ucs_event_set_map_to_events(&events[i]); ++ event_set_handler(events[i].udata, io_events, arg); ++ } ++ ++ *num_events = nready; ++ return UCS_OK; ++#else + struct epoll_event *events; + int nready, i, io_events; + +@@ -217,6 +353,7 @@ ucs_status_t ucs_event_set_wait(ucs_sys_event_set_t *e + + *num_events = nready; + return UCS_OK; ++#endif + } + + void ucs_event_set_cleanup(ucs_sys_event_set_t *event_set) diff --git a/net/ucx/files/patch-src_ucs_sys_netlink.c b/net/ucx/files/patch-src_ucs_sys_netlink.c new file mode 100644 index 000000000000..5fd9c75cc883 --- /dev/null +++ b/net/ucx/files/patch-src_ucs_sys_netlink.c @@ -0,0 +1,50 @@ +--- src/ucs/sys/netlink.c.orig 2026-02-05 12:41:56 UTC ++++ src/ucs/sys/netlink.c +@@ -8,6 +8,8 @@ + #include "config.h" + #endif + ++#if defined(__linux__) ++ + #include "netlink.h" + + #include +@@ -310,3 +312,38 @@ int ucs_netlink_route_exists(int if_index, const struc + + return info.found; + } ++#else ++ ++#include "netlink.h" ++ ++/* ++ * Netlink is Linux-specific. On non-Linux platforms (e.g., FreeBSD), ++ * UCX should build and run without netlink-based route checks. ++ */ ++ucs_status_t ++ucs_netlink_send_request(int protocol, unsigned short nlmsg_type, ++ unsigned short nlmsg_flags, ++ const void *protocol_header, size_t header_length, ++ ucs_netlink_parse_cb_t parse_cb, void *arg) ++{ ++ (void)protocol; ++ (void)nlmsg_type; ++ (void)nlmsg_flags; ++ (void)protocol_header; ++ (void)header_length; ++ (void)parse_cb; ++ (void)arg; ++ return UCS_ERR_UNSUPPORTED; ++} ++ ++int ++ucs_netlink_route_exists(int if_index, const struct sockaddr *sa_remote, ++ int allow_default_gw) ++{ ++ (void)if_index; ++ (void)sa_remote; ++ (void)allow_default_gw; ++ return 0; ++} ++ ++#endif diff --git a/net/ucx/files/patch-src_ucs_sys_netlink.h b/net/ucx/files/patch-src_ucs_sys_netlink.h new file mode 100644 index 000000000000..2430f5fd020a --- /dev/null +++ b/net/ucx/files/patch-src_ucs_sys_netlink.h @@ -0,0 +1,15 @@ +--- src/ucs/sys/netlink.h.orig 2026-02-05 12:41:56 UTC ++++ src/ucs/sys/netlink.h +@@ -9,7 +9,12 @@ + + #include + ++#if defined(__linux__) + #include ++#else ++struct nlmsghdr; ++#endif ++#include + #include + + BEGIN_C_DECLS diff --git a/net/ucx/files/patch-src_ucs_sys_sock.h b/net/ucx/files/patch-src_ucs_sys_sock.h new file mode 100644 index 000000000000..cd9072c9b31e --- /dev/null +++ b/net/ucx/files/patch-src_ucs_sys_sock.h @@ -0,0 +1,21 @@ +--- src/ucs/sys/sock.h.orig 2026-02-04 09:52:46 UTC ++++ src/ucs/sys/sock.h +@@ -8,6 +8,18 @@ + #ifndef UCS_SOCKET_H + #define UCS_SOCKET_H + ++#include ++#include ++ ++#if defined(HAVE_NETINET_IN_H) ++#include ++#endif ++ ++/* inet_pton/inet_ntop */ ++#if defined(HAVE_ARPA_INET_H) ++#include ++#endif ++ + #include + #include + diff --git a/net/ucx/files/patch-src_ucs_sys_sys.c b/net/ucx/files/patch-src_ucs_sys_sys.c new file mode 100644 index 000000000000..1f70cc8b329f --- /dev/null +++ b/net/ucx/files/patch-src_ucs_sys_sys.c @@ -0,0 +1,310 @@ +--- src/ucs/sys/sys.c.orig 2026-02-05 12:41:56 UTC ++++ src/ucs/sys/sys.c +@@ -23,16 +23,26 @@ + #include + + #include ++#include + #include + #include + #include + #include + #include + #include ++#include + #include + #include + #include + #include ++#include ++#if defined(__FreeBSD__) ++#include ++#include ++#include ++#include ++#include ++#endif + #ifdef HAVE_SYS_THR_H + #include + #endif +@@ -94,7 +104,7 @@ const char *ucs_get_host_name() + + const char *ucs_get_host_name() + { +- static char hostname[HOST_NAME_MAX] = {0}; ++ static char hostname[UCS_HOST_NAME_MAX] = {0}; + + if (*hostname == 0) { + gethostname(hostname, sizeof(hostname)); +@@ -180,6 +190,41 @@ int ucs_netif_is_ipoib(const char *if_name) + + int ucs_netif_is_ipoib(const char *if_name) + { ++#if defined(__FreeBSD__) ++ struct ifaddrs *ifap = NULL, *ifa; ++ int is_ipoib = 0; ++ ++ if (getifaddrs(&ifap) != 0) { ++ ucs_debug("getifaddrs() failed for %s: %m", if_name); ++ return 0; ++ } ++ ++ for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) { ++ const struct sockaddr *sa = ifa->ifa_addr; ++ const struct sockaddr_dl *sdl; ++ ++ if ((ifa->ifa_name == NULL) || (sa == NULL)) { ++ continue; ++ } ++ if (strcmp(ifa->ifa_name, if_name) != 0) { ++ continue; ++ } ++ if (sa->sa_family != AF_LINK) { ++ continue; ++ } ++ ++ sdl = (const struct sockaddr_dl *)sa; ++#ifdef IFT_INFINIBAND ++ if (sdl->sdl_type == IFT_INFINIBAND) { ++ is_ipoib = 1; ++ break; ++ } ++#endif ++ } ++ ++ freeifaddrs(ifap); ++ return is_ipoib; ++#else + struct ifreq ifr; + ucs_status_t status; + +@@ -191,11 +236,56 @@ int ucs_netif_is_ipoib(const char *if_name) + } + + return ifr.ifr_hwaddr.sa_family == ARPHRD_INFINIBAND; ++#endif + } + + static uint64_t ucs_get_mac_address() + { + static uint64_t mac_address = 0; ++#if defined(__FreeBSD__) ++ struct ifaddrs *ifap = NULL, *ifa; ++ ++ if (mac_address != 0) { ++ return mac_address; ++ } ++ ++ if (getifaddrs(&ifap) != 0) { ++ ucs_error("getifaddrs() failed: %m"); ++ return 0; ++ } ++ ++ for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) { ++ const struct sockaddr *sa = ifa->ifa_addr; ++ const struct sockaddr_dl *sdl; ++ const unsigned char *lladdr; ++ ++ if ((ifa->ifa_flags & IFF_LOOPBACK) || (sa == NULL)) { ++ continue; ++ } ++ if (sa->sa_family != AF_LINK) { ++ continue; ++ } ++ ++ sdl = (const struct sockaddr_dl *)sa; ++ if (sdl->sdl_alen < 6) { ++ continue; ++ } ++ ++ lladdr = (const unsigned char *)LLADDR(sdl); ++ /* ++ * Copy first 6 bytes (MAC). Keep same semantics as Linux code: ++ * store into low bytes of uint64_t. ++ */ ++ mac_address = 0; ++ memcpy(&mac_address, lladdr, 6); ++ break; ++ } ++ ++ freeifaddrs(ifap); ++ ++ ucs_trace("MAC address is 0x%012"PRIX64, mac_address); ++ return mac_address; ++#else + struct ifreq ifr, *it, *end; + struct ifconf ifc; + char buf[1024]; +@@ -243,6 +333,7 @@ static uint64_t ucs_get_mac_address() + } + + return mac_address; ++#endif + } + + static uint64_t __sumup_host_name(unsigned prime_index) +@@ -766,6 +857,10 @@ static void ucs_sysv_shmget_error_check_ENOSPC(size_t + const struct shminfo *ipc_info, + char *buf, size_t max) + { ++#if defined(__FreeBSD__) ++ (void)alloc_size; (void)ipc_info; (void)buf; (void)max; ++ return; ++#else + unsigned long new_used_ids; + unsigned long new_shm_tot; + struct shm_info shm_info; +@@ -797,6 +892,7 @@ static void ucs_sysv_shmget_error_check_ENOSPC(size_t + " limit in /proc/sys/kernel/shmall (=%lu)", + new_shm_tot, ipc_info->shmall); + } ++#endif + } + + ucs_status_t ucs_sys_get_proc_cap(uint32_t *effective) +@@ -857,6 +953,14 @@ static void ucs_sysv_shmget_format_error(size_t alloc_ + const char *alloc_name, int sys_errno, + char *buf, size_t max) + { ++#if defined(__FreeBSD__) ++ /* FreeBSD does not have Linux shmctl(IPC_INFO/SHM_INFO) or struct shminfo. */ ++ snprintf(buf, max, ++ "shmget(size=%zu flags=0x%x) for %s failed: %s, please check shared " ++ "memory limits by 'sysctl kern.ipc' / 'sysctl hw.pagesize' / 'ipcs -a'", ++ alloc_size, flags, alloc_name, strerror(sys_errno)); ++ return; ++#else + struct shminfo ipc_info; + char *p, *endp, *errp; + int ret; +@@ -894,6 +998,7 @@ static void ucs_sysv_shmget_format_error(size_t alloc_ + if (p == errp) { + snprintf(p, endp - p, ", please check shared memory limits by 'ipcs -l'"); + } ++#endif + } + + ucs_status_t ucs_sysv_alloc(size_t *size, size_t max_size, void **address_p, +@@ -1287,11 +1392,44 @@ void *ucs_sys_realloc(void *old_ptr, size_t old_length + { + void *ptr; + ++#if defined(__FreeBSD__) ++ size_t copy_length; ++ + new_length = ucs_align_up_pow2(new_length, ucs_get_page_size()); + if (old_ptr == NULL) { ++ ptr = mmap(NULL, new_length, PROT_READ | PROT_WRITE, ++ MAP_PRIVATE | MAP_ANON, -1, 0); ++ if (ptr == MAP_FAILED) { ++ ucs_log_fatal_error("mmap(NULL, %zu, READ|WRITE, PRIVATE|ANON) failed: %m", ++ new_length); ++ return NULL; ++ } ++ return ptr; ++ } ++ ++ old_length = ucs_align_up_pow2(old_length, ucs_get_page_size()); ++ ptr = mmap(NULL, new_length, PROT_READ | PROT_WRITE, ++ MAP_PRIVATE | MAP_ANON, -1, 0); ++ if (ptr == MAP_FAILED) { ++ ucs_log_fatal_error("mmap(NULL, %zu, READ|WRITE, PRIVATE|ANON) failed: %m", ++ new_length); ++ return NULL; ++ } ++ ++ copy_length = ucs_min(old_length, new_length); ++ memcpy(ptr, old_ptr, copy_length); ++ ++ if (munmap(old_ptr, old_length) != 0) { ++ ucs_log_fatal_error("munmap(%p, %zu) failed: %m", old_ptr, old_length); ++ } ++ ++ return ptr; ++#elif defined(__linux__) ++ new_length = ucs_align_up_pow2(new_length, ucs_get_page_size()); ++ if (old_ptr == NULL) { + /* Note: Must pass the 0 offset as "long", otherwise it will be + * partially undefined when converted to syscall arguments */ +- ptr = (void*)syscall(__NR_mmap, NULL, new_length, PROT_READ|PROT_WRITE, ++ ptr = (void*)syscall(SYS_mmap, NULL, new_length, PROT_READ|PROT_WRITE, + MAP_PRIVATE|MAP_ANONYMOUS, -1, 0ul); + if (ptr == MAP_FAILED) { + ucs_log_fatal_error("mmap(NULL, %zu, READ|WRITE, PRIVATE|ANON) failed: %m", +@@ -1300,7 +1438,7 @@ void *ucs_sys_realloc(void *old_ptr, size_t old_length + } + } else { + old_length = ucs_align_up_pow2(old_length, ucs_get_page_size()); +- ptr = (void*)syscall(__NR_mremap, old_ptr, old_length, new_length, ++ ptr = (void*)syscall(SYS_mremap, old_ptr, old_length, new_length, + MREMAP_MAYMOVE); + if (ptr == MAP_FAILED) { + ucs_log_fatal_error("mremap(%p, %zu, %zu, MAYMOVE) failed: %m", +@@ -1310,6 +1448,13 @@ void *ucs_sys_realloc(void *old_ptr, size_t old_length + } + + return ptr; ++#else ++(void)old_ptr; ++ (void)old_length; ++ (void)new_length; ++ ucs_log_fatal_error("ucs_sys_realloc() is not implemented on this platform"); ++ return NULL; ++#endif + } + + void ucs_sys_free(void *ptr, size_t length) +@@ -1317,11 +1462,19 @@ void ucs_sys_free(void *ptr, size_t length) + int ret; + + if (ptr != NULL) { ++#if defined(__FreeBSD__) + length = ucs_align_up_pow2(length, ucs_get_page_size()); +- ret = syscall(__NR_munmap, ptr, length); ++ ret = munmap(ptr, length); + if (ret) { + ucs_log_fatal_error("munmap(%p, %zu) failed: %m", ptr, length); + } ++#else ++ length = ucs_align_up_pow2(length, ucs_get_page_size()); ++ ret = syscall(SYS_munmap, ptr, length); ++ if (ret) { ++ ucs_log_fatal_error("munmap(%p, %zu) failed: %m", ptr, length); ++ } ++#endif + } + } + +@@ -1391,12 +1544,32 @@ ucs_status_t ucs_sys_pthread_getaffinity(ucs_sys_cpuse + + ucs_status_t ucs_sys_pthread_getaffinity(ucs_sys_cpuset_t *cpuset) + { ++#if defined(__FreeBSD__) ++ long tid; ++ int ret; ++ ++#ifdef HAVE_SYS_THR_H ++ thr_self(&tid); ++#else ++ /* Fallback: best-effort use process id */ ++ tid = (long)getpid(); ++#endif ++ ++ ret = cpuset_getaffinity(CPU_LEVEL_WHICH, CPU_WHICH_TID, tid, ++ sizeof(*cpuset), cpuset); ++ if (ret != 0) { ++ ucs_error("cpuset_getaffinity(TID=%ld) failed: %m", tid); ++ return UCS_ERR_INVALID_PARAM; ++ } ++ return UCS_OK; ++#else + if (pthread_getaffinity_np(pthread_self(), sizeof(*cpuset), cpuset)) { + ucs_error("pthread_getaffinity_np() failed: %m"); + return UCS_ERR_INVALID_PARAM; + } + + return UCS_OK; ++#endif + } + + void ucs_sys_cpuset_copy(ucs_cpu_set_t *dst, const ucs_sys_cpuset_t *src) diff --git a/net/ucx/files/patch-src_ucs_sys_sys.h b/net/ucx/files/patch-src_ucs_sys_sys.h new file mode 100644 index 000000000000..4ba632e48ca5 --- /dev/null +++ b/net/ucx/files/patch-src_ucs_sys_sys.h @@ -0,0 +1,26 @@ +--- src/ucs/sys/sys.h.orig 2026-02-05 12:41:56 UTC ++++ src/ucs/sys/sys.h +@@ -50,6 +50,8 @@ + #include + #include + #include ++#include ++#include + + + #include +@@ -61,6 +63,14 @@ typedef cpuset_t ucs_sys_cpuset_t; + typedef cpuset_t ucs_sys_cpuset_t; + #else + #error "Port me" ++#endif ++ ++#ifndef UCS_HOST_NAME_MAX ++# ifdef _POSIX_HOST_NAME_MAX ++# define UCS_HOST_NAME_MAX _POSIX_HOST_NAME_MAX ++# else ++# define UCS_HOST_NAME_MAX 256 ++# endif + #endif + + #define UCS_SYS_FS_SYSTEM_PATH "/sys/devices/system" diff --git a/net/ucx/files/patch-src_ucs_type_float8.h b/net/ucx/files/patch-src_ucs_type_float8.h new file mode 100644 index 000000000000..cf2e88796c29 --- /dev/null +++ b/net/ucx/files/patch-src_ucs_type_float8.h @@ -0,0 +1,174 @@ +--- src/ucs/type/float8.h.orig 2026-02-04 09:52:46 UTC ++++ src/ucs/type/float8.h +@@ -3,12 +3,63 @@ + * + * See file LICENSE for terms. + */ +- + #ifndef UCS_TYPE_FLOAT_H + #define UCS_TYPE_FLOAT_H + +-#include ++#include ++#include + ++/* IEEE754 double layout helpers without bitfields. ++ */ ++static inline void ++ucs_double_to_words(double d, uint32_t *hi, uint32_t *lo) ++{ ++ uint32_t w[2]; ++ memcpy(w, &d, sizeof(w)); ++#if defined(FLOAT_WORDS_BIGENDIAN) ++ *hi = w[0]; ++ *lo = w[1]; ++#else ++ *hi = w[1]; ++ *lo = w[0]; ++#endif ++} ++ ++static inline double ++ucs_words_to_double(uint32_t hi, uint32_t lo) ++{ ++ uint32_t w[2]; ++ double d; ++#if defined(FLOAT_WORDS_BIGENDIAN) ++ w[0] = hi; ++ w[1] = lo; ++#else ++ w[0] = lo; ++ w[1] = hi; ++#endif ++ memcpy(&d, w, sizeof(d)); ++ return d; ++} ++ ++static inline uint32_t ucs_ieee_double_sign(uint32_t hi) ++{ ++ return hi >> 31; ++} ++ ++static inline uint32_t ucs_ieee_double_exp(uint32_t hi) ++{ ++ return (hi >> 20) & 0x7ffu; ++} ++ ++static inline uint32_t ucs_ieee_double_mant_hi20(uint32_t hi) ++{ ++ return hi & 0x000fffffu; ++} ++ ++#ifndef IEEE754_DOUBLE_BIAS ++# define IEEE754_DOUBLE_BIAS 1023 ++#endif ++ + #include + #include + #include +@@ -18,7 +69,6 @@ typedef uint8_t ucs_fp8_t; + + typedef uint8_t ucs_fp8_t; + +- + /** + * Bits number in the exponent part of a packed floating-point number + */ +@@ -103,24 +153,31 @@ static UCS_F_ALWAYS_INLINE ucs_fp8_t ucs_fp8_pack(doub + static UCS_F_ALWAYS_INLINE ucs_fp8_t ucs_fp8_pack(double value, uint64_t min, + uint64_t max) + { +- union ieee754_double ieee_value = {0}; ++ uint32_t hi, lo; ++ uint32_t exp; ++ uint32_t mant0; + uint8_t exponent; + int8_t min_exponent, max_exponent; + +- ieee_value.d = value; + min_exponent = ucs_ilog2(min); + max_exponent = ucs_ilog2(max); + +- if (ucs_unlikely(ieee_value.ieee.exponent == _UCS_FP8_IEEE_NAN_EXPONENT)) { ++ ucs_double_to_words(value, &hi, &lo); ++ exp = ucs_ieee_double_exp(hi); ++ mant0 = ucs_ieee_double_mant_hi20(hi); ++ ++ if (ucs_unlikely(exp == _UCS_FP8_IEEE_NAN_EXPONENT)) { + /* NaN maps to a special value for NaN */ + exponent = _UCS_FP8_NAN; +- } else if (ucs_unlikely(ieee_value.ieee.exponent > ++ } else if (ucs_unlikely(exp > + (max_exponent + _UCS_FP8_EXPONENT_OFFSET))) { + /* A number beyond the max supported is capped */ + exponent = max_exponent - min_exponent; +- ieee_value.ieee.mantissa0 = 0; +- ieee_value.ieee.mantissa1 = 0; +- } else if (ucs_unlikely(ieee_value.ieee.exponent <= ++ /* zero mantissa in-place */ ++ mant0 = 0; ++ lo = 0; ++ hi = (hi & 0xfff00000u); /* keep sign+exp, clear mantissa hi20 */ ++ } else if (ucs_unlikely(exp <= + min_exponent + _UCS_FP8_EXPONENT_OFFSET)) { + if (ucs_unlikely(value == 0)) { + /* 0 maps to a special value for 0 */ +@@ -128,15 +185,16 @@ static UCS_F_ALWAYS_INLINE ucs_fp8_t ucs_fp8_pack(doub + } else { + /* A number below the min supported is rounded up */ + exponent = 1; +- ieee_value.ieee.mantissa0 = 0; +- ieee_value.ieee.mantissa1 = 0; ++ mant0 = 0; ++ lo = 0; ++ hi = (hi & 0xfff00000u); + } + } else { +- exponent = ieee_value.ieee.exponent - _UCS_FP8_EXPONENT_OFFSET - ++ exponent = exp - _UCS_FP8_EXPONENT_OFFSET - + min_exponent; + } + +- return exponent | ((ieee_value.ieee.mantissa0 >> _UCS_FP_MANTISSA_OFFSET) ++ return exponent | ((mant0 >> _UCS_FP_MANTISSA_OFFSET) + << _UCS_FP8_EXPONENT_BITS); + } + +@@ -154,23 +212,28 @@ ucs_fp8_unpack(ucs_fp8_t value, uint64_t min, uint64_t + static UCS_F_ALWAYS_INLINE double + ucs_fp8_unpack(ucs_fp8_t value, uint64_t min, uint64_t max) + { +- union ieee754_double ieee_value = {0}; ++ uint32_t hi = 0, lo = 0; ++ uint32_t exp; ++ uint32_t mant0; + uint8_t exponent = value & _UCS_FP8_EXPONENT_MASK; + +- ieee_value.ieee.negative = 0; ++ (void)max; ++ + if (ucs_unlikely(exponent == 0)) { +- ieee_value.ieee.exponent = 0; ++ exp = 0; + } else if (ucs_unlikely(exponent == _UCS_FP8_NAN)) { +- ieee_value.ieee.exponent = _UCS_FP8_IEEE_NAN_EXPONENT; ++ exp = _UCS_FP8_IEEE_NAN_EXPONENT; + } else { +- ieee_value.ieee.exponent = exponent + _UCS_FP8_EXPONENT_OFFSET + ++ exp = exponent + _UCS_FP8_EXPONENT_OFFSET + + ucs_ilog2(min); + } +- ieee_value.ieee.mantissa0 = value >> _UCS_FP8_EXPONENT_BITS; +- ieee_value.ieee.mantissa0 = ieee_value.ieee.mantissa0 +- << _UCS_FP_MANTISSA_OFFSET; ++ mant0 = (uint32_t)(value >> _UCS_FP8_EXPONENT_BITS); ++ mant0 = (mant0 << _UCS_FP_MANTISSA_OFFSET) & 0x000fffffu; + +- return ieee_value.d; ++ hi = ((exp & 0x7ffu) << 20) | (mant0 & 0x000fffffu); ++ lo = 0; ++ ++ return ucs_words_to_double(hi, lo); + } + + diff --git a/net/ucx/files/patch-src_ucs_vfs_fuse_vfs__fuse.c b/net/ucx/files/patch-src_ucs_vfs_fuse_vfs__fuse.c new file mode 100644 index 000000000000..1def131f70d9 --- /dev/null +++ b/net/ucx/files/patch-src_ucs_vfs_fuse_vfs__fuse.c @@ -0,0 +1,109 @@ +--- src/ucs/vfs/fuse/vfs_fuse.c.orig 2026-02-04 09:52:46 UTC ++++ src/ucs/vfs/fuse/vfs_fuse.c +@@ -37,6 +37,7 @@ static struct { + + static struct { + pthread_t thread_id; ++ int thread_started; + pthread_mutex_t mutex; + struct fuse *fuse; + int fuse_fd; +@@ -44,15 +45,20 @@ static struct { + int inotify_fd; + int watch_desc; + } ucs_vfs_fuse_context = { +- .thread_id = -1, +- .mutex = PTHREAD_MUTEX_INITIALIZER, +- .fuse = NULL, +- .fuse_fd = -1, +- .stop = 0, +- .inotify_fd = -1, +- .watch_desc = -1 ++ .thread_started = 0, ++ .mutex = PTHREAD_MUTEX_INITIALIZER, ++ .fuse = NULL, ++ .fuse_fd = -1, ++ .stop = 0, ++ .inotify_fd = -1, ++ .watch_desc = -1 + }; + ++static void ucs_vfs_sigusr1_handler(int signo) ++{ ++ (void)signo; ++} ++ + static void ucs_vfs_enum_dir_cb(const char *name, void *arg) + { + ucs_vfs_enum_dir_context_t *ctx = arg; +@@ -492,10 +498,10 @@ static void ucs_fuse_thread_stop() + + static void ucs_fuse_thread_stop() + { +- sighandler_t orig_handler; ++ sig_t orig_handler; + int ret; + +- orig_handler = signal(SIGUSR1, (sighandler_t)ucs_empty_function); ++ orig_handler = signal(SIGUSR1, ucs_vfs_sigusr1_handler); + + pthread_mutex_lock(&ucs_vfs_fuse_context.mutex); + +@@ -518,15 +524,20 @@ static void ucs_fuse_thread_stop() + if (ucs_vfs_fuse_context.fuse != NULL) { + fuse_exit(ucs_vfs_fuse_context.fuse); + ucs_fuse_replace_fd_devnull(); +- pthread_kill(ucs_vfs_fuse_context.thread_id, SIGUSR1); ++ if (ucs_vfs_fuse_context.thread_started) { ++ pthread_kill(ucs_vfs_fuse_context.thread_id, SIGUSR1); ++ } + } + + pthread_mutex_unlock(&ucs_vfs_fuse_context.mutex); + +- ret = pthread_join(ucs_vfs_fuse_context.thread_id, NULL); +- if (ret != 0) { +- ucs_warn("pthread_join(0x%lx) failed: %m", +- ucs_vfs_fuse_context.thread_id); ++ if (ucs_vfs_fuse_context.thread_started) { ++ ret = pthread_join(ucs_vfs_fuse_context.thread_id, NULL); ++ if (ret != 0) { ++ ucs_warn("pthread_join(0x%lx) failed: %m", ++ ucs_vfs_fuse_context.thread_id); ++ } ++ ucs_vfs_fuse_context.thread_started = 0; + } + + signal(SIGUSR1, orig_handler); +@@ -536,11 +547,11 @@ static void ucs_vfs_fuse_atfork_child() + { + /* Reset thread context at fork, since doing inotify_rm_watch() from child + will prevent doing it later from the parent */ +- ucs_vfs_fuse_context.thread_id = -1; +- ucs_vfs_fuse_context.fuse = NULL; +- ucs_vfs_fuse_context.fuse_fd = -1; +- ucs_vfs_fuse_context.inotify_fd = -1; +- ucs_vfs_fuse_context.watch_desc = -1; ++ ucs_vfs_fuse_context.thread_started = 0; ++ ucs_vfs_fuse_context.fuse = NULL; ++ ucs_vfs_fuse_context.fuse_fd = -1; ++ ucs_vfs_fuse_context.inotify_fd = -1; ++ ucs_vfs_fuse_context.watch_desc = -1; + } + + void UCS_F_CTOR ucs_vfs_fuse_init() +@@ -549,12 +560,13 @@ void UCS_F_CTOR ucs_vfs_fuse_init() + pthread_atfork(NULL, NULL, ucs_vfs_fuse_atfork_child); + ucs_pthread_create(&ucs_vfs_fuse_context.thread_id, + ucs_vfs_fuse_thread_func, NULL, "fuse"); ++ ucs_vfs_fuse_context.thread_started = 1; + } + } + + void UCS_F_DTOR ucs_vfs_fuse_cleanup() + { +- if (ucs_vfs_fuse_context.thread_id != -1) { ++ if (ucs_vfs_fuse_context.thread_started) { + ucs_fuse_thread_stop(); + } + } diff --git a/net/ucx/files/patch-src_ucs_vfs_sock_vfs__sock.c b/net/ucx/files/patch-src_ucs_vfs_sock_vfs__sock.c new file mode 100644 index 000000000000..4daa7a79a795 --- /dev/null +++ b/net/ucx/files/patch-src_ucs_vfs_sock_vfs__sock.c @@ -0,0 +1,78 @@ +--- src/ucs/vfs/sock/vfs_sock.c.orig 2026-02-04 09:52:46 UTC ++++ src/ucs/vfs/sock/vfs_sock.c +@@ -24,6 +24,9 @@ + #include + #include + #include ++#if defined(__FreeBSD__) ++#include ++#endif + + + typedef struct { +@@ -76,7 +79,13 @@ int ucs_vfs_sock_setopt_passcred(int sockfd) + int optval, ret; + + optval = 1; ++#if defined(__linux__) + ret = setsockopt(sockfd, SOL_SOCKET, SO_PASSCRED, &optval, sizeof(optval)); ++#elif defined(__FreeBSD__) ++ ret = setsockopt(sockfd, SOL_LOCAL, LOCAL_CREDS, &optval, sizeof(optval)); ++#else ++ ret = 0; /* no-op on other platforms for now */ ++#endif + if (ret < 0) { + return -errno; + } +@@ -132,7 +141,11 @@ int ucs_vfs_sock_recv(int sockfd, ucs_vfs_sock_message + int ucs_vfs_sock_recv(int sockfd, ucs_vfs_sock_message_t *vfs_msg) + { + char cbuf[CMSG_SPACE(sizeof(*vfs_msg))] UCS_V_ALIGNED(sizeof(size_t)); ++#if defined(__FreeBSD__) ++ const struct cmsgcred *cred; ++#else + const struct ucred *cred; ++#endif + struct cmsghdr *cmsgp; + struct msghdr msgh; + ucs_vfs_msg_t msg; +@@ -178,12 +191,30 @@ int ucs_vfs_sock_recv(int sockfd, ucs_vfs_sock_message + memcpy(&vfs_msg->fd, CMSG_DATA(cmsgp), sizeof(vfs_msg->fd)); + } else { + /* expect credentials */ ++#if defined(__FreeBSD__) ++ if ((cmsgp->cmsg_level != SOL_SOCKET) || ++ (cmsgp->cmsg_type != SCM_CREDS) || ++ (cmsgp->cmsg_len != CMSG_LEN(sizeof(*cred)))) { ++ return -EINVAL; ++ } ++ ++ cred = (const struct cmsgcred*)CMSG_DATA(cmsgp); ++ ++ if ((cred->cmcred_euid != geteuid()) || (cred->cmcred_gid != getegid())) { ++ return -EPERM; ++ } ++ ++ if (msg.action == UCS_VFS_SOCK_ACTION_MOUNT) { ++ vfs_msg->pid = cred->cmcred_pid; ++ } ++#else + if ((cmsgp->cmsg_type != SCM_CREDENTIALS) || +- (cmsgp->cmsg_len != CMSG_LEN(sizeof(*cred)))) { ++ (cmsgp->cmsg_len != CMSG_LEN(sizeof(*cred)))) { + return -EINVAL; + } + + cred = (const struct ucred*)CMSG_DATA(cmsgp); ++ + if ((cred->uid != getuid()) || (cred->gid != getgid())) { + return -EPERM; + } +@@ -191,6 +222,7 @@ int ucs_vfs_sock_recv(int sockfd, ucs_vfs_sock_message + if (msg.action == UCS_VFS_SOCK_ACTION_MOUNT) { + vfs_msg->pid = cred->pid; + } ++#endif + } + + return 0; diff --git a/net/ucx/files/patch-src_uct_ib_base_ib__device.h b/net/ucx/files/patch-src_uct_ib_base_ib__device.h new file mode 100644 index 000000000000..9ee4b5440b29 --- /dev/null +++ b/net/ucx/files/patch-src_uct_ib_base_ib__device.h @@ -0,0 +1,18 @@ +--- src/uct/ib/base/ib_device.h.orig 2026-02-05 12:41:56 UTC ++++ src/uct/ib/base/ib_device.h +@@ -20,8 +20,13 @@ + #include + + #include +-#include +- ++#if defined(__linux__) ++# include ++# include ++#else ++# include ++# include ++#endif + + #define UCT_IB_QPN_ORDER 24 /* How many bits can be an IB QP number */ + #define UCT_IB_UIDX_SHIFT 8 /* BE uidx shift */ diff --git a/net/ucx/files/patch-src_uct_ib_ud_base_ud__iface.c b/net/ucx/files/patch-src_uct_ib_ud_base_ud__iface.c new file mode 100644 index 000000000000..b0ed4172a351 --- /dev/null +++ b/net/ucx/files/patch-src_uct_ib_ud_base_ud__iface.c @@ -0,0 +1,17 @@ +--- src/uct/ib/ud/base/ud_iface.c.orig 2026-02-05 12:41:56 UTC ++++ src/uct/ib/ud/base/ud_iface.c +@@ -1113,7 +1113,13 @@ union ibv_gid* uct_ud_grh_get_dgid(struct ibv_grh *grh + size_t i; + + /* Make sure that daddr in IPv4 resides in the last 4 bytes in GRH */ +- UCS_STATIC_ASSERT((UCT_IB_GRH_LEN - (20 + offsetof(struct iphdr, daddr))) == ++ UCS_STATIC_ASSERT((UCT_IB_GRH_LEN - (20 + offsetof( ++#if defined(__linux__) ++ struct iphdr, daddr ++#else ++ struct ip, ip_dst ++#endif ++ ))) == + UCS_IPV4_ADDR_LEN); + + /* Make sure that dgid resides in the last 16 bytes in GRH */ diff --git a/net/ucx/files/patch-src_uct_tcp_tcp__base.c b/net/ucx/files/patch-src_uct_tcp_tcp__base.c new file mode 100644 index 000000000000..624ca2c1c428 --- /dev/null +++ b/net/ucx/files/patch-src_uct_tcp_tcp__base.c @@ -0,0 +1,15 @@ +--- src/uct/tcp/tcp_base.c.orig 2026-02-04 09:52:46 UTC ++++ src/uct/tcp/tcp_base.c +@@ -15,8 +15,12 @@ ucs_status_t ucs_tcp_base_set_syn_cnt(int fd, int tcp_ + ucs_status_t ucs_tcp_base_set_syn_cnt(int fd, int tcp_syn_cnt) + { + if (tcp_syn_cnt != UCS_ULUNITS_AUTO) { ++#if defined(__linux__) + ucs_socket_setopt(fd, IPPROTO_TCP, TCP_SYNCNT, (const void*)&tcp_syn_cnt, + sizeof(int)); ++#else ++ (void)fd; ++#endif + } + + /* return UCS_OK anyway since setting TCP_SYNCNT is done on best effort */ diff --git a/net/ucx/files/patch-src_uct_tcp_tcp__net.c b/net/ucx/files/patch-src_uct_tcp_tcp__net.c new file mode 100644 index 000000000000..ae4081c84d1c --- /dev/null +++ b/net/ucx/files/patch-src_uct_tcp_tcp__net.c @@ -0,0 +1,75 @@ +--- src/uct/tcp/tcp_net.c.orig 2026-02-04 09:52:46 UTC ++++ src/uct/tcp/tcp_net.c +@@ -12,10 +12,16 @@ + #include "tcp.h" + + #include ++ ++#if defined(__linux__) + #include + #include + #include + #include ++#else ++# include ++#endif ++ + #include + #include + #include +@@ -28,6 +34,7 @@ ucs_status_t uct_tcp_netif_caps(const char *if_name, d + ucs_status_t uct_tcp_netif_caps(const char *if_name, double *latency_p, + double *bandwidth_p) + { ++ #if defined(__linux__) + struct ethtool_cmd edata; + uint32_t speed_mbps; + ucs_status_t status; +@@ -104,10 +111,37 @@ ucs_status_t uct_tcp_netif_caps(const char *if_name, d + *bandwidth_p = (speed_mbps * 1e6) / 8 * + (mtu - 40) / (mtu + ll_headers); /* TCP/IP header is 40 bytes */ + return UCS_OK; ++#else ++ ucs_status_t status; ++ struct ifreq ifr; ++ uint32_t speed_mbps = 1000; /* best-effort default */ ++ size_t mtu = 1500; /* fallback */ ++ size_t ll_headers; ++ ++ memset(&ifr, 0, sizeof(ifr)); ++ ++ status = ucs_netif_ioctl(if_name, SIOCGIFMTU, &ifr); ++ if (status == UCS_OK) { ++ mtu = (size_t)ifr.ifr_mtu; ++ } ++ ++ /* ++ * Ethernet framing estimate: ++ * preamble(7) + SFD(1) + ethernet header + CRC + IFG(12) ++ */ ++ ll_headers = 7 + 1 + ETHER_HDR_LEN + ETHER_CRC_LEN + 12; ++ ++ /* Same model as Linux path */ ++ *latency_p = 576.0 / (speed_mbps * 1e6) + 5.2e-6; ++ *bandwidth_p = (speed_mbps * 1e6) / 8 * ++ (mtu - 40) / (mtu + ll_headers); ++ return UCS_OK; ++#endif + } + + ucs_status_t uct_tcp_netif_is_default(const char *if_name, int *result_p) + { ++#if defined(__linux__) + static const char *filename = "/proc/net/route"; + in_addr_t netmask; + char name[128]; +@@ -139,4 +173,9 @@ out: + out: + fclose(f); + return UCS_OK; ++#else ++ (void)if_name; ++ *result_p = 0; ++ return UCS_OK; ++#endif + } diff --git a/net/ucx/files/patch-test_apps_iodemo_io__demo.cc b/net/ucx/files/patch-test_apps_iodemo_io__demo.cc new file mode 100644 index 000000000000..26e653cc28f4 --- /dev/null +++ b/net/ucx/files/patch-test_apps_iodemo_io__demo.cc @@ -0,0 +1,23 @@ +--- test/apps/iodemo/io_demo.cc.orig 2026-02-04 09:52:46 UTC ++++ test/apps/iodemo/io_demo.cc +@@ -18,6 +18,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -2999,8 +3000,10 @@ static int do_client(options_t& test_opts) + LOG << "random seed: " << test_opts.random_seed; + + // randomize servers to optimize startup +- std::random_shuffle(test_opts.servers.begin(), test_opts.servers.end(), +- IoDemoRandom::urand); ++ { ++ std::mt19937 rng(static_cast(test_opts.random_seed)); ++ std::shuffle(test_opts.servers.begin(), test_opts.servers.end(), rng); ++ } + + UcxLog vlog(LOG_PREFIX, test_opts.verbose); + vlog << "List of servers:"; diff --git a/net/ucx/files/patch-test_apps_iodemo_ucx__wrapper.cc b/net/ucx/files/patch-test_apps_iodemo_ucx__wrapper.cc new file mode 100644 index 000000000000..f0896d68f7d1 --- /dev/null +++ b/net/ucx/files/patch-test_apps_iodemo_ucx__wrapper.cc @@ -0,0 +1,43 @@ +--- test/apps/iodemo/ucx_wrapper.cc.orig 2026-02-04 09:52:46 UTC ++++ test/apps/iodemo/ucx_wrapper.cc +@@ -118,10 +118,14 @@ UcxContext::UcxContext(size_t iomsg_size, double conne + _iomsg_buffer(iomsg_size), _connect_timeout(connect_timeout), + _use_am(use_am), _worker_fd(-1), _epoll_fd(-1), _client_id(client_id) + { ++#if defined(__linux__) + if (use_epoll) { + _epoll_fd = epoll_create(1); + assert(_epoll_fd >= 0); + } ++#else ++ (void)use_epoll; /* epoll is Linux-only */ ++#endif + } + + UcxContext::~UcxContext() +@@ -359,6 +363,7 @@ int UcxContext::is_timeout_elapsed(struct timeval cons + return ((elapsed.tv_sec + (elapsed.tv_usec * 1e-6)) > timeout); + } + ++#if defined(__linux__) + ucs_status_t UcxContext::epoll_init() + { + ucs_status_t status; +@@ -414,6 +419,17 @@ bool UcxContext::progress_worker_event() + assert(ev.data.fd == _worker_fd); + return false; + } ++#else ++ucs_status_t UcxContext::epoll_init() ++{ ++ return UCS_OK; ++} ++ ++bool UcxContext::progress_worker_event() ++{ ++ return ucp_worker_progress(_worker) != 0; ++} ++#endif + + void UcxContext::progress_timed_out_conns() + { diff --git a/net/ucx/files/patch-test_apps_iodemo_ucx__wrapper.h b/net/ucx/files/patch-test_apps_iodemo_ucx__wrapper.h new file mode 100644 index 000000000000..57ff62356e5d --- /dev/null +++ b/net/ucx/files/patch-test_apps_iodemo_ucx__wrapper.h @@ -0,0 +1,14 @@ +--- test/apps/iodemo/ucx_wrapper.h.orig 2026-02-04 09:52:46 UTC ++++ test/apps/iodemo/ucx_wrapper.h +@@ -22,7 +22,11 @@ + #include + #include + #include ++#if defined(__linux__) + #include ++#else ++/* FreeBSD: no epoll; iodemo must build without epoll support */ ++#endif + + #define MAX_LOG_PREFIX_SIZE 64 + diff --git a/net/ucx/files/patch-test_gtest_common_test__helpers.cc b/net/ucx/files/patch-test_gtest_common_test__helpers.cc new file mode 100644 index 000000000000..e371b490b40b --- /dev/null +++ b/net/ucx/files/patch-test_gtest_common_test__helpers.cc @@ -0,0 +1,13 @@ +--- test/gtest/common/test_helpers.cc.orig 2026-02-04 09:52:46 UTC ++++ test/gtest/common/test_helpers.cc +@@ -13,6 +13,10 @@ + #include + #include + ++#include ++#include ++#include ++ + #include + + extern "C" { diff --git a/net/ucx/files/patch-test_gtest_common_test__watchdog.cc b/net/ucx/files/patch-test_gtest_common_test__watchdog.cc new file mode 100644 index 000000000000..c4e6112ad13d --- /dev/null +++ b/net/ucx/files/patch-test_gtest_common_test__watchdog.cc @@ -0,0 +1,10 @@ +--- test/gtest/common/test_watchdog.cc.orig 2026-02-04 09:52:46 UTC ++++ test/gtest/common/test_watchdog.cc +@@ -9,6 +9,7 @@ + #endif + + #include ++#include + + class test_watchdog : public ucs::test { + public: diff --git a/net/ucx/files/patch-test_gtest_ucs_test__debug.cc b/net/ucx/files/patch-test_gtest_ucs_test__debug.cc new file mode 100644 index 000000000000..45d9f13aff89 --- /dev/null +++ b/net/ucx/files/patch-test_gtest_ucs_test__debug.cc @@ -0,0 +1,22 @@ +--- test/gtest/ucs/test_debug.cc.orig 2026-02-04 09:52:47 UTC ++++ test/gtest/ucs/test_debug.cc +@@ -11,6 +11,7 @@ extern "C" { + #include + } + ++#include + #include + + extern "C" { +@@ -24,7 +25,10 @@ std::string __basename(const std::string& path) { + + std::string __basename(const std::string& path) { + char *p = strdup(path.c_str()); +- std::string bn(::basename(p)); ++ /* basename() may modify its argument on some platforms */ ++ char *path = strdup(p); ++ std::string bn(::basename(path)); ++ free(path); + free(p); + return bn; + } diff --git a/net/ucx/files/patch-test_gtest_uct_uct__test.cc b/net/ucx/files/patch-test_gtest_uct_uct__test.cc new file mode 100644 index 000000000000..e27d655d7fdb --- /dev/null +++ b/net/ucx/files/patch-test_gtest_uct_uct__test.cc @@ -0,0 +1,28 @@ +--- test/gtest/uct/uct_test.cc.orig 2026-02-04 09:52:47 UTC ++++ test/gtest/uct/uct_test.cc +@@ -12,6 +12,7 @@ + #include + #include + #include ++#include + #include + #ifdef HAVE_MALLOC_H + #include +@@ -31,7 +32,7 @@ resource::resource() : component(NULL), dev_type(UCT_D + sys_device(UCS_SYS_DEVICE_ID_UNKNOWN), + variant(DEFAULT_VARIANT) + { +- CPU_ZERO(&local_cpus); ++ UCS_CPU_ZERO(&local_cpus); + } + + resource::resource(uct_component_h component, const std::string& component_name, +@@ -385,7 +386,7 @@ void uct_test::set_cm_resources(std::vector& + + if (component_attr.flags & UCT_COMPONENT_FLAG_CM) { + ucs_cpu_set_t local_cpus; +- CPU_ZERO(&local_cpus); ++ UCS_CPU_ZERO(&local_cpus); + uct_test::set_cm_sockaddr_resources(uct_components[cmpt_index], + component_attr.name, local_cpus, + all_resources); diff --git a/net/ucx/pkg-descr b/net/ucx/pkg-descr new file mode 100644 index 000000000000..93c1b50f15ad --- /dev/null +++ b/net/ucx/pkg-descr @@ -0,0 +1,10 @@ +UCX (Unified Communication X) is a high-performance communication framework +for modern HPC and data-intensive workloads. It provides low-latency, +high-bandwidth messaging and remote-memory-access primitives across a wide +range of transports, including shared memory, TCP/IP, and RDMA-capable +interconnects such as InfiniBand and RoCE (when supported by the platform). + +UCX is commonly used as a communication substrate for MPI, OpenSHMEM, and +other distributed runtimes. It exposes a set of layered APIs (UCP/UCT/UCS/UCM) +to balance portability and performance while enabling optimized transport +selection, rendezvous protocols, and progress models. diff --git a/net/ucx/pkg-plist b/net/ucx/pkg-plist new file mode 100644 index 000000000000..11e50f7e2d4e --- /dev/null +++ b/net/ucx/pkg-plist @@ -0,0 +1,144 @@ +%%IODEMO%%bin/io_demo +bin/ucx_info +%%PERFTEST%%bin/ucx_perftest +%%PERFTEST%%bin/ucx_perftest_daemon +bin/ucx_read_profile +@sample %%ETCDIR%%/ucx.conf.sample +include/ucm/api/ucm.h +include/ucp/api/ucp.h +include/ucp/api/ucp_compat.h +include/ucp/api/ucp_def.h +include/ucp/api/ucp_version.h +include/ucp/api/device/ucp_device_impl.h +include/ucp/api/device/ucp_device_types.h +include/ucp/api/device/ucp_host.h +include/ucs/sys/device_code.h +include/uct/api/device/uct_device_impl.h +include/uct/api/device/uct_device_types.h +include/ucs/algorithm/crc.h +include/ucs/algorithm/qsort_r.h +include/ucs/algorithm/string_distance.h +include/ucs/arch/aarch64/bitops.h +include/ucs/arch/aarch64/global_opts.h +include/ucs/arch/atomic.h +include/ucs/arch/bitops.h +include/ucs/arch/generic/atomic.h +include/ucs/arch/global_opts.h +include/ucs/arch/ppc64/bitops.h +include/ucs/arch/ppc64/global_opts.h +include/ucs/arch/rv64/bitops.h +include/ucs/arch/rv64/global_opts.h +include/ucs/arch/x86_64/atomic.h +include/ucs/arch/x86_64/bitops.h +include/ucs/arch/x86_64/global_opts.h +include/ucs/async/async_fwd.h +include/ucs/config/global_opts.h +include/ucs/config/ini.h +include/ucs/config/parser.h +include/ucs/config/types.h +include/ucs/datastruct/array.h +include/ucs/datastruct/callbackq.h +include/ucs/datastruct/callbackq_compat.h +include/ucs/datastruct/hlist.h +include/ucs/datastruct/khash.h +include/ucs/datastruct/linear_func.h +include/ucs/datastruct/list.h +include/ucs/datastruct/mpool.h +include/ucs/datastruct/mpool_set.h +include/ucs/datastruct/pgtable.h +include/ucs/datastruct/piecewise_func.h +include/ucs/datastruct/queue_types.h +include/ucs/datastruct/strided_alloc.h +include/ucs/datastruct/string_buffer.h +include/ucs/datastruct/string_set.h +include/ucs/debug/debug.h +include/ucs/debug/log_def.h +include/ucs/debug/memtrack.h +include/ucs/memory/memory_type.h +include/ucs/memory/memtype_cache.h +include/ucs/memory/numa.h +include/ucs/memory/rcache.h +include/ucs/profile/profile_defs.h +include/ucs/profile/profile_off.h +include/ucs/profile/profile_on.h +include/ucs/stats/libstats.h +include/ucs/stats/stats_fwd.h +include/ucs/sys/compiler_def.h +include/ucs/sys/event_set.h +include/ucs/sys/math.h +include/ucs/sys/preprocessor.h +include/ucs/sys/sock.h +include/ucs/sys/string.h +include/ucs/sys/stubs.h +include/ucs/sys/topo/base/topo.h +include/ucs/sys/uid.h +include/ucs/time/time_def.h +include/ucs/type/class.h +include/ucs/type/cpu_set.h +include/ucs/type/init_once.h +include/ucs/type/param.h +include/ucs/type/spinlock.h +include/ucs/type/status.h +include/ucs/type/thread_mode.h +include/ucs/vfs/base/vfs_cb.h +include/ucs/vfs/base/vfs_obj.h +include/uct/api/tl.h +include/uct/api/uct.h +include/uct/api/uct_def.h +include/uct/api/version.h +lib/cmake/ucx/ucx-config-version.cmake +lib/cmake/ucx/ucx-config.cmake +lib/cmake/ucx/ucx-targets.cmake +lib/libucm.a +lib/libucm.so +lib/libucm.so.0 +lib/libucm.so.0.0.0 +lib/libucp.a +lib/libucp.so +lib/libucp.so.0 +lib/libucp.so.0.0.0 +lib/libucs.a +lib/libucs.so +lib/libucs.so.0 +lib/libucs.so.0.0.0 +lib/libucs_signal.a +lib/libucs_signal.so +lib/libucs_signal.so.0 +lib/libucs_signal.so.0.0.0 +lib/libuct.a +lib/libuct.so +lib/libuct.so.0 +lib/libuct.so.0.0.0 +%%IBVERBS%%lib/ucx/libuct_ib.a +%%IBVERBS%%lib/ucx/libuct_ib.so +%%IBVERBS%%lib/ucx/libuct_ib.so.0 +%%IBVERBS%%lib/ucx/libuct_ib.so.0.0.0 +%%UMAD%%lib/ucx/libucx_perftest_mad.a +%%UMAD%%lib/ucx/libucx_perftest_mad.so +%%UMAD%%lib/ucx/libucx_perftest_mad.so.0 +%%UMAD%%lib/ucx/libucx_perftest_mad.so.0.0.0 +%%IBVERBS%%libdata/pkgconfig/ucx-ib.pc +libdata/pkgconfig/ucx-ucs.pc +libdata/pkgconfig/ucx-uct.pc +libdata/pkgconfig/ucx.pc +%%EXAMPLES%%%%DATADIR%%/examples/hello_world_util.h +%%EXAMPLES%%%%DATADIR%%/examples/ucp_client_server.c +%%EXAMPLES%%%%DATADIR%%/examples/ucp_hello_world.c +%%EXAMPLES%%%%DATADIR%%/examples/ucp_util.h +%%EXAMPLES%%%%DATADIR%%/examples/uct_hello_world.c +%%PERFTEST%%%%DATADIR%%/perftest/README +%%PERFTEST%%%%DATADIR%%/perftest/msg_pow2 +%%PERFTEST%%%%DATADIR%%/perftest/msg_pow2_large +%%PERFTEST%%%%DATADIR%%/perftest/test_types_ucp +%%PERFTEST%%%%DATADIR%%/perftest/test_types_ucp_amo +%%PERFTEST%%%%DATADIR%%/perftest/test_types_ucp_daemon +%%PERFTEST%%%%DATADIR%%/perftest/test_types_ucp_rma +%%PERFTEST%%%%DATADIR%%/perftest/test_types_uct +%%PERFTEST%%%%DATADIR%%/perftest/transports +%%PERFTEST%%%%DATADIR%%/perftest/test_types_ucp_device_cuda +%%FUSE%%bin/ucx_vfs +%%FUSE%%lib/ucx/libucs_fuse.a +%%FUSE%%lib/ucx/libucs_fuse.so +%%FUSE%%lib/ucx/libucs_fuse.so.0 +%%FUSE%%lib/ucx/libucs_fuse.so.0.0.0 +%%FUSE%%libdata/pkgconfig/ucx-fuse.pc