Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 55 additions & 1 deletion Examples/nltool/main.swift
Original file line number Diff line number Diff line change
Expand Up @@ -41,20 +41,32 @@ enum Command: CaseIterable {
case del_pcp_prio
case show_pcp_prio
case show_mqprio
case genl_family
case ethtool_pause

var needsArg: Bool {
switch self {
case .show_vlan, .show_pvid, .show_fdb, .show_mdb, .show_pcp_prio, .show_mqprio: false
case .genl_family, .ethtool_pause: false
default: true
}
}

/// generic netlink commands operate on their own NETLINK_GENERIC socket and
/// take a bare family/interface name rather than an rtnetlink link.
var isGenericNetlink: Bool {
switch self {
case .genl_family, .ethtool_pause: true
default: false
}
}
}

typealias CommandHandler = (Command, NLSocket, RTNLLink, String) async throws -> ()

func usage() -> Never {
print(
"Usage: \(CommandLine.arguments[0]) [add_vlan|del_vlan|show_vlan|show_pvid|add_fdb|del_fdb|show_fdb|add_mdb|add_srp_mdb|del_mdb|show_mdb|add_mqprio|del_mqprio|show_mqprio|add_cbs|del_cbs|add_pcp_prio|del_pcp_prio|show_pcp_prio] [ifname] [vid|mac-address|parent:handle|pcp:priority[,pcp:priority...]]"
"Usage: \(CommandLine.arguments[0]) [add_vlan|del_vlan|show_vlan|show_pvid|add_fdb|del_fdb|show_fdb|add_mdb|add_srp_mdb|del_mdb|show_mdb|add_mqprio|del_mqprio|show_mqprio|add_cbs|del_cbs|add_pcp_prio|del_pcp_prio|show_pcp_prio|genl_family|ethtool_pause] [ifname|genl-family] [vid|mac-address|parent:handle|pcp:priority[,pcp:priority...]]"
)
exit(1)
}
Expand Down Expand Up @@ -461,6 +473,31 @@ func show_mqprio(
if !any { print(" (no MQPRIO qdisc on \(link.name))") }
}

func genl_family(name: String) async throws {
let socket = try GENLSocket()
let family = try await socket.resolveFamily(name: name)
print(
"genl family \(family.name) id \(family.id) version \(family.version.map(String.init) ?? "?")"
)
if family.multicastGroups.isEmpty {
print(" (no multicast groups)")
} else {
for group in family.multicastGroups.sorted(by: { $0.id < $1.id }) {
print(" mcast-group \(group.name) id \(group.id)")
}
}
}

func ethtool_pause(interfaceName: String) async throws {
let socket = try GENLSocket()
let pause = try await socket.ethtoolPauseParameters(interfaceName: interfaceName)
func fmt(_ value: Bool?) -> String { value.map { $0 ? "on" : "off" } ?? "n/a" }
print("ethtool pause parameters for \(interfaceName):")
print(" autoneg \(fmt(pause.autoneg))")
print(" rx \(fmt(pause.rx))")
print(" tx \(fmt(pause.tx))")
}

@MainActor
private var gSocket: NLSocket!

Expand All @@ -481,6 +518,23 @@ enum nltool {
usage()
}

if command.isGenericNetlink {
do {
switch command {
case .genl_family:
try await genl_family(name: CommandLine.arguments[2])
case .ethtool_pause:
try await ethtool_pause(interfaceName: CommandLine.arguments[2])
default:
usage()
}
} catch {
print("failed to \(command): \(error)")
exit(3)
}
return
}

do {
let socket = try NLSocket(protocol: NETLINK_ROUTE)
gSocket = socket
Expand Down
5 changes: 3 additions & 2 deletions Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ PlatformLinkerSettings += [
.linkedLibrary("nl-3"),
.linkedLibrary("nl-route-3"),
.linkedLibrary("nl-nf-3"),
.linkedLibrary("nl-genl-3"),
]

let package = Package(
Expand Down Expand Up @@ -49,9 +50,9 @@ let package = Package(
targets: [
.systemLibrary(
name: "CNetLink",
pkgConfig: "libnl-3 libnl-route-3 libnl-nf-3",
pkgConfig: "libnl-3 libnl-route-3 libnl-nf-3 libnl-genl-3",
providers: [
.apt(["libnl-3-dev", "libnl-route-3-dev", "libnl-nf-3-dev"]),
.apt(["libnl-3-dev", "libnl-route-3-dev", "libnl-nf-3-dev", "libnl-genl-3-dev"]),
]
),
.target(
Expand Down
6 changes: 6 additions & 0 deletions Sources/CNetLink/include/CNetLink.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
#include <netinet/in.h>

#include <linux/ethtool.h>
#include <linux/ethtool_netlink.h>
#include <linux/genetlink.h>
#include <linux/in6.h>
#include <linux/filter.h>
#include <linux/sockios.h>
Expand Down Expand Up @@ -40,5 +42,9 @@
#include <netlink/netfilter/log.h>
#include <netlink/netfilter/log_msg.h>

#include <netlink/genl/genl.h>
#include <netlink/genl/ctrl.h>
#include <netlink/genl/mngt.h>

int rtnl_tc_msg_build(struct rtnl_tc *tc, int type, int flags,
struct nl_msg **result);
Loading
Loading