Smdn.Net.AddressResolution version 1.0.0-preview6
Pre-release
Pre-release
·
166 commits
to main
since this release
Released package
Release notes
The full release notes are available at gist.
Change log
Change log in this release:
- 2023-03-30 seal concrete classes
- 2023-03-30 update package version
- 2023-03-30 suppress warning IDE0060
- 2023-03-30 make NeighborMacAddressResolver the default implementation
- 2023-03-30 introduce IPNetworkProfile and replace MacAddressResolverOptions with it
- 2023-03-30 rename file for the class RunCommandNeighborDiscovererBase
- 2023-03-30 add IpHlpApiNeighborDiscoverer
- 2023-03-30 add IpHlpApiNeighborTable
- 2023-03-30 reimplement resolvers using INeighborTable and rename to NeighborMacAddressResolver
- 2023-03-30 reimplement resolvers using INeighborDiscoverer
- 2023-03-30 add abstract API for neighbor discovery
- 2023-03-30 reimplement resolvers using INeighborCache
- 2023-03-30 add abstract API for neighbor cache tables
- 2023-03-30 add PhysicalAddressExtensions.AllZeroMacAddress
- 2023-03-27 handle Timeout.InfiniteTimeSpan as infinite interval value
- 2023-03-27 refer Microsoft.Extensions.Logging.Abstractions instead
- 2023-03-25 remove suppressing warning SA1305
- 2023-03-25 remove redundant accessibility modifiers
API changes
API changes in this release:
diff --git a/doc/api-list/Smdn.Net.AddressResolution/Smdn.Net.AddressResolution-net6.0.apilist.cs b/doc/api-list/Smdn.Net.AddressResolution/Smdn.Net.AddressResolution-net6.0.apilist.cs
index 235f0f0..5cc70d9 100644
--- a/doc/api-list/Smdn.Net.AddressResolution/Smdn.Net.AddressResolution-net6.0.apilist.cs
+++ b/doc/api-list/Smdn.Net.AddressResolution/Smdn.Net.AddressResolution-net6.0.apilist.cs
@@ -1,92 +1,217 @@
-// Smdn.Net.AddressResolution.dll (Smdn.Net.AddressResolution-1.0.0-preview5)
+// Smdn.Net.AddressResolution.dll (Smdn.Net.AddressResolution-1.0.0-preview6)
// Name: Smdn.Net.AddressResolution
// AssemblyVersion: 1.0.0.0
-// InformationalVersion: 1.0.0-preview5+fe261fa7dd16c43347c28935b3055ec3b8ab0674
+// InformationalVersion: 1.0.0-preview6+867630e3d8768ccca99d991e9c0c1cca62c64c76
// TargetFramework: .NETCoreApp,Version=v6.0
// Configuration: Release
// Referenced assemblies:
// Microsoft.Extensions.DependencyInjection.Abstractions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
// Microsoft.Extensions.Logging.Abstractions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
// System.Collections.Concurrent, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// System.ComponentModel, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// System.Diagnostics.Process, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// System.Linq, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// System.Memory, Version=6.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
// System.Net.NetworkInformation, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// System.Net.Primitives, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// System.Runtime, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+// System.Runtime.InteropServices, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// System.Runtime.InteropServices.RuntimeInformation, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// System.Threading, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+// Vanara.Core, Version=3.4.13.0, Culture=neutral, PublicKeyToken=c37e4080322237fa
+// Vanara.PInvoke.IpHlpApi, Version=3.4.13.0, Culture=neutral, PublicKeyToken=c37e4080322237fa
+// Vanara.PInvoke.Shared, Version=3.4.13.0, Culture=neutral, PublicKeyToken=c37e4080322237fa
+// Vanara.PInvoke.Ws2_32, Version=3.4.13.0, Culture=neutral, PublicKeyToken=c37e4080322237fa
#nullable enable annotations
using System;
+using System.Collections.Generic;
using System.Net;
using System.Net.NetworkInformation;
+using System.Runtime.CompilerServices;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
+using Smdn.Net;
using Smdn.Net.AddressResolution;
+using Smdn.Net.NeighborDiscovery;
namespace Smdn.Net {
+ public abstract class IPNetworkProfile {
+ public static IPNetworkProfile Create() {}
+ public static IPNetworkProfile Create(Func<IEnumerable<IPAddress>?> addressRangeGenerator, NetworkInterface? networkInterface = null) {}
+ public static IPNetworkProfile Create(IPAddress baseAddress, IPAddress subnetMask, NetworkInterface? networkInterface = null) {}
+ public static IPNetworkProfile Create(IPAddress baseAddress, int prefixLength, NetworkInterface? networkInterface = null) {}
+ public static IPNetworkProfile Create(NetworkInterface networkInterface) {}
+ public static IPNetworkProfile Create(Predicate<NetworkInterface> predicate) {}
+
+ protected IPNetworkProfile(NetworkInterface? networkInterface) {}
+
+ public NetworkInterface? NetworkInterface { get; }
+
+ public abstract IEnumerable<IPAddress>? GetAddressRange();
+ }
+
public static class PhysicalAddressExtensions {
public static string ToMacAddressString(this PhysicalAddress hardwareAddress, char delimiter = ':') {}
}
}
namespace Smdn.Net.AddressResolution {
public interface IAddressResolver<TAddress, TResolvedAddress> {
void Invalidate(TAddress address);
ValueTask<TResolvedAddress> ResolveAsync(TAddress address, CancellationToken cancellationToken);
}
- public abstract class MacAddressResolver :
+ public class MacAddressResolver : MacAddressResolverBase {
+ protected MacAddressResolver(INeighborTable neighborTable, INeighborDiscoverer neighborDiscoverer, TimeSpan neighborDiscoveryInterval, ILogger? logger) {}
+ public MacAddressResolver(INeighborTable? neighborTable = null, INeighborDiscoverer? neighborDiscoverer = null, int neighborDiscoveryIntervalMilliseconds = -1, IServiceProvider? serviceProvider = null) {}
+ public MacAddressResolver(IPNetworkProfile? networkProfile, IServiceProvider? serviceProvider = null) {}
+ public MacAddressResolver(IPNetworkProfile? networkProfile, TimeSpan neighborDiscoveryInterval, IServiceProvider? serviceProvider = null) {}
+ public MacAddressResolver(TimeSpan neighborDiscoveryInterval, INeighborTable? neighborTable = null, INeighborDiscoverer? neighborDiscoverer = null, IServiceProvider? serviceProvider = null) {}
+
+ public override bool HasInvalidated { get; }
+
+ protected override void Dispose(bool disposing) {}
+ protected override void InvalidateCore(IPAddress ipAddress) {}
+ protected override void InvalidateCore(PhysicalAddress macAddress) {}
+ protected override ValueTask RefreshCacheAsyncCore(CancellationToken cancellationToken = default) {}
+ protected override ValueTask RefreshInvalidatedCacheAsyncCore(CancellationToken cancellationToken = default) {}
+ protected override async ValueTask<PhysicalAddress?> ResolveIPAddressToMacAddressAsyncCore(IPAddress ipAddress, CancellationToken cancellationToken) {}
+ protected override async ValueTask<IPAddress?> ResolveMacAddressToIPAddressAsyncCore(PhysicalAddress macAddress, CancellationToken cancellationToken) {}
+ }
+
+ public abstract class MacAddressResolverBase :
IAddressResolver<IPAddress, PhysicalAddress>,
IAddressResolver<PhysicalAddress, IPAddress>,
IDisposable
{
- protected static readonly PhysicalAddress AllZeroMacAddress; // = "000000000000"
+ protected static PhysicalAddress AllZeroMacAddress { get; }
+ public static MacAddressResolverBase Null { get; }
- public static MacAddressResolver Null { get; }
-
- public static MacAddressResolver Create(MacAddressResolverOptions? options = null, IServiceProvider? serviceProvider = null) {}
-
- protected MacAddressResolver(ILogger? logger = null) {}
+ protected MacAddressResolverBase(ILogger? logger = null) {}
public abstract bool HasInvalidated { get; }
protected ILogger? Logger { get; }
protected virtual void Dispose(bool disposing) {}
public void Dispose() {}
public void Invalidate(IPAddress ipAddress) {}
public void Invalidate(PhysicalAddress macAddress) {}
protected abstract void InvalidateCore(IPAddress ipAddress);
protected abstract void InvalidateCore(PhysicalAddress macAddress);
public ValueTask RefreshCacheAsync(CancellationToken cancellationToken = default) {}
protected virtual ValueTask RefreshCacheAsyncCore(CancellationToken cancellationToken) {}
public ValueTask RefreshInvalidatedCacheAsync(CancellationToken cancellationToken = default) {}
protected virtual ValueTask RefreshInvalidatedCacheAsyncCore(CancellationToken cancellationToken) {}
public ValueTask<PhysicalAddress?> ResolveIPAddressToMacAddressAsync(IPAddress ipAddress, CancellationToken cancellationToken = default) {}
protected abstract ValueTask<PhysicalAddress?> ResolveIPAddressToMacAddressAsyncCore(IPAddress ipAddress, CancellationToken cancellationToken);
public ValueTask<IPAddress?> ResolveMacAddressToIPAddressAsync(PhysicalAddress macAddress, CancellationToken cancellationToken = default) {}
protected abstract ValueTask<IPAddress?> ResolveMacAddressToIPAddressAsyncCore(PhysicalAddress macAddress, CancellationToken cancellationToken);
void IAddressResolver<IPAddress, PhysicalAddress>.Invalidate(IPAddress address) {}
ValueTask<PhysicalAddress?> IAddressResolver<IPAddress, PhysicalAddress>.ResolveAsync(IPAddress address, CancellationToken cancellationToken) {}
void IAddressResolver<PhysicalAddress, IPAddress>.Invalidate(PhysicalAddress address) {}
ValueTask<IPAddress?> IAddressResolver<PhysicalAddress, IPAddress>.ResolveAsync(PhysicalAddress address, CancellationToken cancellationToken) {}
protected void ThrowIfDisposed() {}
}
+}
+
+namespace Smdn.Net.NeighborDiscovery {
+ public interface INeighborDiscoverer {
+ ValueTask DiscoverAsync(CancellationToken cancellationToken);
+ ValueTask DiscoverAsync(IEnumerable<IPAddress> addresses, CancellationToken cancellationToken);
+ }
+
+ public interface INeighborTable {
+ IAsyncEnumerable<NeighborTableEntry> EnumerateEntriesAsync(CancellationToken cancellationToken);
+ }
+
+ public enum NeighborTableEntryState : int {
+ Delay = 4,
+ Incomplete = 1,
+ None = 0,
+ Probe = 5,
+ Reachable = 2,
+ Stale = 3,
+ }
+
+ public sealed class ArpScanCommandNeighborDiscoverer : RunCommandNeighborDiscovererBase {
+ public static bool IsSupported { get; }
+
+ public ArpScanCommandNeighborDiscoverer(IPNetworkProfile? networkProfile, IServiceProvider? serviceProvider) {}
+
+ protected override bool GetCommandLineArguments(IEnumerable<IPAddress> addressesToDiscover, out string executable, out string arguments) {}
+ protected override bool GetCommandLineArguments(out string executable, out string arguments) {}
+ }
+
+ public sealed class IpHlpApiNeighborDiscoverer : INeighborDiscoverer {
+ public IpHlpApiNeighborDiscoverer(IPNetworkProfile networkProfile, ILogger? logger = null) {}
- public sealed class MacAddressResolverOptions {
- public static readonly MacAddressResolverOptions Default; // = "Smdn.Net.AddressResolution.MacAddressResolverOptions"
+ public ValueTask DiscoverAsync(CancellationToken cancellationToken = default) {}
+ public async ValueTask DiscoverAsync(IEnumerable<IPAddress> addresses, CancellationToken cancellationToken = default) {}
+ }
+
+ public sealed class IpHlpApiNeighborTable : INeighborTable {
+ public static bool IsSupported { get; }
+
+ public IpHlpApiNeighborTable(IServiceProvider? serviceProvider = null) {}
+
+ [AsyncIteratorStateMachine(typeof(IpHlpApiNeighborTable.<EnumerateEntriesAsync>d__5))]
+ public IAsyncEnumerable<NeighborTableEntry> EnumerateEntriesAsync([EnumeratorCancellation] CancellationToken cancellationToken = default) {}
+ }
+
+ public sealed class NmapCommandNeighborDiscoverer : RunCommandNeighborDiscovererBase {
+ public static bool IsSupported { get; }
+
+ public NmapCommandNeighborDiscoverer(IPNetworkProfile networkProfile, IServiceProvider? serviceProvider) {}
+
+ protected override bool GetCommandLineArguments(IEnumerable<IPAddress> addressesToDiscover, out string executable, out string arguments) {}
+ protected override bool GetCommandLineArguments(out string executable, out string arguments) {}
+ }
+
+ public sealed class NullNeighborDiscoverer : INeighborDiscoverer {
+ public static readonly NullNeighborDiscoverer Instance; // = "Smdn.Net.NeighborDiscovery.NullNeighborDiscoverer"
+
+ public ValueTask DiscoverAsync(CancellationToken cancellationToken) {}
+ public ValueTask DiscoverAsync(IEnumerable<IPAddress> addresses, CancellationToken cancellationToken) {}
+ }
+
+ public sealed class ProcfsArpNeighborTable : INeighborTable {
+ public static bool IsSupported { get; }
+
+ public ProcfsArpNeighborTable(IServiceProvider? serviceProvider = null) {}
+
+ [AsyncIteratorStateMachine(typeof(ProcfsArpNeighborTable.<EnumerateEntriesAsync>d__6))]
+ public IAsyncEnumerable<NeighborTableEntry> EnumerateEntriesAsync([EnumeratorCancellation] CancellationToken cancellationToken = default) {}
+ }
+
+ public abstract class RunCommandNeighborDiscovererBase : INeighborDiscoverer {
+ protected static string FindPathToCommand(string command, IEnumerable<string> paths) {}
+
+ protected RunCommandNeighborDiscovererBase(ILogger? logger) {}
+
+ public virtual ValueTask DiscoverAsync(CancellationToken cancellationToken) {}
+ public virtual ValueTask DiscoverAsync(IEnumerable<IPAddress> addresses, CancellationToken cancellationToken) {}
+ protected abstract bool GetCommandLineArguments(IEnumerable<IPAddress> addressesToDiscover, out string executable, out string arguments);
+ protected abstract bool GetCommandLineArguments(out string executable, out string arguments);
+ }
+
+ public readonly struct NeighborTableEntry :
+ IEquatable<IPAddress>,
+ IEquatable<PhysicalAddress>
+ {
+ public NeighborTableEntry(IPAddress ipAddress, PhysicalAddress? physicalAddress, bool isPermanent, NeighborTableEntryState state, int? interfaceIndex = null, string? interfaceName = null) {}
- public MacAddressResolverOptions() {}
+ public IPAddress IPAddress { get; }
+ public int? InterfaceIndex { get; }
+ public string? InterfaceName { get; }
+ public bool IsPermanent { get; }
+ public PhysicalAddress? PhysicalAddress { get; }
+ public NeighborTableEntryState State { get; }
- public string? ArpScanCommandInterfaceSpecification { get; init; }
- public string? ArpScanCommandTargetSpecification { get; init; }
- public string? NmapCommandInterfaceSpecification { get; init; }
- public string? NmapCommandTargetSpecification { get; init; }
- public TimeSpan ProcfsArpFullScanInterval { get; init; }
+ public bool Equals(IPAddress? other) {}
+ public bool Equals(PhysicalAddress? other) {}
}
}
// API list generated by Smdn.Reflection.ReverseGenerating.ListApi.MSBuild.Tasks v1.2.1.0.
// Smdn.Reflection.ReverseGenerating.ListApi.Core v1.2.0.0 (https://github.com/smdn/Smdn.Reflection.ReverseGenerating)
diff --git a/doc/api-list/Smdn.Net.AddressResolution/Smdn.Net.AddressResolution-net7.0.apilist.cs b/doc/api-list/Smdn.Net.AddressResolution/Smdn.Net.AddressResolution-net7.0.apilist.cs
index d9d912b..5fcb493 100644
--- a/doc/api-list/Smdn.Net.AddressResolution/Smdn.Net.AddressResolution-net7.0.apilist.cs
+++ b/doc/api-list/Smdn.Net.AddressResolution/Smdn.Net.AddressResolution-net7.0.apilist.cs
@@ -1,91 +1,216 @@
-// Smdn.Net.AddressResolution.dll (Smdn.Net.AddressResolution-1.0.0-preview5)
+// Smdn.Net.AddressResolution.dll (Smdn.Net.AddressResolution-1.0.0-preview6)
// Name: Smdn.Net.AddressResolution
// AssemblyVersion: 1.0.0.0
-// InformationalVersion: 1.0.0-preview5+fe261fa7dd16c43347c28935b3055ec3b8ab0674
+// InformationalVersion: 1.0.0-preview6+867630e3d8768ccca99d991e9c0c1cca62c64c76
// TargetFramework: .NETCoreApp,Version=v7.0
// Configuration: Release
// Referenced assemblies:
// Microsoft.Extensions.DependencyInjection.Abstractions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
// Microsoft.Extensions.Logging.Abstractions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
// System.Collections.Concurrent, Version=7.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// System.ComponentModel, Version=7.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// System.Diagnostics.Process, Version=7.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// System.Linq, Version=7.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// System.Memory, Version=7.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
// System.Net.NetworkInformation, Version=7.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// System.Net.Primitives, Version=7.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// System.Runtime, Version=7.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+// System.Runtime.InteropServices, Version=7.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// System.Threading, Version=7.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+// Vanara.Core, Version=3.4.13.0, Culture=neutral, PublicKeyToken=c37e4080322237fa
+// Vanara.PInvoke.IpHlpApi, Version=3.4.13.0, Culture=neutral, PublicKeyToken=c37e4080322237fa
+// Vanara.PInvoke.Shared, Version=3.4.13.0, Culture=neutral, PublicKeyToken=c37e4080322237fa
+// Vanara.PInvoke.Ws2_32, Version=3.4.13.0, Culture=neutral, PublicKeyToken=c37e4080322237fa
#nullable enable annotations
using System;
+using System.Collections.Generic;
using System.Net;
using System.Net.NetworkInformation;
+using System.Runtime.CompilerServices;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
+using Smdn.Net;
using Smdn.Net.AddressResolution;
+using Smdn.Net.NeighborDiscovery;
namespace Smdn.Net {
+ public abstract class IPNetworkProfile {
+ public static IPNetworkProfile Create() {}
+ public static IPNetworkProfile Create(Func<IEnumerable<IPAddress>?> addressRangeGenerator, NetworkInterface? networkInterface = null) {}
+ public static IPNetworkProfile Create(IPAddress baseAddress, IPAddress subnetMask, NetworkInterface? networkInterface = null) {}
+ public static IPNetworkProfile Create(IPAddress baseAddress, int prefixLength, NetworkInterface? networkInterface = null) {}
+ public static IPNetworkProfile Create(NetworkInterface networkInterface) {}
+ public static IPNetworkProfile Create(Predicate<NetworkInterface> predicate) {}
+
+ protected IPNetworkProfile(NetworkInterface? networkInterface) {}
+
+ public NetworkInterface? NetworkInterface { get; }
+
+ public abstract IEnumerable<IPAddress>? GetAddressRange();
+ }
+
public static class PhysicalAddressExtensions {
public static string ToMacAddressString(this PhysicalAddress hardwareAddress, char delimiter = ':') {}
}
}
namespace Smdn.Net.AddressResolution {
public interface IAddressResolver<TAddress, TResolvedAddress> {
void Invalidate(TAddress address);
ValueTask<TResolvedAddress> ResolveAsync(TAddress address, CancellationToken cancellationToken);
}
- public abstract class MacAddressResolver :
+ public class MacAddressResolver : MacAddressResolverBase {
+ protected MacAddressResolver(INeighborTable neighborTable, INeighborDiscoverer neighborDiscoverer, TimeSpan neighborDiscoveryInterval, ILogger? logger) {}
+ public MacAddressResolver(INeighborTable? neighborTable = null, INeighborDiscoverer? neighborDiscoverer = null, int neighborDiscoveryIntervalMilliseconds = -1, IServiceProvider? serviceProvider = null) {}
+ public MacAddressResolver(IPNetworkProfile? networkProfile, IServiceProvider? serviceProvider = null) {}
+ public MacAddressResolver(IPNetworkProfile? networkProfile, TimeSpan neighborDiscoveryInterval, IServiceProvider? serviceProvider = null) {}
+ public MacAddressResolver(TimeSpan neighborDiscoveryInterval, INeighborTable? neighborTable = null, INeighborDiscoverer? neighborDiscoverer = null, IServiceProvider? serviceProvider = null) {}
+
+ public override bool HasInvalidated { get; }
+
+ protected override void Dispose(bool disposing) {}
+ protected override void InvalidateCore(IPAddress ipAddress) {}
+ protected override void InvalidateCore(PhysicalAddress macAddress) {}
+ protected override ValueTask RefreshCacheAsyncCore(CancellationToken cancellationToken = default) {}
+ protected override ValueTask RefreshInvalidatedCacheAsyncCore(CancellationToken cancellationToken = default) {}
+ protected override async ValueTask<PhysicalAddress?> ResolveIPAddressToMacAddressAsyncCore(IPAddress ipAddress, CancellationToken cancellationToken) {}
+ protected override async ValueTask<IPAddress?> ResolveMacAddressToIPAddressAsyncCore(PhysicalAddress macAddress, CancellationToken cancellationToken) {}
+ }
+
+ public abstract class MacAddressResolverBase :
IAddressResolver<IPAddress, PhysicalAddress>,
IAddressResolver<PhysicalAddress, IPAddress>,
IDisposable
{
- protected static readonly PhysicalAddress AllZeroMacAddress; // = "000000000000"
+ protected static PhysicalAddress AllZeroMacAddress { get; }
+ public static MacAddressResolverBase Null { get; }
- public static MacAddressResolver Null { get; }
-
- public static MacAddressResolver Create(MacAddressResolverOptions? options = null, IServiceProvider? serviceProvider = null) {}
-
- protected MacAddressResolver(ILogger? logger = null) {}
+ protected MacAddressResolverBase(ILogger? logger = null) {}
public abstract bool HasInvalidated { get; }
protected ILogger? Logger { get; }
protected virtual void Dispose(bool disposing) {}
public void Dispose() {}
public void Invalidate(IPAddress ipAddress) {}
public void Invalidate(PhysicalAddress macAddress) {}
protected abstract void InvalidateCore(IPAddress ipAddress);
protected abstract void InvalidateCore(PhysicalAddress macAddress);
public ValueTask RefreshCacheAsync(CancellationToken cancellationToken = default) {}
protected virtual ValueTask RefreshCacheAsyncCore(CancellationToken cancellationToken) {}
public ValueTask RefreshInvalidatedCacheAsync(CancellationToken cancellationToken = default) {}
protected virtual ValueTask RefreshInvalidatedCacheAsyncCore(CancellationToken cancellationToken) {}
public ValueTask<PhysicalAddress?> ResolveIPAddressToMacAddressAsync(IPAddress ipAddress, CancellationToken cancellationToken = default) {}
protected abstract ValueTask<PhysicalAddress?> ResolveIPAddressToMacAddressAsyncCore(IPAddress ipAddress, CancellationToken cancellationToken);
public ValueTask<IPAddress?> ResolveMacAddressToIPAddressAsync(PhysicalAddress macAddress, CancellationToken cancellationToken = default) {}
protected abstract ValueTask<IPAddress?> ResolveMacAddressToIPAddressAsyncCore(PhysicalAddress macAddress, CancellationToken cancellationToken);
void IAddressResolver<IPAddress, PhysicalAddress>.Invalidate(IPAddress address) {}
ValueTask<PhysicalAddress?> IAddressResolver<IPAddress, PhysicalAddress>.ResolveAsync(IPAddress address, CancellationToken cancellationToken) {}
void IAddressResolver<PhysicalAddress, IPAddress>.Invalidate(PhysicalAddress address) {}
ValueTask<IPAddress?> IAddressResolver<PhysicalAddress, IPAddress>.ResolveAsync(PhysicalAddress address, CancellationToken cancellationToken) {}
protected void ThrowIfDisposed() {}
}
+}
+
+namespace Smdn.Net.NeighborDiscovery {
+ public interface INeighborDiscoverer {
+ ValueTask DiscoverAsync(CancellationToken cancellationToken);
+ ValueTask DiscoverAsync(IEnumerable<IPAddress> addresses, CancellationToken cancellationToken);
+ }
+
+ public interface INeighborTable {
+ IAsyncEnumerable<NeighborTableEntry> EnumerateEntriesAsync(CancellationToken cancellationToken);
+ }
+
+ public enum NeighborTableEntryState : int {
+ Delay = 4,
+ Incomplete = 1,
+ None = 0,
+ Probe = 5,
+ Reachable = 2,
+ Stale = 3,
+ }
+
+ public sealed class ArpScanCommandNeighborDiscoverer : RunCommandNeighborDiscovererBase {
+ public static bool IsSupported { get; }
+
+ public ArpScanCommandNeighborDiscoverer(IPNetworkProfile? networkProfile, IServiceProvider? serviceProvider) {}
+
+ protected override bool GetCommandLineArguments(IEnumerable<IPAddress> addressesToDiscover, out string executable, out string arguments) {}
+ protected override bool GetCommandLineArguments(out string executable, out string arguments) {}
+ }
+
+ public sealed class IpHlpApiNeighborDiscoverer : INeighborDiscoverer {
+ public IpHlpApiNeighborDiscoverer(IPNetworkProfile networkProfile, ILogger? logger = null) {}
- public sealed class MacAddressResolverOptions {
- public static readonly MacAddressResolverOptions Default; // = "Smdn.Net.AddressResolution.MacAddressResolverOptions"
+ public ValueTask DiscoverAsync(CancellationToken cancellationToken = default) {}
+ public async ValueTask DiscoverAsync(IEnumerable<IPAddress> addresses, CancellationToken cancellationToken = default) {}
+ }
+
+ public sealed class IpHlpApiNeighborTable : INeighborTable {
+ public static bool IsSupported { get; }
+
+ public IpHlpApiNeighborTable(IServiceProvider? serviceProvider = null) {}
+
+ [AsyncIteratorStateMachine(typeof(IpHlpApiNeighborTable.<EnumerateEntriesAsync>d__5))]
+ public IAsyncEnumerable<NeighborTableEntry> EnumerateEntriesAsync([EnumeratorCancellation] CancellationToken cancellationToken = default) {}
+ }
+
+ public sealed class NmapCommandNeighborDiscoverer : RunCommandNeighborDiscovererBase {
+ public static bool IsSupported { get; }
+
+ public NmapCommandNeighborDiscoverer(IPNetworkProfile networkProfile, IServiceProvider? serviceProvider) {}
+
+ protected override bool GetCommandLineArguments(IEnumerable<IPAddress> addressesToDiscover, out string executable, out string arguments) {}
+ protected override bool GetCommandLineArguments(out string executable, out string arguments) {}
+ }
+
+ public sealed class NullNeighborDiscoverer : INeighborDiscoverer {
+ public static readonly NullNeighborDiscoverer Instance; // = "Smdn.Net.NeighborDiscovery.NullNeighborDiscoverer"
+
+ public ValueTask DiscoverAsync(CancellationToken cancellationToken) {}
+ public ValueTask DiscoverAsync(IEnumerable<IPAddress> addresses, CancellationToken cancellationToken) {}
+ }
+
+ public sealed class ProcfsArpNeighborTable : INeighborTable {
+ public static bool IsSupported { get; }
+
+ public ProcfsArpNeighborTable(IServiceProvider? serviceProvider = null) {}
+
+ [AsyncIteratorStateMachine(typeof(ProcfsArpNeighborTable.<EnumerateEntriesAsync>d__6))]
+ public IAsyncEnumerable<NeighborTableEntry> EnumerateEntriesAsync([EnumeratorCancellation] CancellationToken cancellationToken = default) {}
+ }
+
+ public abstract class RunCommandNeighborDiscovererBase : INeighborDiscoverer {
+ protected static string FindPathToCommand(string command, IEnumerable<string> paths) {}
+
+ protected RunCommandNeighborDiscovererBase(ILogger? logger) {}
+
+ public virtual ValueTask DiscoverAsync(CancellationToken cancellationToken) {}
+ public virtual ValueTask DiscoverAsync(IEnumerable<IPAddress> addresses, CancellationToken cancellationToken) {}
+ protected abstract bool GetCommandLineArguments(IEnumerable<IPAddress> addressesToDiscover, out string executable, out string arguments);
+ protected abstract bool GetCommandLineArguments(out string executable, out string arguments);
+ }
+
+ public readonly struct NeighborTableEntry :
+ IEquatable<IPAddress>,
+ IEquatable<PhysicalAddress>
+ {
+ public NeighborTableEntry(IPAddress ipAddress, PhysicalAddress? physicalAddress, bool isPermanent, NeighborTableEntryState state, int? interfaceIndex = null, string? interfaceName = null) {}
- public MacAddressResolverOptions() {}
+ public IPAddress IPAddress { get; }
+ public int? InterfaceIndex { get; }
+ public string? InterfaceName { get; }
+ public bool IsPermanent { get; }
+ public PhysicalAddress? PhysicalAddress { get; }
+ public NeighborTableEntryState State { get; }
- public string? ArpScanCommandInterfaceSpecification { get; init; }
- public string? ArpScanCommandTargetSpecification { get; init; }
- public string? NmapCommandInterfaceSpecification { get; init; }
- public string? NmapCommandTargetSpecification { get; init; }
- public TimeSpan ProcfsArpFullScanInterval { get; init; }
+ public bool Equals(IPAddress? other) {}
+ public bool Equals(PhysicalAddress? other) {}
}
}
// API list generated by Smdn.Reflection.ReverseGenerating.ListApi.MSBuild.Tasks v1.2.1.0.
// Smdn.Reflection.ReverseGenerating.ListApi.Core v1.2.0.0 (https://github.com/smdn/Smdn.Reflection.ReverseGenerating)
diff --git a/doc/api-list/Smdn.Net.AddressResolution/Smdn.Net.AddressResolution-netstandard2.0.apilist.cs b/doc/api-list/Smdn.Net.AddressResolution/Smdn.Net.AddressResolution-netstandard2.0.apilist.cs
index f2a6c75..5528b32 100644
--- a/doc/api-list/Smdn.Net.AddressResolution/Smdn.Net.AddressResolution-netstandard2.0.apilist.cs
+++ b/doc/api-list/Smdn.Net.AddressResolution/Smdn.Net.AddressResolution-netstandard2.0.apilist.cs
@@ -1,85 +1,210 @@
-// Smdn.Net.AddressResolution.dll (Smdn.Net.AddressResolution-1.0.0-preview5)
+// Smdn.Net.AddressResolution.dll (Smdn.Net.AddressResolution-1.0.0-preview6)
// Name: Smdn.Net.AddressResolution
// AssemblyVersion: 1.0.0.0
-// InformationalVersion: 1.0.0-preview5+fe261fa7dd16c43347c28935b3055ec3b8ab0674
+// InformationalVersion: 1.0.0-preview6+867630e3d8768ccca99d991e9c0c1cca62c64c76
// TargetFramework: .NETStandard,Version=v2.0
// Configuration: Release
// Referenced assemblies:
// Microsoft.Bcl.AsyncInterfaces, Version=6.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
// Microsoft.Extensions.DependencyInjection.Abstractions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
// Microsoft.Extensions.Logging.Abstractions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
+// System.Memory, Version=4.0.1.2, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
// System.Threading.Tasks.Extensions, Version=4.2.0.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
+// Vanara.Core, Version=3.4.13.0, Culture=neutral, PublicKeyToken=c37e4080322237fa
+// Vanara.PInvoke.IpHlpApi, Version=3.4.13.0, Culture=neutral, PublicKeyToken=c37e4080322237fa
+// Vanara.PInvoke.Shared, Version=3.4.13.0, Culture=neutral, PublicKeyToken=c37e4080322237fa
+// Vanara.PInvoke.Ws2_32, Version=3.4.13.0, Culture=neutral, PublicKeyToken=c37e4080322237fa
// netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
#nullable enable annotations
using System;
+using System.Collections.Generic;
using System.Net;
using System.Net.NetworkInformation;
+using System.Runtime.CompilerServices;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
+using Smdn.Net;
using Smdn.Net.AddressResolution;
+using Smdn.Net.NeighborDiscovery;
namespace Smdn.Net {
+ public abstract class IPNetworkProfile {
+ public static IPNetworkProfile Create() {}
+ public static IPNetworkProfile Create(Func<IEnumerable<IPAddress>?> addressRangeGenerator, NetworkInterface? networkInterface = null) {}
+ public static IPNetworkProfile Create(IPAddress baseAddress, IPAddress subnetMask, NetworkInterface? networkInterface = null) {}
+ public static IPNetworkProfile Create(IPAddress baseAddress, int prefixLength, NetworkInterface? networkInterface = null) {}
+ public static IPNetworkProfile Create(NetworkInterface networkInterface) {}
+ public static IPNetworkProfile Create(Predicate<NetworkInterface> predicate) {}
+
+ protected IPNetworkProfile(NetworkInterface? networkInterface) {}
+
+ public NetworkInterface? NetworkInterface { get; }
+
+ public abstract IEnumerable<IPAddress>? GetAddressRange();
+ }
+
public static class PhysicalAddressExtensions {
public static string ToMacAddressString(this PhysicalAddress hardwareAddress, char delimiter = ':') {}
}
}
namespace Smdn.Net.AddressResolution {
public interface IAddressResolver<TAddress, TResolvedAddress> {
void Invalidate(TAddress address);
ValueTask<TResolvedAddress> ResolveAsync(TAddress address, CancellationToken cancellationToken);
}
- public abstract class MacAddressResolver :
+ public class MacAddressResolver : MacAddressResolverBase {
+ protected MacAddressResolver(INeighborTable neighborTable, INeighborDiscoverer neighborDiscoverer, TimeSpan neighborDiscoveryInterval, ILogger? logger) {}
+ public MacAddressResolver(INeighborTable? neighborTable = null, INeighborDiscoverer? neighborDiscoverer = null, int neighborDiscoveryIntervalMilliseconds = -1, IServiceProvider? serviceProvider = null) {}
+ public MacAddressResolver(IPNetworkProfile? networkProfile, IServiceProvider? serviceProvider = null) {}
+ public MacAddressResolver(IPNetworkProfile? networkProfile, TimeSpan neighborDiscoveryInterval, IServiceProvider? serviceProvider = null) {}
+ public MacAddressResolver(TimeSpan neighborDiscoveryInterval, INeighborTable? neighborTable = null, INeighborDiscoverer? neighborDiscoverer = null, IServiceProvider? serviceProvider = null) {}
+
+ public override bool HasInvalidated { get; }
+
+ protected override void Dispose(bool disposing) {}
+ protected override void InvalidateCore(IPAddress ipAddress) {}
+ protected override void InvalidateCore(PhysicalAddress macAddress) {}
+ protected override ValueTask RefreshCacheAsyncCore(CancellationToken cancellationToken = default) {}
+ protected override ValueTask RefreshInvalidatedCacheAsyncCore(CancellationToken cancellationToken = default) {}
+ protected override async ValueTask<PhysicalAddress?> ResolveIPAddressToMacAddressAsyncCore(IPAddress ipAddress, CancellationToken cancellationToken) {}
+ protected override async ValueTask<IPAddress?> ResolveMacAddressToIPAddressAsyncCore(PhysicalAddress macAddress, CancellationToken cancellationToken) {}
+ }
+
+ public abstract class MacAddressResolverBase :
IAddressResolver<IPAddress, PhysicalAddress>,
IAddressResolver<PhysicalAddress, IPAddress>,
IDisposable
{
- protected static readonly PhysicalAddress AllZeroMacAddress; // = "000000000000"
+ protected static PhysicalAddress AllZeroMacAddress { get; }
+ public static MacAddressResolverBase Null { get; }
- public static MacAddressResolver Null { get; }
-
- public static MacAddressResolver Create(MacAddressResolverOptions? options = null, IServiceProvider? serviceProvider = null) {}
-
- protected MacAddressResolver(ILogger? logger = null) {}
+ protected MacAddressResolverBase(ILogger? logger = null) {}
public abstract bool HasInvalidated { get; }
protected ILogger? Logger { get; }
protected virtual void Dispose(bool disposing) {}
public void Dispose() {}
public void Invalidate(IPAddress ipAddress) {}
public void Invalidate(PhysicalAddress macAddress) {}
protected abstract void InvalidateCore(IPAddress ipAddress);
protected abstract void InvalidateCore(PhysicalAddress macAddress);
public ValueTask RefreshCacheAsync(CancellationToken cancellationToken = default) {}
protected virtual ValueTask RefreshCacheAsyncCore(CancellationToken cancellationToken) {}
public ValueTask RefreshInvalidatedCacheAsync(CancellationToken cancellationToken = default) {}
protected virtual ValueTask RefreshInvalidatedCacheAsyncCore(CancellationToken cancellationToken) {}
public ValueTask<PhysicalAddress?> ResolveIPAddressToMacAddressAsync(IPAddress ipAddress, CancellationToken cancellationToken = default) {}
protected abstract ValueTask<PhysicalAddress?> ResolveIPAddressToMacAddressAsyncCore(IPAddress ipAddress, CancellationToken cancellationToken);
public ValueTask<IPAddress?> ResolveMacAddressToIPAddressAsync(PhysicalAddress macAddress, CancellationToken cancellationToken = default) {}
protected abstract ValueTask<IPAddress?> ResolveMacAddressToIPAddressAsyncCore(PhysicalAddress macAddress, CancellationToken cancellationToken);
void IAddressResolver<IPAddress, PhysicalAddress>.Invalidate(IPAddress address) {}
ValueTask<PhysicalAddress?> IAddressResolver<IPAddress, PhysicalAddress>.ResolveAsync(IPAddress address, CancellationToken cancellationToken) {}
void IAddressResolver<PhysicalAddress, IPAddress>.Invalidate(PhysicalAddress address) {}
ValueTask<IPAddress?> IAddressResolver<PhysicalAddress, IPAddress>.ResolveAsync(PhysicalAddress address, CancellationToken cancellationToken) {}
protected void ThrowIfDisposed() {}
}
+}
+
+namespace Smdn.Net.NeighborDiscovery {
+ public interface INeighborDiscoverer {
+ ValueTask DiscoverAsync(CancellationToken cancellationToken);
+ ValueTask DiscoverAsync(IEnumerable<IPAddress> addresses, CancellationToken cancellationToken);
+ }
+
+ public interface INeighborTable {
+ IAsyncEnumerable<NeighborTableEntry> EnumerateEntriesAsync(CancellationToken cancellationToken);
+ }
+
+ public enum NeighborTableEntryState : int {
+ Delay = 4,
+ Incomplete = 1,
+ None = 0,
+ Probe = 5,
+ Reachable = 2,
+ Stale = 3,
+ }
+
+ public sealed class ArpScanCommandNeighborDiscoverer : RunCommandNeighborDiscovererBase {
+ public static bool IsSupported { get; }
+
+ public ArpScanCommandNeighborDiscoverer(IPNetworkProfile? networkProfile, IServiceProvider? serviceProvider) {}
+
+ protected override bool GetCommandLineArguments(IEnumerable<IPAddress> addressesToDiscover, out string executable, out string arguments) {}
+ protected override bool GetCommandLineArguments(out string executable, out string arguments) {}
+ }
+
+ public sealed class IpHlpApiNeighborDiscoverer : INeighborDiscoverer {
+ public IpHlpApiNeighborDiscoverer(IPNetworkProfile networkProfile, ILogger? logger = null) {}
- public sealed class MacAddressResolverOptions {
- public static readonly MacAddressResolverOptions Default; // = "Smdn.Net.AddressResolution.MacAddressResolverOptions"
+ public ValueTask DiscoverAsync(CancellationToken cancellationToken = default) {}
+ public async ValueTask DiscoverAsync(IEnumerable<IPAddress> addresses, CancellationToken cancellationToken = default) {}
+ }
+
+ public sealed class IpHlpApiNeighborTable : INeighborTable {
+ public static bool IsSupported { get; }
+
+ public IpHlpApiNeighborTable(IServiceProvider? serviceProvider = null) {}
+
+ [AsyncIteratorStateMachine(typeof(IpHlpApiNeighborTable.<EnumerateEntriesAsync>d__5))]
+ public IAsyncEnumerable<NeighborTableEntry> EnumerateEntriesAsync([EnumeratorCancellation] CancellationToken cancellationToken = default) {}
+ }
+
+ public sealed class NmapCommandNeighborDiscoverer : RunCommandNeighborDiscovererBase {
+ public static bool IsSupported { get; }
+
+ public NmapCommandNeighborDiscoverer(IPNetworkProfile networkProfile, IServiceProvider? serviceProvider) {}
+
+ protected override bool GetCommandLineArguments(IEnumerable<IPAddress> addressesToDiscover, out string executable, out string arguments) {}
+ protected override bool GetCommandLineArguments(out string executable, out string arguments) {}
+ }
+
+ public sealed class NullNeighborDiscoverer : INeighborDiscoverer {
+ public static readonly NullNeighborDiscoverer Instance; // = "Smdn.Net.NeighborDiscovery.NullNeighborDiscoverer"
+
+ public ValueTask DiscoverAsync(CancellationToken cancellationToken) {}
+ public ValueTask DiscoverAsync(IEnumerable<IPAddress> addresses, CancellationToken cancellationToken) {}
+ }
+
+ public sealed class ProcfsArpNeighborTable : INeighborTable {
+ public static bool IsSupported { get; }
+
+ public ProcfsArpNeighborTable(IServiceProvider? serviceProvider = null) {}
+
+ [AsyncIteratorStateMachine(typeof(ProcfsArpNeighborTable.<EnumerateEntriesAsync>d__6))]
+ public IAsyncEnumerable<NeighborTableEntry> EnumerateEntriesAsync([EnumeratorCancellation] CancellationToken cancellationToken = default) {}
+ }
+
+ public abstract class RunCommandNeighborDiscovererBase : INeighborDiscoverer {
+ protected static string FindPathToCommand(string command, IEnumerable<string> paths) {}
+
+ protected RunCommandNeighborDiscovererBase(ILogger? logger) {}
+
+ public virtual ValueTask DiscoverAsync(CancellationToken cancellationToken) {}
+ public virtual ValueTask DiscoverAsync(IEnumerable<IPAddress> addresses, CancellationToken cancellationToken) {}
+ protected abstract bool GetCommandLineArguments(IEnumerable<IPAddress> addressesToDiscover, out string executable, out string arguments);
+ protected abstract bool GetCommandLineArguments(out string executable, out string arguments);
+ }
+
+ public readonly struct NeighborTableEntry :
+ IEquatable<IPAddress>,
+ IEquatable<PhysicalAddress>
+ {
+ public NeighborTableEntry(IPAddress ipAddress, PhysicalAddress? physicalAddress, bool isPermanent, NeighborTableEntryState state, int? interfaceIndex = null, string? interfaceName = null) {}
- public MacAddressResolverOptions() {}
+ public IPAddress IPAddress { get; }
+ public int? InterfaceIndex { get; }
+ public string? InterfaceName { get; }
+ public bool IsPermanent { get; }
+ public PhysicalAddress? PhysicalAddress { get; }
+ public NeighborTableEntryState State { get; }
- public string? ArpScanCommandInterfaceSpecification { get; init; }
- public string? ArpScanCommandTargetSpecification { get; init; }
- public string? NmapCommandInterfaceSpecification { get; init; }
- public string? NmapCommandTargetSpecification { get; init; }
- public TimeSpan ProcfsArpFullScanInterval { get; init; }
+ public bool Equals(IPAddress? other) {}
+ public bool Equals(PhysicalAddress? other) {}
}
}
// API list generated by Smdn.Reflection.ReverseGenerating.ListApi.MSBuild.Tasks v1.2.1.0.
// Smdn.Reflection.ReverseGenerating.ListApi.Core v1.2.0.0 (https://github.com/smdn/Smdn.Reflection.ReverseGenerating)
diff --git a/doc/api-list/Smdn.Net.AddressResolution/Smdn.Net.AddressResolution-netstandard2.1.apilist.cs b/doc/api-list/Smdn.Net.AddressResolution/Smdn.Net.AddressResolution-netstandard2.1.apilist.cs
index bb31c94..8c8dcd4 100644
--- a/doc/api-list/Smdn.Net.AddressResolution/Smdn.Net.AddressResolution-netstandard2.1.apilist.cs
+++ b/doc/api-list/Smdn.Net.AddressResolution/Smdn.Net.AddressResolution-netstandard2.1.apilist.cs
@@ -1,83 +1,207 @@
-// Smdn.Net.AddressResolution.dll (Smdn.Net.AddressResolution-1.0.0-preview5)
+// Smdn.Net.AddressResolution.dll (Smdn.Net.AddressResolution-1.0.0-preview6)
// Name: Smdn.Net.AddressResolution
// AssemblyVersion: 1.0.0.0
-// InformationalVersion: 1.0.0-preview5+fe261fa7dd16c43347c28935b3055ec3b8ab0674
+// InformationalVersion: 1.0.0-preview6+867630e3d8768ccca99d991e9c0c1cca62c64c76
// TargetFramework: .NETStandard,Version=v2.1
// Configuration: Release
// Referenced assemblies:
// Microsoft.Extensions.DependencyInjection.Abstractions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
// Microsoft.Extensions.Logging.Abstractions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
+// Vanara.Core, Version=3.4.13.0, Culture=neutral, PublicKeyToken=c37e4080322237fa
+// Vanara.PInvoke.IpHlpApi, Version=3.4.13.0, Culture=neutral, PublicKeyToken=c37e4080322237fa
+// Vanara.PInvoke.Shared, Version=3.4.13.0, Culture=neutral, PublicKeyToken=c37e4080322237fa
+// Vanara.PInvoke.Ws2_32, Version=3.4.13.0, Culture=neutral, PublicKeyToken=c37e4080322237fa
// netstandard, Version=2.1.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
#nullable enable annotations
using System;
+using System.Collections.Generic;
using System.Net;
using System.Net.NetworkInformation;
+using System.Runtime.CompilerServices;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
+using Smdn.Net;
using Smdn.Net.AddressResolution;
+using Smdn.Net.NeighborDiscovery;
namespace Smdn.Net {
+ public abstract class IPNetworkProfile {
+ public static IPNetworkProfile Create() {}
+ public static IPNetworkProfile Create(Func<IEnumerable<IPAddress>?> addressRangeGenerator, NetworkInterface? networkInterface = null) {}
+ public static IPNetworkProfile Create(IPAddress baseAddress, IPAddress subnetMask, NetworkInterface? networkInterface = null) {}
+ public static IPNetworkProfile Create(IPAddress baseAddress, int prefixLength, NetworkInterface? networkInterface = null) {}
+ public static IPNetworkProfile Create(NetworkInterface networkInterface) {}
+ public static IPNetworkProfile Create(Predicate<NetworkInterface> predicate) {}
+
+ protected IPNetworkProfile(NetworkInterface? networkInterface) {}
+
+ public NetworkInterface? NetworkInterface { get; }
+
+ public abstract IEnumerable<IPAddress>? GetAddressRange();
+ }
+
public static class PhysicalAddressExtensions {
public static string ToMacAddressString(this PhysicalAddress hardwareAddress, char delimiter = ':') {}
}
}
namespace Smdn.Net.AddressResolution {
public interface IAddressResolver<TAddress, TResolvedAddress> {
void Invalidate(TAddress address);
ValueTask<TResolvedAddress> ResolveAsync(TAddress address, CancellationToken cancellationToken);
}
- public abstract class MacAddressResolver :
+ public class MacAddressResolver : MacAddressResolverBase {
+ protected MacAddressResolver(INeighborTable neighborTable, INeighborDiscoverer neighborDiscoverer, TimeSpan neighborDiscoveryInterval, ILogger? logger) {}
+ public MacAddressResolver(INeighborTable? neighborTable = null, INeighborDiscoverer? neighborDiscoverer = null, int neighborDiscoveryIntervalMilliseconds = -1, IServiceProvider? serviceProvider = null) {}
+ public MacAddressResolver(IPNetworkProfile? networkProfile, IServiceProvider? serviceProvider = null) {}
+ public MacAddressResolver(IPNetworkProfile? networkProfile, TimeSpan neighborDiscoveryInterval, IServiceProvider? serviceProvider = null) {}
+ public MacAddressResolver(TimeSpan neighborDiscoveryInterval, INeighborTable? neighborTable = null, INeighborDiscoverer? neighborDiscoverer = null, IServiceProvider? serviceProvider = null) {}
+
+ public override bool HasInvalidated { get; }
+
+ protected override void Dispose(bool disposing) {}
+ protected override void InvalidateCore(IPAddress ipAddress) {}
+ protected override void InvalidateCore(PhysicalAddress macAddress) {}
+ protected override ValueTask RefreshCacheAsyncCore(CancellationToken cancellationToken = default) {}
+ protected override ValueTask RefreshInvalidatedCacheAsyncCore(CancellationToken cancellationToken = default) {}
+ protected override async ValueTask<PhysicalAddress?> ResolveIPAddressToMacAddressAsyncCore(IPAddress ipAddress, CancellationToken cancellationToken) {}
+ protected override async ValueTask<IPAddress?> ResolveMacAddressToIPAddressAsyncCore(PhysicalAddress macAddress, CancellationToken cancellationToken) {}
+ }
+
+ public abstract class MacAddressResolverBase :
IAddressResolver<IPAddress, PhysicalAddress>,
IAddressResolver<PhysicalAddress, IPAddress>,
IDisposable
{
- protected static readonly PhysicalAddress AllZeroMacAddress; // = "000000000000"
+ protected static PhysicalAddress AllZeroMacAddress { get; }
+ public static MacAddressResolverBase Null { get; }
- public static MacAddressResolver Null { get; }
-
- public static MacAddressResolver Create(MacAddressResolverOptions? options = null, IServiceProvider? serviceProvider = null) {}
-
- protected MacAddressResolver(ILogger? logger = null) {}
+ protected MacAddressResolverBase(ILogger? logger = null) {}
public abstract bool HasInvalidated { get; }
protected ILogger? Logger { get; }
protected virtual void Dispose(bool disposing) {}
public void Dispose() {}
public void Invalidate(IPAddress ipAddress) {}
public void Invalidate(PhysicalAddress macAddress) {}
protected abstract void InvalidateCore(IPAddress ipAddress);
protected abstract void InvalidateCore(PhysicalAddress macAddress);
public ValueTask RefreshCacheAsync(CancellationToken cancellationToken = default) {}
protected virtual ValueTask RefreshCacheAsyncCore(CancellationToken cancellationToken) {}
public ValueTask RefreshInvalidatedCacheAsync(CancellationToken cancellationToken = default) {}
protected virtual ValueTask RefreshInvalidatedCacheAsyncCore(CancellationToken cancellationToken) {}
public ValueTask<PhysicalAddress?> ResolveIPAddressToMacAddressAsync(IPAddress ipAddress, CancellationToken cancellationToken = default) {}
protected abstract ValueTask<PhysicalAddress?> ResolveIPAddressToMacAddressAsyncCore(IPAddress ipAddress, CancellationToken cancellationToken);
public ValueTask<IPAddress?> ResolveMacAddressToIPAddressAsync(PhysicalAddress macAddress, CancellationToken cancellationToken = default) {}
protected abstract ValueTask<IPAddress?> ResolveMacAddressToIPAddressAsyncCore(PhysicalAddress macAddress, CancellationToken cancellationToken);
void IAddressResolver<IPAddress, PhysicalAddress>.Invalidate(IPAddress address) {}
ValueTask<PhysicalAddress?> IAddressResolver<IPAddress, PhysicalAddress>.ResolveAsync(IPAddress address, CancellationToken cancellationToken) {}
void IAddressResolver<PhysicalAddress, IPAddress>.Invalidate(PhysicalAddress address) {}
ValueTask<IPAddress?> IAddressResolver<PhysicalAddress, IPAddress>.ResolveAsync(PhysicalAddress address, CancellationToken cancellationToken) {}
protected void ThrowIfDisposed() {}
}
+}
+
+namespace Smdn.Net.NeighborDiscovery {
+ public interface INeighborDiscoverer {
+ ValueTask DiscoverAsync(CancellationToken cancellationToken);
+ ValueTask DiscoverAsync(IEnumerable<IPAddress> addresses, CancellationToken cancellationToken);
+ }
+
+ public interface INeighborTable {
+ IAsyncEnumerable<NeighborTableEntry> EnumerateEntriesAsync(CancellationToken cancellationToken);
+ }
+
+ public enum NeighborTableEntryState : int {
+ Delay = 4,
+ Incomplete = 1,
+ None = 0,
+ Probe = 5,
+ Reachable = 2,
+ Stale = 3,
+ }
+
+ public sealed class ArpScanCommandNeighborDiscoverer : RunCommandNeighborDiscovererBase {
+ public static bool IsSupported { get; }
+
+ public ArpScanCommandNeighborDiscoverer(IPNetworkProfile? networkProfile, IServiceProvider? serviceProvider) {}
+
+ protected override bool GetCommandLineArguments(IEnumerable<IPAddress> addressesToDiscover, out string executable, out string arguments) {}
+ protected override bool GetCommandLineArguments(out string executable, out string arguments) {}
+ }
+
+ public sealed class IpHlpApiNeighborDiscoverer : INeighborDiscoverer {
+ public IpHlpApiNeighborDiscoverer(IPNetworkProfile networkProfile, ILogger? logger = null) {}
- public sealed class MacAddressResolverOptions {
- public static readonly MacAddressResolverOptions Default; // = "Smdn.Net.AddressResolution.MacAddressResolverOptions"
+ public ValueTask DiscoverAsync(CancellationToken cancellationToken = default) {}
+ public async ValueTask DiscoverAsync(IEnumerable<IPAddress> addresses, CancellationToken cancellationToken = default) {}
+ }
+
+ public sealed class IpHlpApiNeighborTable : INeighborTable {
+ public static bool IsSupported { get; }
+
+ public IpHlpApiNeighborTable(IServiceProvider? serviceProvider = null) {}
+
+ [AsyncIteratorStateMachine(typeof(IpHlpApiNeighborTable.<EnumerateEntriesAsync>d__5))]
+ public IAsyncEnumerable<NeighborTableEntry> EnumerateEntriesAsync([EnumeratorCancellation] CancellationToken cancellationToken = default) {}
+ }
+
+ public sealed class NmapCommandNeighborDiscoverer : RunCommandNeighborDiscovererBase {
+ public static bool IsSupported { get; }
+
+ public NmapCommandNeighborDiscoverer(IPNetworkProfile networkProfile, IServiceProvider? serviceProvider) {}
+
+ protected override bool GetCommandLineArguments(IEnumerable<IPAddress> addressesToDiscover, out string executable, out string arguments) {}
+ protected override bool GetCommandLineArguments(out string executable, out string arguments) {}
+ }
+
+ public sealed class NullNeighborDiscoverer : INeighborDiscoverer {
+ public static readonly NullNeighborDiscoverer Instance; // = "Smdn.Net.NeighborDiscovery.NullNeighborDiscoverer"
+
+ public ValueTask DiscoverAsync(CancellationToken cancellationToken) {}
+ public ValueTask DiscoverAsync(IEnumerable<IPAddress> addresses, CancellationToken cancellationToken) {}
+ }
+
+ public sealed class ProcfsArpNeighborTable : INeighborTable {
+ public static bool IsSupported { get; }
+
+ public ProcfsArpNeighborTable(IServiceProvider? serviceProvider = null) {}
+
+ [AsyncIteratorStateMachine(typeof(ProcfsArpNeighborTable.<EnumerateEntriesAsync>d__6))]
+ public IAsyncEnumerable<NeighborTableEntry> EnumerateEntriesAsync([EnumeratorCancellation] CancellationToken cancellationToken = default) {}
+ }
+
+ public abstract class RunCommandNeighborDiscovererBase : INeighborDiscoverer {
+ protected static string FindPathToCommand(string command, IEnumerable<string> paths) {}
+
+ protected RunCommandNeighborDiscovererBase(ILogger? logger) {}
+
+ public virtual ValueTask DiscoverAsync(CancellationToken cancellationToken) {}
+ public virtual ValueTask DiscoverAsync(IEnumerable<IPAddress> addresses, CancellationToken cancellationToken) {}
+ protected abstract bool GetCommandLineArguments(IEnumerable<IPAddress> addressesToDiscover, out string executable, out string arguments);
+ protected abstract bool GetCommandLineArguments(out string executable, out string arguments);
+ }
+
+ public readonly struct NeighborTableEntry :
+ IEquatable<IPAddress>,
+ IEquatable<PhysicalAddress>
+ {
+ public NeighborTableEntry(IPAddress ipAddress, PhysicalAddress? physicalAddress, bool isPermanent, NeighborTableEntryState state, int? interfaceIndex = null, string? interfaceName = null) {}
- public MacAddressResolverOptions() {}
+ public IPAddress IPAddress { get; }
+ public int? InterfaceIndex { get; }
+ public string? InterfaceName { get; }
+ public bool IsPermanent { get; }
+ public PhysicalAddress? PhysicalAddress { get; }
+ public NeighborTableEntryState State { get; }
- public string? ArpScanCommandInterfaceSpecification { get; init; }
- public string? ArpScanCommandTargetSpecification { get; init; }
- public string? NmapCommandInterfaceSpecification { get; init; }
- public string? NmapCommandTargetSpecification { get; init; }
- public TimeSpan ProcfsArpFullScanInterval { get; init; }
+ public bool Equals(IPAddress? other) {}
+ public bool Equals(PhysicalAddress? other) {}
}
}
// API list generated by Smdn.Reflection.ReverseGenerating.ListApi.MSBuild.Tasks v1.2.1.0.
// Smdn.Reflection.ReverseGenerating.ListApi.Core v1.2.0.0 (https://github.com/smdn/Smdn.Reflection.ReverseGenerating)
Notes
Full Changelog: releases/Smdn.Net.AddressResolution-1.0.0-preview5...releases/Smdn.Net.AddressResolution-1.0.0-preview6