Skip to content

Smdn.Net.SkStackIP version 1.3.0

Latest
Compare
Choose a tag to compare
@smdn smdn released this 23 Sep 12:14
92d48d3

Released package

Release notes

The full release notes are available at gist.

Change log

Change log in this release:

API changes

API changes in this release:
diff --git a/doc/api-list/Smdn.Net.SkStackIP/Smdn.Net.SkStackIP-net6.0.apilist.cs b/doc/api-list/Smdn.Net.SkStackIP/Smdn.Net.SkStackIP-net6.0.apilist.cs
index 908f8e6..06cb9af 100644
--- a/doc/api-list/Smdn.Net.SkStackIP/Smdn.Net.SkStackIP-net6.0.apilist.cs
+++ b/doc/api-list/Smdn.Net.SkStackIP/Smdn.Net.SkStackIP-net6.0.apilist.cs
@@ -1,476 +1,481 @@
-// Smdn.Net.SkStackIP.dll (Smdn.Net.SkStackIP-1.2.0)
+// Smdn.Net.SkStackIP.dll (Smdn.Net.SkStackIP-1.3.0)
 //   Name: Smdn.Net.SkStackIP
-//   AssemblyVersion: 1.2.0.0
-//   InformationalVersion: 1.2.0+0e506f4265dfd6eb80e5f98b4486e10a5cda9d99
+//   AssemblyVersion: 1.3.0.0
+//   InformationalVersion: 1.3.0+7931ab6db93341f49b92e060d48f76286ce36ded
 //   TargetFramework: .NETCoreApp,Version=v6.0
 //   Configuration: Release
 //   Referenced assemblies:
 //     Microsoft.Extensions.Logging.Abstractions, Version=8.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
 //     Polly.Core, Version=8.0.0.0, Culture=neutral, PublicKeyToken=c8a3ffc3f8f825cc
 //     Smdn.Fundamental.ControlPicture, Version=3.0.0.1, Culture=neutral
 //     Smdn.Fundamental.PrintableEncoding.Hexadecimal, Version=3.0.0.0, Culture=neutral
 //     System.Collections, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
 //     System.ComponentModel.Primitives, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
 //     System.IO.Pipelines, Version=8.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
 //     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.ObjectModel, 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.Threading, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
 #nullable enable annotations
 
 using System;
 using System.Buffers;
 using System.Collections.Generic;
 using System.ComponentModel;
 using System.Diagnostics.CodeAnalysis;
 using System.IO;
 using System.IO.Pipelines;
 using System.Net;
 using System.Net.NetworkInformation;
 using System.Threading;
 using System.Threading.Tasks;
 using Microsoft.Extensions.Logging;
 using Polly;
 using Smdn.Net.SkStackIP;
 using Smdn.Net.SkStackIP.Protocol;
 
 namespace Smdn.Net.SkStackIP {
   public enum SkStackERXUDPDataFormat : int {
     Binary = 0,
     HexAsciiText = 1,
   }
 
   public enum SkStackErrorCode : int {
     ER01 = 1,
     ER02 = 2,
     ER03 = 3,
     ER04 = 4,
     ER05 = 5,
     ER06 = 6,
     ER07 = 7,
     ER08 = 8,
     ER09 = 9,
     ER10 = 10,
     Undefined = 0,
   }
 
   public enum SkStackEventNumber : byte {
     ActiveScanCompleted = 34,
     BeaconReceived = 32,
     EchoRequestReceived = 5,
     EnergyDetectScanCompleted = 31,
     NeighborAdvertisementReceived = 2,
     NeighborSolicitationReceived = 1,
     PanaSessionEstablishmentCompleted = 37,
     PanaSessionEstablishmentError = 36,
     PanaSessionExpired = 41,
     PanaSessionTerminationCompleted = 39,
     PanaSessionTerminationRequestReceived = 38,
     PanaSessionTerminationTimedOut = 40,
     TransmissionTimeControlLimitationActivated = 50,
     TransmissionTimeControlLimitationDeactivated = 51,
     UdpSendCompleted = 33,
     Undefined = 0,
     WakeupSignalReceived = 192,
   }
 
   public enum SkStackResponseStatus : int {
     Fail = -1,
     Ok = 1,
     Undetermined = 0,
   }
 
   public enum SkStackUdpEncryption : byte {
     EncryptIfAble = 2,
     ForceEncrypt = 1,
     ForcePlainText = 0,
   }
 
   public enum SkStackUdpPortHandle : byte {
     Handle1 = 1,
     Handle2 = 2,
     Handle3 = 3,
     Handle4 = 4,
     Handle5 = 5,
     Handle6 = 6,
     None = 0,
   }
 
   public abstract class SkStackActiveScanOptions : ICloneable {
     public static SkStackActiveScanOptions Default { get; }
     public static SkStackActiveScanOptions Null { get; }
     public static SkStackActiveScanOptions ScanUntilFind { get; }
 
+    public static SkStackActiveScanOptions Create(Func<IEnumerable<int>> scanDurationGeneratorFunc, PhysicalAddress paaMacAddress) {}
+    public static SkStackActiveScanOptions Create(Func<IEnumerable<int>> scanDurationGeneratorFunc, Predicate<SkStackPanDescription>? paaSelector = null) {}
+    public static SkStackActiveScanOptions Create(Func<IEnumerable<int>> scanDurationGeneratorFunc, uint channelMask, Predicate<SkStackPanDescription>? paaSelector = null) {}
     public static SkStackActiveScanOptions Create(IEnumerable<int> scanDurationGenerator, PhysicalAddress paaMacAddress) {}
     public static SkStackActiveScanOptions Create(IEnumerable<int> scanDurationGenerator, Predicate<SkStackPanDescription>? paaSelector = null) {}
+    public static SkStackActiveScanOptions Create(IEnumerable<int> scanDurationGenerator, uint channelMask, Predicate<SkStackPanDescription>? paaSelector = null) {}
 
     protected SkStackActiveScanOptions() {}
 
     public abstract SkStackActiveScanOptions Clone();
     object ICloneable.Clone() {}
   }
 
   public class SkStackClient : IDisposable {
     public static readonly TimeSpan SKSCANDefaultDuration; // = "00:00:00.0480000"
     public static readonly TimeSpan SKSCANMaxDuration; // = "00:02:37.2960000"
     public static readonly TimeSpan SKSCANMinDuration; // = "00:00:00.0192000"
 
     public event EventHandler<SkStackPanaSessionEventArgs>? PanaSessionEstablished;
     public event EventHandler<SkStackPanaSessionEventArgs>? PanaSessionExpired;
     public event EventHandler<SkStackPanaSessionEventArgs>? PanaSessionTerminated;
     public event EventHandler<SkStackEventArgs>? Slept;
     public event EventHandler<SkStackEventArgs>? WokeUp;
 
     public SkStackClient(PipeWriter sender, PipeReader receiver, SkStackERXUDPDataFormat erxudpDataFormat = SkStackERXUDPDataFormat.Binary, ILogger? logger = null) {}
     public SkStackClient(Stream stream, bool leaveStreamOpen = true, SkStackERXUDPDataFormat erxudpDataFormat = SkStackERXUDPDataFormat.Binary, ILogger? logger = null) {}
 
     public SkStackERXUDPDataFormat ERXUDPDataFormat { get; protected set; }
     [MemberNotNullWhen(true, "PanaSessionPeerAddress")]
     public bool IsPanaSessionAlive { [MemberNotNullWhen(true, "PanaSessionPeerAddress")] get; }
     protected ILogger? Logger { get; }
     public IPAddress? PanaSessionPeerAddress { get; }
     public TimeSpan ReceiveResponseDelay { get; set; }
     public TimeSpan ReceiveUdpPollingInterval { get; set; }
     public ISynchronizeInvoke? SynchronizingObject { get; set; }
 
     public ValueTask<IReadOnlyList<SkStackPanDescription>> ActiveScanAsync(Action<IBufferWriter<byte>> writeRBID, Action<IBufferWriter<byte>> writePassword, SkStackActiveScanOptions? scanOptions = null, CancellationToken cancellationToken = default) {}
     public ValueTask<IReadOnlyList<SkStackPanDescription>> ActiveScanAsync(ReadOnlyMemory<byte> rbid, ReadOnlyMemory<byte> password, SkStackActiveScanOptions? scanOptions = null, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackPanaSessionInfo> AuthenticateAsPanaClientAsync(Action<IBufferWriter<byte>> writeRBID, Action<IBufferWriter<byte>> writePassword, IPAddress paaAddress, SkStackChannel channel, int panId, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackPanaSessionInfo> AuthenticateAsPanaClientAsync(Action<IBufferWriter<byte>> writeRBID, Action<IBufferWriter<byte>> writePassword, PhysicalAddress paaMacAddress, SkStackChannel channel, int panId, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackPanaSessionInfo> AuthenticateAsPanaClientAsync(Action<IBufferWriter<byte>> writeRBID, Action<IBufferWriter<byte>> writePassword, SkStackActiveScanOptions? scanOptions = null, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackPanaSessionInfo> AuthenticateAsPanaClientAsync(Action<IBufferWriter<byte>> writeRBID, Action<IBufferWriter<byte>> writePassword, SkStackPanDescription pan, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackPanaSessionInfo> AuthenticateAsPanaClientAsync(ReadOnlyMemory<byte> rbid, ReadOnlyMemory<byte> password, IPAddress paaAddress, SkStackChannel channel, int panId, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackPanaSessionInfo> AuthenticateAsPanaClientAsync(ReadOnlyMemory<byte> rbid, ReadOnlyMemory<byte> password, IPAddress paaAddress, int channelNumber, int panId, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackPanaSessionInfo> AuthenticateAsPanaClientAsync(ReadOnlyMemory<byte> rbid, ReadOnlyMemory<byte> password, PhysicalAddress paaMacAddress, SkStackChannel channel, int panId, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackPanaSessionInfo> AuthenticateAsPanaClientAsync(ReadOnlyMemory<byte> rbid, ReadOnlyMemory<byte> password, PhysicalAddress paaMacAddress, int channelNumber, int panId, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackPanaSessionInfo> AuthenticateAsPanaClientAsync(ReadOnlyMemory<byte> rbid, ReadOnlyMemory<byte> password, SkStackActiveScanOptions? scanOptions = null, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackPanaSessionInfo> AuthenticateAsPanaClientAsync(ReadOnlyMemory<byte> rbid, ReadOnlyMemory<byte> password, SkStackPanDescription pan, CancellationToken cancellationToken = default) {}
     public async ValueTask<IPAddress> ConvertToIPv6LinkLocalAddressAsync(PhysicalAddress macAddress, CancellationToken cancellationToken = default) {}
     public ValueTask DisableFlashMemoryAutoLoadAsync(CancellationToken cancellationToken = default) {}
     protected virtual void Dispose(bool disposing) {}
     public void Dispose() {}
     public ValueTask EnableFlashMemoryAutoLoadAsync(CancellationToken cancellationToken = default) {}
     public async ValueTask<IReadOnlyList<IPAddress>> GetAvailableAddressListAsync(CancellationToken cancellationToken = default) {}
     public async ValueTask<IReadOnlyList<SkStackUdpPort>> GetListeningUdpPortListAsync(CancellationToken cancellationToken = default) {}
     public async ValueTask<IReadOnlyDictionary<IPAddress, PhysicalAddress>> GetNeighborCacheListAsync(CancellationToken cancellationToken = default) {}
     public async ValueTask<IReadOnlyList<SkStackUdpPortHandle>> GetUnusedUdpPortHandleListAsync(CancellationToken cancellationToken = default) {}
     public async ValueTask LoadFlashMemoryAsync(CancellationToken cancellationToken = default) {}
     public async ValueTask<SkStackUdpPort> PrepareUdpPortAsync(int port, CancellationToken cancellationToken = default) {}
     public ValueTask<IPAddress> ReceiveUdpAsync(int port, IBufferWriter<byte> buffer, CancellationToken cancellationToken = default) {}
     public ValueTask<IPAddress> ReceiveUdpEchonetLiteAsync(IBufferWriter<byte> buffer, CancellationToken cancellationToken = default) {}
     public ValueTask SaveFlashMemoryAsync(SkStackFlashMemoryWriteRestriction restriction, CancellationToken cancellationToken = default) {}
     internal protected ValueTask<SkStackResponse<TPayload>> SendCommandAsync<TPayload>(ReadOnlyMemory<byte> command, Action<ISkStackCommandLineWriter>? writeArguments, SkStackSequenceParser<TPayload> parseResponsePayload, SkStackProtocolSyntax? syntax = null, bool throwIfErrorStatus = true, CancellationToken cancellationToken = default) {}
     internal protected async ValueTask<SkStackResponse> SendCommandAsync(ReadOnlyMemory<byte> command, Action<ISkStackCommandLineWriter>? writeArguments = null, SkStackProtocolSyntax? syntax = null, bool throwIfErrorStatus = true, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse> SendSKADDNBRAsync(IPAddress ipv6Address, PhysicalAddress macAddress, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse<string>> SendSKAPPVERAsync(CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse> SendSKDSLEEPAsync(bool waitUntilWakeUp = false, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse> SendSKERASEAsync(CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse<(IPAddress LinkLocalAddress, PhysicalAddress MacAddress, SkStackChannel Channel, int PanId, int Addr16)>> SendSKINFOAsync(CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse> SendSKJOINAsync(IPAddress ipv6address, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse<IPAddress>> SendSKLL64Async(PhysicalAddress macAddress, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse> SendSKLOADAsync(CancellationToken cancellationToken = default) {}
     public ValueTask<(SkStackResponse Response, IPAddress Address)> SendSKREJOINAsync(CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse> SendSKRESETAsync(CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse> SendSKSAVEAsync(CancellationToken cancellationToken = default) {}
     public ValueTask<(SkStackResponse Response, IReadOnlyList<SkStackPanDescription> PanDescriptions)> SendSKSCANActiveScanAsync(TimeSpan duration = default, uint channelMask = uint.MaxValue, CancellationToken cancellationToken = default) {}
     public ValueTask<(SkStackResponse Response, IReadOnlyList<SkStackPanDescription> PanDescriptions)> SendSKSCANActiveScanAsync(int durationFactor, uint channelMask = uint.MaxValue, CancellationToken cancellationToken = default) {}
     public ValueTask<(SkStackResponse Response, IReadOnlyList<SkStackPanDescription> PanDescriptions)> SendSKSCANActiveScanPairAsync(TimeSpan duration = default, uint channelMask = uint.MaxValue, CancellationToken cancellationToken = default) {}
     public ValueTask<(SkStackResponse Response, IReadOnlyList<SkStackPanDescription> PanDescriptions)> SendSKSCANActiveScanPairAsync(int durationFactor, uint channelMask = uint.MaxValue, CancellationToken cancellationToken = default) {}
     public ValueTask<(SkStackResponse Response, IReadOnlyDictionary<SkStackChannel, decimal> ScanResult)> SendSKSCANEnergyDetectScanAsync(TimeSpan duration = default, uint channelMask = uint.MaxValue, CancellationToken cancellationToken = default) {}
     public ValueTask<(SkStackResponse Response, IReadOnlyDictionary<SkStackChannel, decimal> ScanResult)> SendSKSCANEnergyDetectScanAsync(int durationFactor, uint channelMask = uint.MaxValue, CancellationToken cancellationToken = default) {}
     public ValueTask<(SkStackResponse Response, bool IsCompletedSuccessfully)> SendSKSENDTOAsync(SkStackUdpPort port, IPAddress destinationAddress, int destinationPort, ReadOnlyMemory<byte> data, SkStackUdpEncryption encryption = SkStackUdpEncryption.EncryptIfAble, CancellationToken cancellationToken = default) {}
     public ValueTask<(SkStackResponse Response, bool IsCompletedSuccessfully)> SendSKSENDTOAsync(SkStackUdpPort port, IPEndPoint destination, ReadOnlyMemory<byte> data, SkStackUdpEncryption encryption = SkStackUdpEncryption.EncryptIfAble, CancellationToken cancellationToken = default) {}
     public ValueTask<(SkStackResponse Response, bool IsCompletedSuccessfully)> SendSKSENDTOAsync(SkStackUdpPortHandle handle, IPAddress destinationAddress, int destinationPort, ReadOnlyMemory<byte> data, SkStackUdpEncryption encryption = SkStackUdpEncryption.EncryptIfAble, CancellationToken cancellationToken = default) {}
     public ValueTask<(SkStackResponse Response, bool IsCompletedSuccessfully)> SendSKSENDTOAsync(SkStackUdpPortHandle handle, IPEndPoint destination, ReadOnlyMemory<byte> data, SkStackUdpEncryption encryption = SkStackUdpEncryption.EncryptIfAble, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse> SendSKSETPWDAsync(Action<IBufferWriter<byte>> writePassword, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse> SendSKSETPWDAsync(ReadOnlyMemory<byte> password, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse> SendSKSETPWDAsync(ReadOnlyMemory<char> password, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse> SendSKSETRBIDAsync(Action<IBufferWriter<byte>> writeRBID, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse> SendSKSETRBIDAsync(ReadOnlyMemory<byte> id, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse> SendSKSETRBIDAsync(ReadOnlyMemory<char> id, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse<TValue>> SendSKSREGAsync<TValue>(SkStackRegister.RegisterEntry<TValue> register, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse> SendSKSREGAsync<TValue>(SkStackRegister.RegisterEntry<TValue> register, TValue @value, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse<IReadOnlyList<IPAddress>>> SendSKTABLEAvailableAddressListAsync(CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse<IReadOnlyList<SkStackUdpPort>>> SendSKTABLEListeningPortListAsync(CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse<IReadOnlyDictionary<IPAddress, PhysicalAddress>>> SendSKTABLENeighborCacheListAsync(CancellationToken cancellationToken = default) {}
     public async ValueTask<(SkStackResponse Response, bool IsCompletedSuccessfully)> SendSKTERMAsync(CancellationToken cancellationToken = default) {}
     public ValueTask<(SkStackResponse Response, SkStackUdpPort UdpPort)> SendSKUDPPORTAsync(SkStackUdpPortHandle handle, int port, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse> SendSKUDPPORTUnsetAsync(SkStackUdpPortHandle handle, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse<Version>> SendSKVERAsync(CancellationToken cancellationToken = default) {}
     public ValueTask SendUdpEchonetLiteAsync(ReadOnlyMemory<byte> buffer, ResiliencePipeline? resiliencePipeline = null, CancellationToken cancellationToken = default) {}
     protected async ValueTask SetFlashMemoryAutoLoadAsync(bool trueIfEnable, CancellationToken cancellationToken = default) {}
     public void StartCapturingUdpReceiveEvents(int port) {}
     public void StopCapturingUdpReceiveEvents(int port) {}
     public ValueTask<bool> TerminatePanaSessionAsync(CancellationToken cancellationToken = default) {}
     protected void ThrowIfDisposed() {}
     internal protected void ThrowIfPanaSessionAlreadyEstablished() {}
     [MemberNotNull("PanaSessionPeerAddress")]
     internal protected void ThrowIfPanaSessionIsNotEstablished() {}
   }
 
   public class SkStackCommandNotSupportedException : SkStackErrorResponseException {
   }
 
   public class SkStackErrorResponseException : SkStackResponseException {
     public SkStackErrorCode ErrorCode { get; }
     public string ErrorText { get; }
     public SkStackResponse Response { get; }
   }
 
   public class SkStackEventArgs : EventArgs {
     public SkStackEventNumber EventNumber { get; }
   }
 
   public class SkStackFlashMemoryIOException : SkStackErrorResponseException {
   }
 
   public abstract class SkStackFlashMemoryWriteRestriction {
     public static SkStackFlashMemoryWriteRestriction CreateGrantIfElapsed(TimeSpan interval) {}
     public static SkStackFlashMemoryWriteRestriction DangerousCreateAlwaysGrant() {}
 
     protected SkStackFlashMemoryWriteRestriction() {}
 
     internal protected abstract bool IsRestricted();
   }
 
   public static class SkStackKnownPortNumbers {
     public const int EchonetLite = 3610;
     public const int Pana = 716;
   }
 
   public class SkStackPanaSessionEstablishmentException : SkStackPanaSessionException {
     public SkStackChannel? Channel { get; }
     public IPAddress? PaaAddress { get; }
     public int? PanId { get; }
   }
 
   public sealed class SkStackPanaSessionEventArgs : SkStackEventArgs {
     public IPAddress PanaSessionPeerAddress { get; }
   }
 
   public abstract class SkStackPanaSessionException : InvalidOperationException {
     public IPAddress Address { get; }
     public SkStackEventNumber EventNumber { get; }
   }
 
   public sealed class SkStackPanaSessionInfo {
     public SkStackChannel Channel { get; }
     public IPAddress LocalAddress { get; }
     public PhysicalAddress LocalMacAddress { get; }
     public int PanId { get; }
     public IPAddress PeerAddress { get; }
     public PhysicalAddress PeerMacAddress { get; }
   }
 
   public static class SkStackRegister {
     public abstract class RegisterEntry<TValue> {
       private protected delegate bool ExpectValueFunc(ref SequenceReader<byte> reader, out TValue @value);
 
       public bool IsReadable { get; }
       public bool IsWritable { get; }
       public TValue MaxValue { get; }
       public TValue MinValue { get; }
       public string Name { get; }
     }
 
     public static SkStackRegister.RegisterEntry<bool> AcceptIcmpEcho { get; }
     public static SkStackRegister.RegisterEntry<ulong> AccumulatedSendTimeInMilliseconds { get; }
     public static SkStackRegister.RegisterEntry<SkStackChannel> Channel { get; }
     public static SkStackRegister.RegisterEntry<bool> EnableAutoLoad { get; }
     public static SkStackRegister.RegisterEntry<bool> EnableAutoReauthentication { get; }
     public static SkStackRegister.RegisterEntry<bool> EnableEchoback { get; }
     public static SkStackRegister.RegisterEntry<bool> EncryptIPMulticast { get; }
     public static SkStackRegister.RegisterEntry<uint> FrameCounter { get; }
     public static SkStackRegister.RegisterEntry<bool> IsSendingRestricted { get; }
     public static SkStackRegister.RegisterEntry<ReadOnlyMemory<byte>> PairingId { get; }
     public static SkStackRegister.RegisterEntry<ushort> PanId { get; }
     public static SkStackRegister.RegisterEntry<TimeSpan> PanaSessionLifetimeInSeconds { get; }
     public static SkStackRegister.RegisterEntry<bool> RespondBeaconRequest { get; }
     public static SkStackRegister.RegisterEntry<SkStackChannel> S02 { get; }
     public static SkStackRegister.RegisterEntry<ushort> S03 { get; }
     public static SkStackRegister.RegisterEntry<uint> S07 { get; }
     public static SkStackRegister.RegisterEntry<ReadOnlyMemory<byte>> S0A { get; }
     public static SkStackRegister.RegisterEntry<bool> S15 { get; }
     public static SkStackRegister.RegisterEntry<TimeSpan> S16 { get; }
     public static SkStackRegister.RegisterEntry<bool> S17 { get; }
     public static SkStackRegister.RegisterEntry<bool> SA0 { get; }
     public static SkStackRegister.RegisterEntry<bool> SA1 { get; }
     public static SkStackRegister.RegisterEntry<bool> SFB { get; }
     public static SkStackRegister.RegisterEntry<ulong> SFD { get; }
     public static SkStackRegister.RegisterEntry<bool> SFE { get; }
     public static SkStackRegister.RegisterEntry<bool> SFF { get; }
   }
 
   public class SkStackResponse {
     public SkStackResponseStatus Status { get; }
     public ReadOnlyMemory<byte> StatusText { get; }
     public bool Success { get; }
   }
 
   public class SkStackResponseException : InvalidOperationException {
     public SkStackResponseException() {}
     public SkStackResponseException(string message) {}
     public SkStackResponseException(string message, Exception? innerException = null) {}
   }
 
   public class SkStackResponse<TPayload> : SkStackResponse {
     public TPayload Payload { get; }
   }
 
   public class SkStackUartIOException : SkStackErrorResponseException {
   }
 
   public class SkStackUdpSendFailedException : InvalidOperationException {
     public SkStackUdpSendFailedException() {}
     public SkStackUdpSendFailedException(string message) {}
     public SkStackUdpSendFailedException(string message, Exception? innerException = null) {}
     public SkStackUdpSendFailedException(string message, SkStackUdpPortHandle portHandle, IPAddress peerAddress, Exception? innerException = null) {}
 
     public IPAddress? PeerAddress { get; }
     public SkStackUdpPortHandle PortHandle { get; }
   }
 
   public class SkStackUdpSendResultIndeterminateException : InvalidOperationException {
     public SkStackUdpSendResultIndeterminateException() {}
     public SkStackUdpSendResultIndeterminateException(string message) {}
     public SkStackUdpSendResultIndeterminateException(string message, Exception? innerException = null) {}
   }
 
   public readonly struct SkStackChannel :
     IComparable<SkStackChannel>,
     IEquatable<SkStackChannel>
   {
     public static readonly IReadOnlyDictionary<int, SkStackChannel> Channels; // = "System.Collections.Generic.Dictionary`2[System.Int32,Smdn.Net.SkStackIP.SkStackChannel]"
     public static readonly SkStackChannel Empty; // = "0ch (S02=0x00, 0 MHz)"
 
     public static SkStackChannel Channel33 { get; }
     public static SkStackChannel Channel34 { get; }
     public static SkStackChannel Channel35 { get; }
     public static SkStackChannel Channel36 { get; }
     public static SkStackChannel Channel37 { get; }
     public static SkStackChannel Channel38 { get; }
     public static SkStackChannel Channel39 { get; }
     public static SkStackChannel Channel40 { get; }
     public static SkStackChannel Channel41 { get; }
     public static SkStackChannel Channel42 { get; }
     public static SkStackChannel Channel43 { get; }
     public static SkStackChannel Channel44 { get; }
     public static SkStackChannel Channel45 { get; }
     public static SkStackChannel Channel46 { get; }
     public static SkStackChannel Channel47 { get; }
     public static SkStackChannel Channel48 { get; }
     public static SkStackChannel Channel49 { get; }
     public static SkStackChannel Channel50 { get; }
     public static SkStackChannel Channel51 { get; }
     public static SkStackChannel Channel52 { get; }
     public static SkStackChannel Channel53 { get; }
     public static SkStackChannel Channel54 { get; }
     public static SkStackChannel Channel55 { get; }
     public static SkStackChannel Channel56 { get; }
     public static SkStackChannel Channel57 { get; }
     public static SkStackChannel Channel58 { get; }
     public static SkStackChannel Channel59 { get; }
     public static SkStackChannel Channel60 { get; }
 
+    public static uint CreateMask(params SkStackChannel[] channels) {}
     public static bool operator == (SkStackChannel x, SkStackChannel y) {}
     public static bool operator != (SkStackChannel x, SkStackChannel y) {}
 
     public int ChannelNumber { get; }
     public decimal FrequencyMHz { get; }
     public bool IsEmpty { get; }
 
     public bool Equals(SkStackChannel other) {}
     public override bool Equals(object? obj) {}
     public override int GetHashCode() {}
     int IComparable<SkStackChannel>.CompareTo(SkStackChannel other) {}
     public override string ToString() {}
   }
 
   public readonly struct SkStackPanDescription {
     public SkStackChannel Channel { get; }
     public int ChannelPage { get; }
     public int Id { get; }
     public PhysicalAddress MacAddress { get; }
     public uint PairingId { get; }
     public decimal Rssi { get; }
 
     public override string ToString() {}
   }
 
   public readonly struct SkStackUdpPort {
     public static readonly SkStackUdpPort Null; // = "0 (#0)"
 
     public SkStackUdpPortHandle Handle { get; }
     public bool IsNull { get; }
     public bool IsUnused { get; }
     public int Port { get; }
 
     public override string ToString() {}
   }
 }
 
 namespace Smdn.Net.SkStackIP.Protocol {
   public delegate TResult SkStackSequenceParser<TResult>(ISkStackSequenceParserContext context);
 
   public interface ISkStackCommandLineWriter {
     void WriteMaskedToken(ReadOnlySpan<byte> token);
     void WriteToken(ReadOnlySpan<byte> token);
   }
 
   public interface ISkStackSequenceParserContext {
     ReadOnlySequence<byte> UnparsedSequence { get; }
 
     void Complete();
     void Complete(SequenceReader<byte> consumedReader);
     void Continue();
     ISkStackSequenceParserContext CreateCopy();
     virtual SequenceReader<byte> CreateReader() {}
     void Ignore();
     void SetAsIncomplete();
     void SetAsIncomplete(SequenceReader<byte> incompleteReader);
   }
 
   public abstract class SkStackProtocolSyntax {
     public static SkStackProtocolSyntax Default { get; }
 
     protected SkStackProtocolSyntax() {}
 
     public abstract ReadOnlySpan<byte> EndOfCommandLine { get; }
     public virtual ReadOnlySpan<byte> EndOfEchobackLine { get; }
     public abstract ReadOnlySpan<byte> EndOfStatusLine { get; }
     public abstract bool ExpectStatusLine { get; }
   }
 
   public static class SkStackTokenParser {
     public static bool Expect<TValue>(ref SequenceReader<byte> reader, int length, Converter<ReadOnlySequence<byte>, TValue> converter, [NotNullWhen(true)] out TValue @value) {}
     public static bool ExpectADDR16(ref SequenceReader<byte> reader, out ushort @value) {}
     public static bool ExpectADDR64(ref SequenceReader<byte> reader, [NotNullWhen(true)] out PhysicalAddress? @value) {}
     public static bool ExpectBinary(ref SequenceReader<byte> reader, out bool @value) {}
     public static bool ExpectCHANNEL(ref SequenceReader<byte> reader, out SkStackChannel @value) {}
     public static bool ExpectCharArray(ref SequenceReader<byte> reader, [NotNullWhen(true)] out string? @value) {}
     public static bool ExpectCharArray(ref SequenceReader<byte> reader, out ReadOnlyMemory<byte> @value) {}
     public static bool ExpectDecimalNumber(ref SequenceReader<byte> reader, int length, out uint @value) {}
     public static bool ExpectDecimalNumber(ref SequenceReader<byte> reader, out uint @value) {}
     public static bool ExpectEndOfLine(ref SequenceReader<byte> reader) {}
     public static bool ExpectIPADDR(ref SequenceReader<byte> reader, [NotNullWhen(true)] out IPAddress? @value) {}
     public static bool ExpectSequence(ref SequenceReader<byte> reader, ReadOnlySpan<byte> expectedSequence) {}
     public static bool ExpectToken(ref SequenceReader<byte> reader, ReadOnlySpan<byte> expectedToken) {}
     public static bool ExpectUINT16(ref SequenceReader<byte> reader, out ushort @value) {}
     public static bool ExpectUINT32(ref SequenceReader<byte> reader, out uint @value) {}
     public static bool ExpectUINT64(ref SequenceReader<byte> reader, out ulong @value) {}
     public static bool ExpectUINT8(ref SequenceReader<byte> reader, out byte @value) {}
     public static void ToByteSequence(ReadOnlySequence<byte> hexTextSequence, int byteSequenceLength, Span<byte> destination) {}
     public static bool TryExpectStatusLine(ref SequenceReader<byte> reader, out SkStackResponseStatus status) {}
     public static OperationStatus TryExpectToken(ref SequenceReader<byte> reader, ReadOnlySpan<byte> expectedToken) {}
   }
 
   public class SkStackUnexpectedResponseException : SkStackResponseException {
     public string? CausedText { get; }
   }
 }
 // API list generated by Smdn.Reflection.ReverseGenerating.ListApi.MSBuild.Tasks v1.4.1.0.
 // Smdn.Reflection.ReverseGenerating.ListApi.Core v1.3.1.0 (https://github.com/smdn/Smdn.Reflection.ReverseGenerating)
diff --git a/doc/api-list/Smdn.Net.SkStackIP/Smdn.Net.SkStackIP-net8.0.apilist.cs b/doc/api-list/Smdn.Net.SkStackIP/Smdn.Net.SkStackIP-net8.0.apilist.cs
index fbc09c7..f15fc27 100644
--- a/doc/api-list/Smdn.Net.SkStackIP/Smdn.Net.SkStackIP-net8.0.apilist.cs
+++ b/doc/api-list/Smdn.Net.SkStackIP/Smdn.Net.SkStackIP-net8.0.apilist.cs
@@ -1,474 +1,479 @@
-// Smdn.Net.SkStackIP.dll (Smdn.Net.SkStackIP-1.2.0)
+// Smdn.Net.SkStackIP.dll (Smdn.Net.SkStackIP-1.3.0)
 //   Name: Smdn.Net.SkStackIP
-//   AssemblyVersion: 1.2.0.0
-//   InformationalVersion: 1.2.0+0e506f4265dfd6eb80e5f98b4486e10a5cda9d99
+//   AssemblyVersion: 1.3.0.0
+//   InformationalVersion: 1.3.0+7931ab6db93341f49b92e060d48f76286ce36ded
 //   TargetFramework: .NETCoreApp,Version=v8.0
 //   Configuration: Release
 //   Referenced assemblies:
 //     Microsoft.Extensions.Logging.Abstractions, Version=8.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
 //     Polly.Core, Version=8.0.0.0, Culture=neutral, PublicKeyToken=c8a3ffc3f8f825cc
 //     Smdn.Fundamental.ControlPicture, Version=3.0.0.1, Culture=neutral
 //     Smdn.Fundamental.PrintableEncoding.Hexadecimal, Version=3.0.0.0, Culture=neutral
 //     System.Collections, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
 //     System.ComponentModel.Primitives, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
 //     System.IO.Pipelines, Version=8.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
 //     System.Linq, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
 //     System.Memory, Version=8.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
 //     System.Net.NetworkInformation, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
 //     System.Net.Primitives, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
 //     System.Runtime, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
 //     System.Threading, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
 #nullable enable annotations
 
 using System;
 using System.Buffers;
 using System.Collections.Generic;
 using System.ComponentModel;
 using System.Diagnostics.CodeAnalysis;
 using System.IO;
 using System.IO.Pipelines;
 using System.Net;
 using System.Net.NetworkInformation;
 using System.Threading;
 using System.Threading.Tasks;
 using Microsoft.Extensions.Logging;
 using Polly;
 using Smdn.Net.SkStackIP;
 using Smdn.Net.SkStackIP.Protocol;
 
 namespace Smdn.Net.SkStackIP {
   public enum SkStackERXUDPDataFormat : int {
     Binary = 0,
     HexAsciiText = 1,
   }
 
   public enum SkStackErrorCode : int {
     ER01 = 1,
     ER02 = 2,
     ER03 = 3,
     ER04 = 4,
     ER05 = 5,
     ER06 = 6,
     ER07 = 7,
     ER08 = 8,
     ER09 = 9,
     ER10 = 10,
     Undefined = 0,
   }
 
   public enum SkStackEventNumber : byte {
     ActiveScanCompleted = 34,
     BeaconReceived = 32,
     EchoRequestReceived = 5,
     EnergyDetectScanCompleted = 31,
     NeighborAdvertisementReceived = 2,
     NeighborSolicitationReceived = 1,
     PanaSessionEstablishmentCompleted = 37,
     PanaSessionEstablishmentError = 36,
     PanaSessionExpired = 41,
     PanaSessionTerminationCompleted = 39,
     PanaSessionTerminationRequestReceived = 38,
     PanaSessionTerminationTimedOut = 40,
     TransmissionTimeControlLimitationActivated = 50,
     TransmissionTimeControlLimitationDeactivated = 51,
     UdpSendCompleted = 33,
     Undefined = 0,
     WakeupSignalReceived = 192,
   }
 
   public enum SkStackResponseStatus : int {
     Fail = -1,
     Ok = 1,
     Undetermined = 0,
   }
 
   public enum SkStackUdpEncryption : byte {
     EncryptIfAble = 2,
     ForceEncrypt = 1,
     ForcePlainText = 0,
   }
 
   public enum SkStackUdpPortHandle : byte {
     Handle1 = 1,
     Handle2 = 2,
     Handle3 = 3,
     Handle4 = 4,
     Handle5 = 5,
     Handle6 = 6,
     None = 0,
   }
 
   public abstract class SkStackActiveScanOptions : ICloneable {
     public static SkStackActiveScanOptions Default { get; }
     public static SkStackActiveScanOptions Null { get; }
     public static SkStackActiveScanOptions ScanUntilFind { get; }
 
+    public static SkStackActiveScanOptions Create(Func<IEnumerable<int>> scanDurationGeneratorFunc, PhysicalAddress paaMacAddress) {}
+    public static SkStackActiveScanOptions Create(Func<IEnumerable<int>> scanDurationGeneratorFunc, Predicate<SkStackPanDescription>? paaSelector = null) {}
+    public static SkStackActiveScanOptions Create(Func<IEnumerable<int>> scanDurationGeneratorFunc, uint channelMask, Predicate<SkStackPanDescription>? paaSelector = null) {}
     public static SkStackActiveScanOptions Create(IEnumerable<int> scanDurationGenerator, PhysicalAddress paaMacAddress) {}
     public static SkStackActiveScanOptions Create(IEnumerable<int> scanDurationGenerator, Predicate<SkStackPanDescription>? paaSelector = null) {}
+    public static SkStackActiveScanOptions Create(IEnumerable<int> scanDurationGenerator, uint channelMask, Predicate<SkStackPanDescription>? paaSelector = null) {}
 
     protected SkStackActiveScanOptions() {}
 
     public abstract SkStackActiveScanOptions Clone();
     object ICloneable.Clone() {}
   }
 
   public class SkStackClient : IDisposable {
     public static readonly TimeSpan SKSCANDefaultDuration; // = "00:00:00.0480000"
     public static readonly TimeSpan SKSCANMaxDuration; // = "00:02:37.2960000"
     public static readonly TimeSpan SKSCANMinDuration; // = "00:00:00.0192000"
 
     public event EventHandler<SkStackPanaSessionEventArgs>? PanaSessionEstablished;
     public event EventHandler<SkStackPanaSessionEventArgs>? PanaSessionExpired;
     public event EventHandler<SkStackPanaSessionEventArgs>? PanaSessionTerminated;
     public event EventHandler<SkStackEventArgs>? Slept;
     public event EventHandler<SkStackEventArgs>? WokeUp;
 
     public SkStackClient(PipeWriter sender, PipeReader receiver, SkStackERXUDPDataFormat erxudpDataFormat = SkStackERXUDPDataFormat.Binary, ILogger? logger = null) {}
     public SkStackClient(Stream stream, bool leaveStreamOpen = true, SkStackERXUDPDataFormat erxudpDataFormat = SkStackERXUDPDataFormat.Binary, ILogger? logger = null) {}
 
     public SkStackERXUDPDataFormat ERXUDPDataFormat { get; protected set; }
     [MemberNotNullWhen(true, "PanaSessionPeerAddress")]
     public bool IsPanaSessionAlive { [MemberNotNullWhen(true, "PanaSessionPeerAddress")] get; }
     protected ILogger? Logger { get; }
     public IPAddress? PanaSessionPeerAddress { get; }
     public TimeSpan ReceiveResponseDelay { get; set; }
     public TimeSpan ReceiveUdpPollingInterval { get; set; }
     public ISynchronizeInvoke? SynchronizingObject { get; set; }
 
     public ValueTask<IReadOnlyList<SkStackPanDescription>> ActiveScanAsync(Action<IBufferWriter<byte>> writeRBID, Action<IBufferWriter<byte>> writePassword, SkStackActiveScanOptions? scanOptions = null, CancellationToken cancellationToken = default) {}
     public ValueTask<IReadOnlyList<SkStackPanDescription>> ActiveScanAsync(ReadOnlyMemory<byte> rbid, ReadOnlyMemory<byte> password, SkStackActiveScanOptions? scanOptions = null, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackPanaSessionInfo> AuthenticateAsPanaClientAsync(Action<IBufferWriter<byte>> writeRBID, Action<IBufferWriter<byte>> writePassword, IPAddress paaAddress, SkStackChannel channel, int panId, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackPanaSessionInfo> AuthenticateAsPanaClientAsync(Action<IBufferWriter<byte>> writeRBID, Action<IBufferWriter<byte>> writePassword, PhysicalAddress paaMacAddress, SkStackChannel channel, int panId, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackPanaSessionInfo> AuthenticateAsPanaClientAsync(Action<IBufferWriter<byte>> writeRBID, Action<IBufferWriter<byte>> writePassword, SkStackActiveScanOptions? scanOptions = null, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackPanaSessionInfo> AuthenticateAsPanaClientAsync(Action<IBufferWriter<byte>> writeRBID, Action<IBufferWriter<byte>> writePassword, SkStackPanDescription pan, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackPanaSessionInfo> AuthenticateAsPanaClientAsync(ReadOnlyMemory<byte> rbid, ReadOnlyMemory<byte> password, IPAddress paaAddress, SkStackChannel channel, int panId, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackPanaSessionInfo> AuthenticateAsPanaClientAsync(ReadOnlyMemory<byte> rbid, ReadOnlyMemory<byte> password, IPAddress paaAddress, int channelNumber, int panId, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackPanaSessionInfo> AuthenticateAsPanaClientAsync(ReadOnlyMemory<byte> rbid, ReadOnlyMemory<byte> password, PhysicalAddress paaMacAddress, SkStackChannel channel, int panId, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackPanaSessionInfo> AuthenticateAsPanaClientAsync(ReadOnlyMemory<byte> rbid, ReadOnlyMemory<byte> password, PhysicalAddress paaMacAddress, int channelNumber, int panId, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackPanaSessionInfo> AuthenticateAsPanaClientAsync(ReadOnlyMemory<byte> rbid, ReadOnlyMemory<byte> password, SkStackActiveScanOptions? scanOptions = null, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackPanaSessionInfo> AuthenticateAsPanaClientAsync(ReadOnlyMemory<byte> rbid, ReadOnlyMemory<byte> password, SkStackPanDescription pan, CancellationToken cancellationToken = default) {}
     public async ValueTask<IPAddress> ConvertToIPv6LinkLocalAddressAsync(PhysicalAddress macAddress, CancellationToken cancellationToken = default) {}
     public ValueTask DisableFlashMemoryAutoLoadAsync(CancellationToken cancellationToken = default) {}
     protected virtual void Dispose(bool disposing) {}
     public void Dispose() {}
     public ValueTask EnableFlashMemoryAutoLoadAsync(CancellationToken cancellationToken = default) {}
     public async ValueTask<IReadOnlyList<IPAddress>> GetAvailableAddressListAsync(CancellationToken cancellationToken = default) {}
     public async ValueTask<IReadOnlyList<SkStackUdpPort>> GetListeningUdpPortListAsync(CancellationToken cancellationToken = default) {}
     public async ValueTask<IReadOnlyDictionary<IPAddress, PhysicalAddress>> GetNeighborCacheListAsync(CancellationToken cancellationToken = default) {}
     public async ValueTask<IReadOnlyList<SkStackUdpPortHandle>> GetUnusedUdpPortHandleListAsync(CancellationToken cancellationToken = default) {}
     public async ValueTask LoadFlashMemoryAsync(CancellationToken cancellationToken = default) {}
     public async ValueTask<SkStackUdpPort> PrepareUdpPortAsync(int port, CancellationToken cancellationToken = default) {}
     public ValueTask<IPAddress> ReceiveUdpAsync(int port, IBufferWriter<byte> buffer, CancellationToken cancellationToken = default) {}
     public ValueTask<IPAddress> ReceiveUdpEchonetLiteAsync(IBufferWriter<byte> buffer, CancellationToken cancellationToken = default) {}
     public ValueTask SaveFlashMemoryAsync(SkStackFlashMemoryWriteRestriction restriction, CancellationToken cancellationToken = default) {}
     internal protected ValueTask<SkStackResponse<TPayload>> SendCommandAsync<TPayload>(ReadOnlyMemory<byte> command, Action<ISkStackCommandLineWriter>? writeArguments, SkStackSequenceParser<TPayload> parseResponsePayload, SkStackProtocolSyntax? syntax = null, bool throwIfErrorStatus = true, CancellationToken cancellationToken = default) {}
     internal protected async ValueTask<SkStackResponse> SendCommandAsync(ReadOnlyMemory<byte> command, Action<ISkStackCommandLineWriter>? writeArguments = null, SkStackProtocolSyntax? syntax = null, bool throwIfErrorStatus = true, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse> SendSKADDNBRAsync(IPAddress ipv6Address, PhysicalAddress macAddress, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse<string>> SendSKAPPVERAsync(CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse> SendSKDSLEEPAsync(bool waitUntilWakeUp = false, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse> SendSKERASEAsync(CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse<(IPAddress LinkLocalAddress, PhysicalAddress MacAddress, SkStackChannel Channel, int PanId, int Addr16)>> SendSKINFOAsync(CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse> SendSKJOINAsync(IPAddress ipv6address, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse<IPAddress>> SendSKLL64Async(PhysicalAddress macAddress, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse> SendSKLOADAsync(CancellationToken cancellationToken = default) {}
     public ValueTask<(SkStackResponse Response, IPAddress Address)> SendSKREJOINAsync(CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse> SendSKRESETAsync(CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse> SendSKSAVEAsync(CancellationToken cancellationToken = default) {}
     public ValueTask<(SkStackResponse Response, IReadOnlyList<SkStackPanDescription> PanDescriptions)> SendSKSCANActiveScanAsync(TimeSpan duration = default, uint channelMask = uint.MaxValue, CancellationToken cancellationToken = default) {}
     public ValueTask<(SkStackResponse Response, IReadOnlyList<SkStackPanDescription> PanDescriptions)> SendSKSCANActiveScanAsync(int durationFactor, uint channelMask = uint.MaxValue, CancellationToken cancellationToken = default) {}
     public ValueTask<(SkStackResponse Response, IReadOnlyList<SkStackPanDescription> PanDescriptions)> SendSKSCANActiveScanPairAsync(TimeSpan duration = default, uint channelMask = uint.MaxValue, CancellationToken cancellationToken = default) {}
     public ValueTask<(SkStackResponse Response, IReadOnlyList<SkStackPanDescription> PanDescriptions)> SendSKSCANActiveScanPairAsync(int durationFactor, uint channelMask = uint.MaxValue, CancellationToken cancellationToken = default) {}
     public ValueTask<(SkStackResponse Response, IReadOnlyDictionary<SkStackChannel, decimal> ScanResult)> SendSKSCANEnergyDetectScanAsync(TimeSpan duration = default, uint channelMask = uint.MaxValue, CancellationToken cancellationToken = default) {}
     public ValueTask<(SkStackResponse Response, IReadOnlyDictionary<SkStackChannel, decimal> ScanResult)> SendSKSCANEnergyDetectScanAsync(int durationFactor, uint channelMask = uint.MaxValue, CancellationToken cancellationToken = default) {}
     public ValueTask<(SkStackResponse Response, bool IsCompletedSuccessfully)> SendSKSENDTOAsync(SkStackUdpPort port, IPAddress destinationAddress, int destinationPort, ReadOnlyMemory<byte> data, SkStackUdpEncryption encryption = SkStackUdpEncryption.EncryptIfAble, CancellationToken cancellationToken = default) {}
     public ValueTask<(SkStackResponse Response, bool IsCompletedSuccessfully)> SendSKSENDTOAsync(SkStackUdpPort port, IPEndPoint destination, ReadOnlyMemory<byte> data, SkStackUdpEncryption encryption = SkStackUdpEncryption.EncryptIfAble, CancellationToken cancellationToken = default) {}
     public ValueTask<(SkStackResponse Response, bool IsCompletedSuccessfully)> SendSKSENDTOAsync(SkStackUdpPortHandle handle, IPAddress destinationAddress, int destinationPort, ReadOnlyMemory<byte> data, SkStackUdpEncryption encryption = SkStackUdpEncryption.EncryptIfAble, CancellationToken cancellationToken = default) {}
     public ValueTask<(SkStackResponse Response, bool IsCompletedSuccessfully)> SendSKSENDTOAsync(SkStackUdpPortHandle handle, IPEndPoint destination, ReadOnlyMemory<byte> data, SkStackUdpEncryption encryption = SkStackUdpEncryption.EncryptIfAble, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse> SendSKSETPWDAsync(Action<IBufferWriter<byte>> writePassword, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse> SendSKSETPWDAsync(ReadOnlyMemory<byte> password, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse> SendSKSETPWDAsync(ReadOnlyMemory<char> password, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse> SendSKSETRBIDAsync(Action<IBufferWriter<byte>> writeRBID, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse> SendSKSETRBIDAsync(ReadOnlyMemory<byte> id, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse> SendSKSETRBIDAsync(ReadOnlyMemory<char> id, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse<TValue>> SendSKSREGAsync<TValue>(SkStackRegister.RegisterEntry<TValue> register, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse> SendSKSREGAsync<TValue>(SkStackRegister.RegisterEntry<TValue> register, TValue @value, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse<IReadOnlyList<IPAddress>>> SendSKTABLEAvailableAddressListAsync(CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse<IReadOnlyList<SkStackUdpPort>>> SendSKTABLEListeningPortListAsync(CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse<IReadOnlyDictionary<IPAddress, PhysicalAddress>>> SendSKTABLENeighborCacheListAsync(CancellationToken cancellationToken = default) {}
     public async ValueTask<(SkStackResponse Response, bool IsCompletedSuccessfully)> SendSKTERMAsync(CancellationToken cancellationToken = default) {}
     public ValueTask<(SkStackResponse Response, SkStackUdpPort UdpPort)> SendSKUDPPORTAsync(SkStackUdpPortHandle handle, int port, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse> SendSKUDPPORTUnsetAsync(SkStackUdpPortHandle handle, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse<Version>> SendSKVERAsync(CancellationToken cancellationToken = default) {}
     public ValueTask SendUdpEchonetLiteAsync(ReadOnlyMemory<byte> buffer, ResiliencePipeline? resiliencePipeline = null, CancellationToken cancellationToken = default) {}
     protected async ValueTask SetFlashMemoryAutoLoadAsync(bool trueIfEnable, CancellationToken cancellationToken = default) {}
     public void StartCapturingUdpReceiveEvents(int port) {}
     public void StopCapturingUdpReceiveEvents(int port) {}
     public ValueTask<bool> TerminatePanaSessionAsync(CancellationToken cancellationToken = default) {}
     protected void ThrowIfDisposed() {}
     internal protected void ThrowIfPanaSessionAlreadyEstablished() {}
     [MemberNotNull("PanaSessionPeerAddress")]
     internal protected void ThrowIfPanaSessionIsNotEstablished() {}
   }
 
   public class SkStackCommandNotSupportedException : SkStackErrorResponseException {
   }
 
   public class SkStackErrorResponseException : SkStackResponseException {
     public SkStackErrorCode ErrorCode { get; }
     public string ErrorText { get; }
     public SkStackResponse Response { get; }
   }
 
   public class SkStackEventArgs : EventArgs {
     public SkStackEventNumber EventNumber { get; }
   }
 
   public class SkStackFlashMemoryIOException : SkStackErrorResponseException {
   }
 
   public abstract class SkStackFlashMemoryWriteRestriction {
     public static SkStackFlashMemoryWriteRestriction CreateGrantIfElapsed(TimeSpan interval) {}
     public static SkStackFlashMemoryWriteRestriction DangerousCreateAlwaysGrant() {}
 
     protected SkStackFlashMemoryWriteRestriction() {}
 
     internal protected abstract bool IsRestricted();
   }
 
   public static class SkStackKnownPortNumbers {
     public const int EchonetLite = 3610;
     public const int Pana = 716;
   }
 
   public class SkStackPanaSessionEstablishmentException : SkStackPanaSessionException {
     public SkStackChannel? Channel { get; }
     public IPAddress? PaaAddress { get; }
     public int? PanId { get; }
   }
 
   public sealed class SkStackPanaSessionEventArgs : SkStackEventArgs {
     public IPAddress PanaSessionPeerAddress { get; }
   }
 
   public abstract class SkStackPanaSessionException : InvalidOperationException {
     public IPAddress Address { get; }
     public SkStackEventNumber EventNumber { get; }
   }
 
   public sealed class SkStackPanaSessionInfo {
     public SkStackChannel Channel { get; }
     public IPAddress LocalAddress { get; }
     public PhysicalAddress LocalMacAddress { get; }
     public int PanId { get; }
     public IPAddress PeerAddress { get; }
     public PhysicalAddress PeerMacAddress { get; }
   }
 
   public static class SkStackRegister {
     public abstract class RegisterEntry<TValue> {
       private protected delegate bool ExpectValueFunc(ref SequenceReader<byte> reader, out TValue @value);
 
       public bool IsReadable { get; }
       public bool IsWritable { get; }
       public TValue MaxValue { get; }
       public TValue MinValue { get; }
       public string Name { get; }
     }
 
     public static SkStackRegister.RegisterEntry<bool> AcceptIcmpEcho { get; }
     public static SkStackRegister.RegisterEntry<ulong> AccumulatedSendTimeInMilliseconds { get; }
     public static SkStackRegister.RegisterEntry<SkStackChannel> Channel { get; }
     public static SkStackRegister.RegisterEntry<bool> EnableAutoLoad { get; }
     public static SkStackRegister.RegisterEntry<bool> EnableAutoReauthentication { get; }
     public static SkStackRegister.RegisterEntry<bool> EnableEchoback { get; }
     public static SkStackRegister.RegisterEntry<bool> EncryptIPMulticast { get; }
     public static SkStackRegister.RegisterEntry<uint> FrameCounter { get; }
     public static SkStackRegister.RegisterEntry<bool> IsSendingRestricted { get; }
     public static SkStackRegister.RegisterEntry<ReadOnlyMemory<byte>> PairingId { get; }
     public static SkStackRegister.RegisterEntry<ushort> PanId { get; }
     public static SkStackRegister.RegisterEntry<TimeSpan> PanaSessionLifetimeInSeconds { get; }
     public static SkStackRegister.RegisterEntry<bool> RespondBeaconRequest { get; }
     public static SkStackRegister.RegisterEntry<SkStackChannel> S02 { get; }
     public static SkStackRegister.RegisterEntry<ushort> S03 { get; }
     public static SkStackRegister.RegisterEntry<uint> S07 { get; }
     public static SkStackRegister.RegisterEntry<ReadOnlyMemory<byte>> S0A { get; }
     public static SkStackRegister.RegisterEntry<bool> S15 { get; }
     public static SkStackRegister.RegisterEntry<TimeSpan> S16 { get; }
     public static SkStackRegister.RegisterEntry<bool> S17 { get; }
     public static SkStackRegister.RegisterEntry<bool> SA0 { get; }
     public static SkStackRegister.RegisterEntry<bool> SA1 { get; }
     public static SkStackRegister.RegisterEntry<bool> SFB { get; }
     public static SkStackRegister.RegisterEntry<ulong> SFD { get; }
     public static SkStackRegister.RegisterEntry<bool> SFE { get; }
     public static SkStackRegister.RegisterEntry<bool> SFF { get; }
   }
 
   public class SkStackResponse {
     public SkStackResponseStatus Status { get; }
     public ReadOnlyMemory<byte> StatusText { get; }
     public bool Success { get; }
   }
 
   public class SkStackResponseException : InvalidOperationException {
     public SkStackResponseException() {}
     public SkStackResponseException(string message) {}
     public SkStackResponseException(string message, Exception? innerException = null) {}
   }
 
   public class SkStackResponse<TPayload> : SkStackResponse {
     public TPayload Payload { get; }
   }
 
   public class SkStackUartIOException : SkStackErrorResponseException {
   }
 
   public class SkStackUdpSendFailedException : InvalidOperationException {
     public SkStackUdpSendFailedException() {}
     public SkStackUdpSendFailedException(string message) {}
     public SkStackUdpSendFailedException(string message, Exception? innerException = null) {}
     public SkStackUdpSendFailedException(string message, SkStackUdpPortHandle portHandle, IPAddress peerAddress, Exception? innerException = null) {}
 
     public IPAddress? PeerAddress { get; }
     public SkStackUdpPortHandle PortHandle { get; }
   }
 
   public class SkStackUdpSendResultIndeterminateException : InvalidOperationException {
     public SkStackUdpSendResultIndeterminateException() {}
     public SkStackUdpSendResultIndeterminateException(string message) {}
     public SkStackUdpSendResultIndeterminateException(string message, Exception? innerException = null) {}
   }
 
   public readonly struct SkStackChannel :
     IComparable<SkStackChannel>,
     IEquatable<SkStackChannel>
   {
     public static readonly IReadOnlyDictionary<int, SkStackChannel> Channels; // = "System.Collections.Generic.Dictionary`2[System.Int32,Smdn.Net.SkStackIP.SkStackChannel]"
     public static readonly SkStackChannel Empty; // = "0ch (S02=0x00, 0 MHz)"
 
     public static SkStackChannel Channel33 { get; }
     public static SkStackChannel Channel34 { get; }
     public static SkStackChannel Channel35 { get; }
     public static SkStackChannel Channel36 { get; }
     public static SkStackChannel Channel37 { get; }
     public static SkStackChannel Channel38 { get; }
     public static SkStackChannel Channel39 { get; }
     public static SkStackChannel Channel40 { get; }
     public static SkStackChannel Channel41 { get; }
     public static SkStackChannel Channel42 { get; }
     public static SkStackChannel Channel43 { get; }
     public static SkStackChannel Channel44 { get; }
     public static SkStackChannel Channel45 { get; }
     public static SkStackChannel Channel46 { get; }
     public static SkStackChannel Channel47 { get; }
     public static SkStackChannel Channel48 { get; }
     public static SkStackChannel Channel49 { get; }
     public static SkStackChannel Channel50 { get; }
     public static SkStackChannel Channel51 { get; }
     public static SkStackChannel Channel52 { get; }
     public static SkStackChannel Channel53 { get; }
     public static SkStackChannel Channel54 { get; }
     public static SkStackChannel Channel55 { get; }
     public static SkStackChannel Channel56 { get; }
     public static SkStackChannel Channel57 { get; }
     public static SkStackChannel Channel58 { get; }
     public static SkStackChannel Channel59 { get; }
     public static SkStackChannel Channel60 { get; }
 
+    public static uint CreateMask(params SkStackChannel[] channels) {}
     public static bool operator == (SkStackChannel x, SkStackChannel y) {}
     public static bool operator != (SkStackChannel x, SkStackChannel y) {}
 
     public int ChannelNumber { get; }
     public decimal FrequencyMHz { get; }
     public bool IsEmpty { get; }
 
     public bool Equals(SkStackChannel other) {}
     public override bool Equals(object? obj) {}
     public override int GetHashCode() {}
     int IComparable<SkStackChannel>.CompareTo(SkStackChannel other) {}
     public override string ToString() {}
   }
 
   public readonly struct SkStackPanDescription {
     public SkStackChannel Channel { get; }
     public int ChannelPage { get; }
     public int Id { get; }
     public PhysicalAddress MacAddress { get; }
     public uint PairingId { get; }
     public decimal Rssi { get; }
 
     public override string ToString() {}
   }
 
   public readonly struct SkStackUdpPort {
     public static readonly SkStackUdpPort Null; // = "0 (#0)"
 
     public SkStackUdpPortHandle Handle { get; }
     public bool IsNull { get; }
     public bool IsUnused { get; }
     public int Port { get; }
 
     public override string ToString() {}
   }
 }
 
 namespace Smdn.Net.SkStackIP.Protocol {
   public delegate TResult SkStackSequenceParser<TResult>(ISkStackSequenceParserContext context);
 
   public interface ISkStackCommandLineWriter {
     void WriteMaskedToken(ReadOnlySpan<byte> token);
     void WriteToken(ReadOnlySpan<byte> token);
   }
 
   public interface ISkStackSequenceParserContext {
     ReadOnlySequence<byte> UnparsedSequence { get; }
 
     void Complete();
     void Complete(SequenceReader<byte> consumedReader);
     void Continue();
     ISkStackSequenceParserContext CreateCopy();
     virtual SequenceReader<byte> CreateReader() {}
     void Ignore();
     void SetAsIncomplete();
     void SetAsIncomplete(SequenceReader<byte> incompleteReader);
   }
 
   public abstract class SkStackProtocolSyntax {
     public static SkStackProtocolSyntax Default { get; }
 
     protected SkStackProtocolSyntax() {}
 
     public abstract ReadOnlySpan<byte> EndOfCommandLine { get; }
     public virtual ReadOnlySpan<byte> EndOfEchobackLine { get; }
     public abstract ReadOnlySpan<byte> EndOfStatusLine { get; }
     public abstract bool ExpectStatusLine { get; }
   }
 
   public static class SkStackTokenParser {
     public static bool Expect<TValue>(ref SequenceReader<byte> reader, int length, Converter<ReadOnlySequence<byte>, TValue> converter, [NotNullWhen(true)] out TValue @value) {}
     public static bool ExpectADDR16(ref SequenceReader<byte> reader, out ushort @value) {}
     public static bool ExpectADDR64(ref SequenceReader<byte> reader, [NotNullWhen(true)] out PhysicalAddress? @value) {}
     public static bool ExpectBinary(ref SequenceReader<byte> reader, out bool @value) {}
     public static bool ExpectCHANNEL(ref SequenceReader<byte> reader, out SkStackChannel @value) {}
     public static bool ExpectCharArray(ref SequenceReader<byte> reader, [NotNullWhen(true)] out string? @value) {}
     public static bool ExpectCharArray(ref SequenceReader<byte> reader, out ReadOnlyMemory<byte> @value) {}
     public static bool ExpectDecimalNumber(ref SequenceReader<byte> reader, int length, out uint @value) {}
     public static bool ExpectDecimalNumber(ref SequenceReader<byte> reader, out uint @value) {}
     public static bool ExpectEndOfLine(ref SequenceReader<byte> reader) {}
     public static bool ExpectIPADDR(ref SequenceReader<byte> reader, [NotNullWhen(true)] out IPAddress? @value) {}
     public static bool ExpectSequence(ref SequenceReader<byte> reader, ReadOnlySpan<byte> expectedSequence) {}
     public static bool ExpectToken(ref SequenceReader<byte> reader, ReadOnlySpan<byte> expectedToken) {}
     public static bool ExpectUINT16(ref SequenceReader<byte> reader, out ushort @value) {}
     public static bool ExpectUINT32(ref SequenceReader<byte> reader, out uint @value) {}
     public static bool ExpectUINT64(ref SequenceReader<byte> reader, out ulong @value) {}
     public static bool ExpectUINT8(ref SequenceReader<byte> reader, out byte @value) {}
     public static void ToByteSequence(ReadOnlySequence<byte> hexTextSequence, int byteSequenceLength, Span<byte> destination) {}
     public static bool TryExpectStatusLine(ref SequenceReader<byte> reader, out SkStackResponseStatus status) {}
     public static OperationStatus TryExpectToken(ref SequenceReader<byte> reader, ReadOnlySpan<byte> expectedToken) {}
   }
 
   public class SkStackUnexpectedResponseException : SkStackResponseException {
     public string? CausedText { get; }
   }
 }
 // API list generated by Smdn.Reflection.ReverseGenerating.ListApi.MSBuild.Tasks v1.4.1.0.
 // Smdn.Reflection.ReverseGenerating.ListApi.Core v1.3.1.0 (https://github.com/smdn/Smdn.Reflection.ReverseGenerating)
diff --git a/doc/api-list/Smdn.Net.SkStackIP/Smdn.Net.SkStackIP-netstandard2.1.apilist.cs b/doc/api-list/Smdn.Net.SkStackIP/Smdn.Net.SkStackIP-netstandard2.1.apilist.cs
index b6b4a76..50b4d7d 100644
--- a/doc/api-list/Smdn.Net.SkStackIP/Smdn.Net.SkStackIP-netstandard2.1.apilist.cs
+++ b/doc/api-list/Smdn.Net.SkStackIP/Smdn.Net.SkStackIP-netstandard2.1.apilist.cs
@@ -1,466 +1,471 @@
-// Smdn.Net.SkStackIP.dll (Smdn.Net.SkStackIP-1.2.0)
+// Smdn.Net.SkStackIP.dll (Smdn.Net.SkStackIP-1.3.0)
 //   Name: Smdn.Net.SkStackIP
-//   AssemblyVersion: 1.2.0.0
-//   InformationalVersion: 1.2.0+0e506f4265dfd6eb80e5f98b4486e10a5cda9d99
+//   AssemblyVersion: 1.3.0.0
+//   InformationalVersion: 1.3.0+7931ab6db93341f49b92e060d48f76286ce36ded
 //   TargetFramework: .NETStandard,Version=v2.1
 //   Configuration: Release
 //   Referenced assemblies:
 //     Microsoft.Extensions.Logging.Abstractions, Version=8.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60
 //     Polly.Core, Version=8.0.0.0, Culture=neutral, PublicKeyToken=c8a3ffc3f8f825cc
 //     Smdn.Fundamental.ControlPicture, Version=3.0.0.1, Culture=neutral
 //     Smdn.Fundamental.Encoding.Buffer, Version=3.0.0.0, Culture=neutral
 //     Smdn.Fundamental.PrintableEncoding.Hexadecimal, Version=3.0.0.0, Culture=neutral
 //     System.IO.Pipelines, Version=8.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
 //     netstandard, Version=2.1.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
 #nullable enable annotations
 
 using System;
 using System.Buffers;
 using System.Collections.Generic;
 using System.ComponentModel;
 using System.Diagnostics.CodeAnalysis;
 using System.IO;
 using System.IO.Pipelines;
 using System.Net;
 using System.Net.NetworkInformation;
 using System.Threading;
 using System.Threading.Tasks;
 using Microsoft.Extensions.Logging;
 using Polly;
 using Smdn.Net.SkStackIP;
 using Smdn.Net.SkStackIP.Protocol;
 
 namespace Smdn.Net.SkStackIP {
   public enum SkStackERXUDPDataFormat : int {
     Binary = 0,
     HexAsciiText = 1,
   }
 
   public enum SkStackErrorCode : int {
     ER01 = 1,
     ER02 = 2,
     ER03 = 3,
     ER04 = 4,
     ER05 = 5,
     ER06 = 6,
     ER07 = 7,
     ER08 = 8,
     ER09 = 9,
     ER10 = 10,
     Undefined = 0,
   }
 
   public enum SkStackEventNumber : byte {
     ActiveScanCompleted = 34,
     BeaconReceived = 32,
     EchoRequestReceived = 5,
     EnergyDetectScanCompleted = 31,
     NeighborAdvertisementReceived = 2,
     NeighborSolicitationReceived = 1,
     PanaSessionEstablishmentCompleted = 37,
     PanaSessionEstablishmentError = 36,
     PanaSessionExpired = 41,
     PanaSessionTerminationCompleted = 39,
     PanaSessionTerminationRequestReceived = 38,
     PanaSessionTerminationTimedOut = 40,
     TransmissionTimeControlLimitationActivated = 50,
     TransmissionTimeControlLimitationDeactivated = 51,
     UdpSendCompleted = 33,
     Undefined = 0,
     WakeupSignalReceived = 192,
   }
 
   public enum SkStackResponseStatus : int {
     Fail = -1,
     Ok = 1,
     Undetermined = 0,
   }
 
   public enum SkStackUdpEncryption : byte {
     EncryptIfAble = 2,
     ForceEncrypt = 1,
     ForcePlainText = 0,
   }
 
   public enum SkStackUdpPortHandle : byte {
     Handle1 = 1,
     Handle2 = 2,
     Handle3 = 3,
     Handle4 = 4,
     Handle5 = 5,
     Handle6 = 6,
     None = 0,
   }
 
   public abstract class SkStackActiveScanOptions : ICloneable {
     public static SkStackActiveScanOptions Default { get; }
     public static SkStackActiveScanOptions Null { get; }
     public static SkStackActiveScanOptions ScanUntilFind { get; }
 
+    public static SkStackActiveScanOptions Create(Func<IEnumerable<int>> scanDurationGeneratorFunc, PhysicalAddress paaMacAddress) {}
+    public static SkStackActiveScanOptions Create(Func<IEnumerable<int>> scanDurationGeneratorFunc, Predicate<SkStackPanDescription>? paaSelector = null) {}
+    public static SkStackActiveScanOptions Create(Func<IEnumerable<int>> scanDurationGeneratorFunc, uint channelMask, Predicate<SkStackPanDescription>? paaSelector = null) {}
     public static SkStackActiveScanOptions Create(IEnumerable<int> scanDurationGenerator, PhysicalAddress paaMacAddress) {}
     public static SkStackActiveScanOptions Create(IEnumerable<int> scanDurationGenerator, Predicate<SkStackPanDescription>? paaSelector = null) {}
+    public static SkStackActiveScanOptions Create(IEnumerable<int> scanDurationGenerator, uint channelMask, Predicate<SkStackPanDescription>? paaSelector = null) {}
 
     protected SkStackActiveScanOptions() {}
 
     public abstract SkStackActiveScanOptions Clone();
     object ICloneable.Clone() {}
   }
 
   public class SkStackClient : IDisposable {
     public static readonly TimeSpan SKSCANDefaultDuration; // = "00:00:00.0480000"
     public static readonly TimeSpan SKSCANMaxDuration; // = "00:02:37.2960000"
     public static readonly TimeSpan SKSCANMinDuration; // = "00:00:00.0192000"
 
     public event EventHandler<SkStackPanaSessionEventArgs>? PanaSessionEstablished;
     public event EventHandler<SkStackPanaSessionEventArgs>? PanaSessionExpired;
     public event EventHandler<SkStackPanaSessionEventArgs>? PanaSessionTerminated;
     public event EventHandler<SkStackEventArgs>? Slept;
     public event EventHandler<SkStackEventArgs>? WokeUp;
 
     public SkStackClient(PipeWriter sender, PipeReader receiver, SkStackERXUDPDataFormat erxudpDataFormat = SkStackERXUDPDataFormat.Binary, ILogger? logger = null) {}
     public SkStackClient(Stream stream, bool leaveStreamOpen = true, SkStackERXUDPDataFormat erxudpDataFormat = SkStackERXUDPDataFormat.Binary, ILogger? logger = null) {}
 
     public SkStackERXUDPDataFormat ERXUDPDataFormat { get; protected set; }
     public bool IsPanaSessionAlive { get; }
     protected ILogger? Logger { get; }
     public IPAddress? PanaSessionPeerAddress { get; }
     public TimeSpan ReceiveResponseDelay { get; set; }
     public TimeSpan ReceiveUdpPollingInterval { get; set; }
     public ISynchronizeInvoke? SynchronizingObject { get; set; }
 
     public ValueTask<IReadOnlyList<SkStackPanDescription>> ActiveScanAsync(Action<IBufferWriter<byte>> writeRBID, Action<IBufferWriter<byte>> writePassword, SkStackActiveScanOptions? scanOptions = null, CancellationToken cancellationToken = default) {}
     public ValueTask<IReadOnlyList<SkStackPanDescription>> ActiveScanAsync(ReadOnlyMemory<byte> rbid, ReadOnlyMemory<byte> password, SkStackActiveScanOptions? scanOptions = null, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackPanaSessionInfo> AuthenticateAsPanaClientAsync(Action<IBufferWriter<byte>> writeRBID, Action<IBufferWriter<byte>> writePassword, IPAddress paaAddress, SkStackChannel channel, int panId, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackPanaSessionInfo> AuthenticateAsPanaClientAsync(Action<IBufferWriter<byte>> writeRBID, Action<IBufferWriter<byte>> writePassword, PhysicalAddress paaMacAddress, SkStackChannel channel, int panId, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackPanaSessionInfo> AuthenticateAsPanaClientAsync(Action<IBufferWriter<byte>> writeRBID, Action<IBufferWriter<byte>> writePassword, SkStackActiveScanOptions? scanOptions = null, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackPanaSessionInfo> AuthenticateAsPanaClientAsync(Action<IBufferWriter<byte>> writeRBID, Action<IBufferWriter<byte>> writePassword, SkStackPanDescription pan, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackPanaSessionInfo> AuthenticateAsPanaClientAsync(ReadOnlyMemory<byte> rbid, ReadOnlyMemory<byte> password, IPAddress paaAddress, SkStackChannel channel, int panId, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackPanaSessionInfo> AuthenticateAsPanaClientAsync(ReadOnlyMemory<byte> rbid, ReadOnlyMemory<byte> password, IPAddress paaAddress, int channelNumber, int panId, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackPanaSessionInfo> AuthenticateAsPanaClientAsync(ReadOnlyMemory<byte> rbid, ReadOnlyMemory<byte> password, PhysicalAddress paaMacAddress, SkStackChannel channel, int panId, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackPanaSessionInfo> AuthenticateAsPanaClientAsync(ReadOnlyMemory<byte> rbid, ReadOnlyMemory<byte> password, PhysicalAddress paaMacAddress, int channelNumber, int panId, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackPanaSessionInfo> AuthenticateAsPanaClientAsync(ReadOnlyMemory<byte> rbid, ReadOnlyMemory<byte> password, SkStackActiveScanOptions? scanOptions = null, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackPanaSessionInfo> AuthenticateAsPanaClientAsync(ReadOnlyMemory<byte> rbid, ReadOnlyMemory<byte> password, SkStackPanDescription pan, CancellationToken cancellationToken = default) {}
     public async ValueTask<IPAddress> ConvertToIPv6LinkLocalAddressAsync(PhysicalAddress macAddress, CancellationToken cancellationToken = default) {}
     public ValueTask DisableFlashMemoryAutoLoadAsync(CancellationToken cancellationToken = default) {}
     protected virtual void Dispose(bool disposing) {}
     public void Dispose() {}
     public ValueTask EnableFlashMemoryAutoLoadAsync(CancellationToken cancellationToken = default) {}
     public async ValueTask<IReadOnlyList<IPAddress>> GetAvailableAddressListAsync(CancellationToken cancellationToken = default) {}
     public async ValueTask<IReadOnlyList<SkStackUdpPort>> GetListeningUdpPortListAsync(CancellationToken cancellationToken = default) {}
     public async ValueTask<IReadOnlyDictionary<IPAddress, PhysicalAddress>> GetNeighborCacheListAsync(CancellationToken cancellationToken = default) {}
     public async ValueTask<IReadOnlyList<SkStackUdpPortHandle>> GetUnusedUdpPortHandleListAsync(CancellationToken cancellationToken = default) {}
     public async ValueTask LoadFlashMemoryAsync(CancellationToken cancellationToken = default) {}
     public async ValueTask<SkStackUdpPort> PrepareUdpPortAsync(int port, CancellationToken cancellationToken = default) {}
     public ValueTask<IPAddress> ReceiveUdpAsync(int port, IBufferWriter<byte> buffer, CancellationToken cancellationToken = default) {}
     public ValueTask<IPAddress> ReceiveUdpEchonetLiteAsync(IBufferWriter<byte> buffer, CancellationToken cancellationToken = default) {}
     public ValueTask SaveFlashMemoryAsync(SkStackFlashMemoryWriteRestriction restriction, CancellationToken cancellationToken = default) {}
     internal protected ValueTask<SkStackResponse<TPayload>> SendCommandAsync<TPayload>(ReadOnlyMemory<byte> command, Action<ISkStackCommandLineWriter>? writeArguments, SkStackSequenceParser<TPayload> parseResponsePayload, SkStackProtocolSyntax? syntax = null, bool throwIfErrorStatus = true, CancellationToken cancellationToken = default) {}
     internal protected async ValueTask<SkStackResponse> SendCommandAsync(ReadOnlyMemory<byte> command, Action<ISkStackCommandLineWriter>? writeArguments = null, SkStackProtocolSyntax? syntax = null, bool throwIfErrorStatus = true, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse> SendSKADDNBRAsync(IPAddress ipv6Address, PhysicalAddress macAddress, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse<string>> SendSKAPPVERAsync(CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse> SendSKDSLEEPAsync(bool waitUntilWakeUp = false, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse> SendSKERASEAsync(CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse<(IPAddress LinkLocalAddress, PhysicalAddress MacAddress, SkStackChannel Channel, int PanId, int Addr16)>> SendSKINFOAsync(CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse> SendSKJOINAsync(IPAddress ipv6address, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse<IPAddress>> SendSKLL64Async(PhysicalAddress macAddress, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse> SendSKLOADAsync(CancellationToken cancellationToken = default) {}
     public ValueTask<(SkStackResponse Response, IPAddress Address)> SendSKREJOINAsync(CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse> SendSKRESETAsync(CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse> SendSKSAVEAsync(CancellationToken cancellationToken = default) {}
     public ValueTask<(SkStackResponse Response, IReadOnlyList<SkStackPanDescription> PanDescriptions)> SendSKSCANActiveScanAsync(TimeSpan duration = default, uint channelMask = uint.MaxValue, CancellationToken cancellationToken = default) {}
     public ValueTask<(SkStackResponse Response, IReadOnlyList<SkStackPanDescription> PanDescriptions)> SendSKSCANActiveScanAsync(int durationFactor, uint channelMask = uint.MaxValue, CancellationToken cancellationToken = default) {}
     public ValueTask<(SkStackResponse Response, IReadOnlyList<SkStackPanDescription> PanDescriptions)> SendSKSCANActiveScanPairAsync(TimeSpan duration = default, uint channelMask = uint.MaxValue, CancellationToken cancellationToken = default) {}
     public ValueTask<(SkStackResponse Response, IReadOnlyList<SkStackPanDescription> PanDescriptions)> SendSKSCANActiveScanPairAsync(int durationFactor, uint channelMask = uint.MaxValue, CancellationToken cancellationToken = default) {}
     public ValueTask<(SkStackResponse Response, IReadOnlyDictionary<SkStackChannel, decimal> ScanResult)> SendSKSCANEnergyDetectScanAsync(TimeSpan duration = default, uint channelMask = uint.MaxValue, CancellationToken cancellationToken = default) {}
     public ValueTask<(SkStackResponse Response, IReadOnlyDictionary<SkStackChannel, decimal> ScanResult)> SendSKSCANEnergyDetectScanAsync(int durationFactor, uint channelMask = uint.MaxValue, CancellationToken cancellationToken = default) {}
     public ValueTask<(SkStackResponse Response, bool IsCompletedSuccessfully)> SendSKSENDTOAsync(SkStackUdpPort port, IPAddress destinationAddress, int destinationPort, ReadOnlyMemory<byte> data, SkStackUdpEncryption encryption = SkStackUdpEncryption.EncryptIfAble, CancellationToken cancellationToken = default) {}
     public ValueTask<(SkStackResponse Response, bool IsCompletedSuccessfully)> SendSKSENDTOAsync(SkStackUdpPort port, IPEndPoint destination, ReadOnlyMemory<byte> data, SkStackUdpEncryption encryption = SkStackUdpEncryption.EncryptIfAble, CancellationToken cancellationToken = default) {}
     public ValueTask<(SkStackResponse Response, bool IsCompletedSuccessfully)> SendSKSENDTOAsync(SkStackUdpPortHandle handle, IPAddress destinationAddress, int destinationPort, ReadOnlyMemory<byte> data, SkStackUdpEncryption encryption = SkStackUdpEncryption.EncryptIfAble, CancellationToken cancellationToken = default) {}
     public ValueTask<(SkStackResponse Response, bool IsCompletedSuccessfully)> SendSKSENDTOAsync(SkStackUdpPortHandle handle, IPEndPoint destination, ReadOnlyMemory<byte> data, SkStackUdpEncryption encryption = SkStackUdpEncryption.EncryptIfAble, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse> SendSKSETPWDAsync(Action<IBufferWriter<byte>> writePassword, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse> SendSKSETPWDAsync(ReadOnlyMemory<byte> password, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse> SendSKSETPWDAsync(ReadOnlyMemory<char> password, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse> SendSKSETRBIDAsync(Action<IBufferWriter<byte>> writeRBID, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse> SendSKSETRBIDAsync(ReadOnlyMemory<byte> id, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse> SendSKSETRBIDAsync(ReadOnlyMemory<char> id, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse<TValue>> SendSKSREGAsync<TValue>(SkStackRegister.RegisterEntry<TValue> register, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse> SendSKSREGAsync<TValue>(SkStackRegister.RegisterEntry<TValue> register, TValue @value, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse<IReadOnlyList<IPAddress>>> SendSKTABLEAvailableAddressListAsync(CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse<IReadOnlyList<SkStackUdpPort>>> SendSKTABLEListeningPortListAsync(CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse<IReadOnlyDictionary<IPAddress, PhysicalAddress>>> SendSKTABLENeighborCacheListAsync(CancellationToken cancellationToken = default) {}
     public async ValueTask<(SkStackResponse Response, bool IsCompletedSuccessfully)> SendSKTERMAsync(CancellationToken cancellationToken = default) {}
     public ValueTask<(SkStackResponse Response, SkStackUdpPort UdpPort)> SendSKUDPPORTAsync(SkStackUdpPortHandle handle, int port, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse> SendSKUDPPORTUnsetAsync(SkStackUdpPortHandle handle, CancellationToken cancellationToken = default) {}
     public ValueTask<SkStackResponse<Version>> SendSKVERAsync(CancellationToken cancellationToken = default) {}
     public ValueTask SendUdpEchonetLiteAsync(ReadOnlyMemory<byte> buffer, ResiliencePipeline? resiliencePipeline = null, CancellationToken cancellationToken = default) {}
     protected async ValueTask SetFlashMemoryAutoLoadAsync(bool trueIfEnable, CancellationToken cancellationToken = default) {}
     public void StartCapturingUdpReceiveEvents(int port) {}
     public void StopCapturingUdpReceiveEvents(int port) {}
     public ValueTask<bool> TerminatePanaSessionAsync(CancellationToken cancellationToken = default) {}
     protected void ThrowIfDisposed() {}
     internal protected void ThrowIfPanaSessionAlreadyEstablished() {}
     internal protected void ThrowIfPanaSessionIsNotEstablished() {}
   }
 
   public class SkStackCommandNotSupportedException : SkStackErrorResponseException {
   }
 
   public class SkStackErrorResponseException : SkStackResponseException {
     public SkStackErrorCode ErrorCode { get; }
     public string ErrorText { get; }
     public SkStackResponse Response { get; }
   }
 
   public class SkStackEventArgs : EventArgs {
     public SkStackEventNumber EventNumber { get; }
   }
 
   public class SkStackFlashMemoryIOException : SkStackErrorResponseException {
   }
 
   public abstract class SkStackFlashMemoryWriteRestriction {
     public static SkStackFlashMemoryWriteRestriction CreateGrantIfElapsed(TimeSpan interval) {}
     public static SkStackFlashMemoryWriteRestriction DangerousCreateAlwaysGrant() {}
 
     protected SkStackFlashMemoryWriteRestriction() {}
 
     internal protected abstract bool IsRestricted();
   }
 
   public static class SkStackKnownPortNumbers {
     public const int EchonetLite = 3610;
     public const int Pana = 716;
   }
 
   public class SkStackPanaSessionEstablishmentException : SkStackPanaSessionException {
     public SkStackChannel? Channel { get; }
     public IPAddress? PaaAddress { get; }
     public int? PanId { get; }
   }
 
   public sealed class SkStackPanaSessionEventArgs : SkStackEventArgs {
     public IPAddress PanaSessionPeerAddress { get; }
   }
 
   public abstract class SkStackPanaSessionException : InvalidOperationException {
     public IPAddress Address { get; }
     public SkStackEventNumber EventNumber { get; }
   }
 
   public sealed class SkStackPanaSessionInfo {
     public SkStackChannel Channel { get; }
     public IPAddress LocalAddress { get; }
     public PhysicalAddress LocalMacAddress { get; }
     public int PanId { get; }
     public IPAddress PeerAddress { get; }
     public PhysicalAddress PeerMacAddress { get; }
   }
 
   public static class SkStackRegister {
     public abstract class RegisterEntry<TValue> {
       private protected delegate bool ExpectValueFunc(ref SequenceReader<byte> reader, out TValue @value);
 
       public bool IsReadable { get; }
       public bool IsWritable { get; }
       public TValue MaxValue { get; }
       public TValue MinValue { get; }
       public string Name { get; }
     }
 
     public static SkStackRegister.RegisterEntry<bool> AcceptIcmpEcho { get; }
     public static SkStackRegister.RegisterEntry<ulong> AccumulatedSendTimeInMilliseconds { get; }
     public static SkStackRegister.RegisterEntry<SkStackChannel> Channel { get; }
     public static SkStackRegister.RegisterEntry<bool> EnableAutoLoad { get; }
     public static SkStackRegister.RegisterEntry<bool> EnableAutoReauthentication { get; }
     public static SkStackRegister.RegisterEntry<bool> EnableEchoback { get; }
     public static SkStackRegister.RegisterEntry<bool> EncryptIPMulticast { get; }
     public static SkStackRegister.RegisterEntry<uint> FrameCounter { get; }
     public static SkStackRegister.RegisterEntry<bool> IsSendingRestricted { get; }
     public static SkStackRegister.RegisterEntry<ReadOnlyMemory<byte>> PairingId { get; }
     public static SkStackRegister.RegisterEntry<ushort> PanId { get; }
     public static SkStackRegister.RegisterEntry<TimeSpan> PanaSessionLifetimeInSeconds { get; }
     public static SkStackRegister.RegisterEntry<bool> RespondBeaconRequest { get; }
     public static SkStackRegister.RegisterEntry<SkStackChannel> S02 { get; }
     public static SkStackRegister.RegisterEntry<ushort> S03 { get; }
     public static SkStackRegister.RegisterEntry<uint> S07 { get; }
     public static SkStackRegister.RegisterEntry<ReadOnlyMemory<byte>> S0A { get; }
     public static SkStackRegister.RegisterEntry<bool> S15 { get; }
     public static SkStackRegister.RegisterEntry<TimeSpan> S16 { get; }
     public static SkStackRegister.RegisterEntry<bool> S17 { get; }
     public static SkStackRegister.RegisterEntry<bool> SA0 { get; }
     public static SkStackRegister.RegisterEntry<bool> SA1 { get; }
     public static SkStackRegister.RegisterEntry<bool> SFB { get; }
     public static SkStackRegister.RegisterEntry<ulong> SFD { get; }
     public static SkStackRegister.RegisterEntry<bool> SFE { get; }
     public static SkStackRegister.RegisterEntry<bool> SFF { get; }
   }
 
   public class SkStackResponse {
     public SkStackResponseStatus Status { get; }
     public ReadOnlyMemory<byte> StatusText { get; }
     public bool Success { get; }
   }
 
   public class SkStackResponseException : InvalidOperationException {
     public SkStackResponseException() {}
     public SkStackResponseException(string message) {}
     public SkStackResponseException(string message, Exception? innerException = null) {}
   }
 
   public class SkStackResponse<TPayload> : SkStackResponse {
     public TPayload Payload { get; }
   }
 
   public class SkStackUartIOException : SkStackErrorResponseException {
   }
 
   public class SkStackUdpSendFailedException : InvalidOperationException {
     public SkStackUdpSendFailedException() {}
     public SkStackUdpSendFailedException(string message) {}
     public SkStackUdpSendFailedException(string message, Exception? innerException = null) {}
     public SkStackUdpSendFailedException(string message, SkStackUdpPortHandle portHandle, IPAddress peerAddress, Exception? innerException = null) {}
 
     public IPAddress? PeerAddress { get; }
     public SkStackUdpPortHandle PortHandle { get; }
   }
 
   public class SkStackUdpSendResultIndeterminateException : InvalidOperationException {
     public SkStackUdpSendResultIndeterminateException() {}
     public SkStackUdpSendResultIndeterminateException(string message) {}
     public SkStackUdpSendResultIndeterminateException(string message, Exception? innerException = null) {}
   }
 
   public readonly struct SkStackChannel :
     IComparable<SkStackChannel>,
     IEquatable<SkStackChannel>
   {
     public static readonly IReadOnlyDictionary<int, SkStackChannel> Channels; // = "System.Collections.Generic.Dictionary`2[System.Int32,Smdn.Net.SkStackIP.SkStackChannel]"
     public static readonly SkStackChannel Empty; // = "0ch (S02=0x00, 0 MHz)"
 
     public static SkStackChannel Channel33 { get; }
     public static SkStackChannel Channel34 { get; }
     public static SkStackChannel Channel35 { get; }
     public static SkStackChannel Channel36 { get; }
     public static SkStackChannel Channel37 { get; }
     public static SkStackChannel Channel38 { get; }
     public static SkStackChannel Channel39 { get; }
     public static SkStackChannel Channel40 { get; }
     public static SkStackChannel Channel41 { get; }
     public static SkStackChannel Channel42 { get; }
     public static SkStackChannel Channel43 { get; }
     public static SkStackChannel Channel44 { get; }
     public static SkStackChannel Channel45 { get; }
     public static SkStackChannel Channel46 { get; }
     public static SkStackChannel Channel47 { get; }
     public static SkStackChannel Channel48 { get; }
     public static SkStackChannel Channel49 { get; }
     public static SkStackChannel Channel50 { get; }
     public static SkStackChannel Channel51 { get; }
     public static SkStackChannel Channel52 { get; }
     public static SkStackChannel Channel53 { get; }
     public static SkStackChannel Channel54 { get; }
     public static SkStackChannel Channel55 { get; }
     public static SkStackChannel Channel56 { get; }
     public static SkStackChannel Channel57 { get; }
     public static SkStackChannel Channel58 { get; }
     public static SkStackChannel Channel59 { get; }
     public static SkStackChannel Channel60 { get; }
 
+    public static uint CreateMask(params SkStackChannel[] channels) {}
     public static bool operator == (SkStackChannel x, SkStackChannel y) {}
     public static bool operator != (SkStackChannel x, SkStackChannel y) {}
 
     public int ChannelNumber { get; }
     public decimal FrequencyMHz { get; }
     public bool IsEmpty { get; }
 
     public bool Equals(SkStackChannel other) {}
     public override bool Equals(object? obj) {}
     public override int GetHashCode() {}
     int IComparable<SkStackChannel>.CompareTo(SkStackChannel other) {}
     public override string ToString() {}
   }
 
   public readonly struct SkStackPanDescription {
     public SkStackChannel Channel { get; }
     public int ChannelPage { get; }
     public int Id { get; }
     public PhysicalAddress MacAddress { get; }
     public uint PairingId { get; }
     public decimal Rssi { get; }
 
     public override string ToString() {}
   }
 
   public readonly struct SkStackUdpPort {
     public static readonly SkStackUdpPort Null; // = "0 (#0)"
 
     public SkStackUdpPortHandle Handle { get; }
     public bool IsNull { get; }
     public bool IsUnused { get; }
     public int Port { get; }
 
     public override string ToString() {}
   }
 }
 
 namespace Smdn.Net.SkStackIP.Protocol {
   public delegate TResult SkStackSequenceParser<TResult>(ISkStackSequenceParserContext context);
 
   public interface ISkStackCommandLineWriter {
     void WriteMaskedToken(ReadOnlySpan<byte> token);
     void WriteToken(ReadOnlySpan<byte> token);
   }
 
   public interface ISkStackSequenceParserContext {
     ReadOnlySequence<byte> UnparsedSequence { get; }
 
     void Complete();
     void Complete(SequenceReader<byte> consumedReader);
     void Continue();
     ISkStackSequenceParserContext CreateCopy();
     virtual SequenceReader<byte> CreateReader() {}
     void Ignore();
     void SetAsIncomplete();
     void SetAsIncomplete(SequenceReader<byte> incompleteReader);
   }
 
   public abstract class SkStackProtocolSyntax {
     public static SkStackProtocolSyntax Default { get; }
 
     protected SkStackProtocolSyntax() {}
 
     public abstract ReadOnlySpan<byte> EndOfCommandLine { get; }
     public virtual ReadOnlySpan<byte> EndOfEchobackLine { get; }
     public abstract ReadOnlySpan<byte> EndOfStatusLine { get; }
     public abstract bool ExpectStatusLine { get; }
   }
 
   public static class SkStackTokenParser {
     public static bool Expect<TValue>(ref SequenceReader<byte> reader, int length, Converter<ReadOnlySequence<byte>, TValue> converter, [NotNullWhen(true)] out TValue @value) {}
     public static bool ExpectADDR16(ref SequenceReader<byte> reader, out ushort @value) {}
     public static bool ExpectADDR64(ref SequenceReader<byte> reader, [NotNullWhen(true)] out PhysicalAddress? @value) {}
     public static bool ExpectBinary(ref SequenceReader<byte> reader, out bool @value) {}
     public static bool ExpectCHANNEL(ref SequenceReader<byte> reader, out SkStackChannel @value) {}
     public static bool ExpectCharArray(ref SequenceReader<byte> reader, [NotNullWhen(true)] out string? @value) {}
     public static bool ExpectCharArray(ref SequenceReader<byte> reader, out ReadOnlyMemory<byte> @value) {}
     public static bool ExpectDecimalNumber(ref SequenceReader<byte> reader, int length, out uint @value) {}
     public static bool ExpectDecimalNumber(ref SequenceReader<byte> reader, out uint @value) {}
     public static bool ExpectEndOfLine(ref SequenceReader<byte> reader) {}
     public static bool ExpectIPADDR(ref SequenceReader<byte> reader, [NotNullWhen(true)] out IPAddress? @value) {}
     public static bool ExpectSequence(ref SequenceReader<byte> reader, ReadOnlySpan<byte> expectedSequence) {}
     public static bool ExpectToken(ref SequenceReader<byte> reader, ReadOnlySpan<byte> expectedToken) {}
     public static bool ExpectUINT16(ref SequenceReader<byte> reader, out ushort @value) {}
     public static bool ExpectUINT32(ref SequenceReader<byte> reader, out uint @value) {}
     public static bool ExpectUINT64(ref SequenceReader<byte> reader, out ulong @value) {}
     public static bool ExpectUINT8(ref SequenceReader<byte> reader, out byte @value) {}
     public static void ToByteSequence(ReadOnlySequence<byte> hexTextSequence, int byteSequenceLength, Span<byte> destination) {}
     public static bool TryExpectStatusLine(ref SequenceReader<byte> reader, out SkStackResponseStatus status) {}
     public static OperationStatus TryExpectToken(ref SequenceReader<byte> reader, ReadOnlySpan<byte> expectedToken) {}
   }
 
   public class SkStackUnexpectedResponseException : SkStackResponseException {
     public string? CausedText { get; }
   }
 }
 // API list generated by Smdn.Reflection.ReverseGenerating.ListApi.MSBuild.Tasks v1.4.1.0.
 // Smdn.Reflection.ReverseGenerating.ListApi.Core v1.3.1.0 (https://github.com/smdn/Smdn.Reflection.ReverseGenerating)

Full changes

Full changes in this release:
diff --git a/src/Smdn.Net.SkStackIP/Smdn.Net.SkStackIP.csproj b/src/Smdn.Net.SkStackIP/Smdn.Net.SkStackIP.csproj
index ea6840a..9684eff 100644
--- a/src/Smdn.Net.SkStackIP/Smdn.Net.SkStackIP.csproj
+++ b/src/Smdn.Net.SkStackIP/Smdn.Net.SkStackIP.csproj
@@ -5,7 +5,7 @@ SPDX-License-Identifier: MIT
 <Project Sdk="Microsoft.NET.Sdk">
   <PropertyGroup>
     <TargetFrameworks>net8.0;net6.0;netstandard2.1</TargetFrameworks>
-    <VersionPrefix>1.2.0</VersionPrefix>
+    <VersionPrefix>1.3.0</VersionPrefix>
     <VersionSuffix></VersionSuffix>
     <PackageValidationBaselineVersion>1.0.0</PackageValidationBaselineVersion>
     <Nullable>enable</Nullable>
diff --git a/src/Smdn.Net.SkStackIP/Smdn.Net.SkStackIP/SkStackActiveScanOptions.cs b/src/Smdn.Net.SkStackIP/Smdn.Net.SkStackIP/SkStackActiveScanOptions.cs
index 57a96cd..4aa111a 100644
--- a/src/Smdn.Net.SkStackIP/Smdn.Net.SkStackIP/SkStackActiveScanOptions.cs
+++ b/src/Smdn.Net.SkStackIP/Smdn.Net.SkStackIP/SkStackActiveScanOptions.cs
@@ -83,25 +83,133 @@ public abstract class SkStackActiveScanOptions : ICloneable {
   )
     => new UserDefinedActiveScanOptions(
       paaSelector: paaSelector,
+      channelMask: null,
       scanDurationGenerator: scanDurationGenerator
     );
 
-  private sealed class UserDefinedActiveScanOptions : SkStackActiveScanOptions {
+  /// <summary>
+  /// Creates the <see cref="SkStackActiveScanOptions"/> with the custom selection method and duration factors.
+  /// </summary>
+  /// <param name="scanDurationGenerator">A collection or iterator that defines the scan durations.</param>
+  /// <param name="channelMask">
+  /// An unsigned 32-bit value that specifies the channels to scan, by bit flags.
+  /// The least significant bit of this value indicates <see cref="SkStackChannel.Channel33">channel 33</see>.
+  /// This value will be passed to the parameter <c>CHANNEL_MASK</c> in the <c>SKSCAN</c> command.
+  /// </param>
+  /// <param name="paaSelector">
+  /// A callback to select the target PAA from the PAAs found during the scan.
+  /// If <see langword="null"/>, selects the PAA which found at first during the scan.
+  /// </param>
+  /// <seealso cref="SkStackChannel.CreateMask"/>
+  [CLSCompliant(false)]
+  public static SkStackActiveScanOptions Create(
+    IEnumerable<int> scanDurationGenerator,
+    uint channelMask,
+    Predicate<SkStackPanDescription>? paaSelector = null
+  )
+    => new UserDefinedActiveScanOptions(
+      paaSelector: paaSelector,
+      channelMask: channelMask,
+      scanDurationGenerator: scanDurationGenerator
+    );
+
+  /// <summary>
+  /// Creates the <see cref="SkStackActiveScanOptions"/> with the custom selection method and the delegate for generating duration factor.
+  /// </summary>
+  /// <param name="scanDurationGeneratorFunc">A delegate to method that iterates the scan durations.</param>
+  /// <param name="paaSelector">
+  /// A callback to select the target PAA from the PAAs found during the scan.
+  /// If <see langword="null"/>, selects the PAA which found at first during the scan.
+  /// </param>
+  public static SkStackActiveScanOptions Create(
+    Func<IEnumerable<int>> scanDurationGeneratorFunc,
+    Predicate<SkStackPanDescription>? paaSelector = null
+  )
+    => new UserDefinedActiveScanOptions(
+      paaSelector: paaSelector,
+      channelMask: null,
+      scanDurationGeneratorFunc: scanDurationGeneratorFunc
+    );
+
+  /// <summary>
+  /// Creates the <see cref="SkStackActiveScanOptions"/> with the custom selection method and the delegate for generating duration factor.
+  /// </summary>
+  /// <param name="scanDurationGeneratorFunc">A delegate to method that iterates the scan durations.</param>
+  /// <param name="channelMask">
+  /// An unsigned 32-bit value that specifies the channels to scan, by bit flags.
+  /// The least significant bit of this value indicates <see cref="SkStackChannel.Channel33">channel 33</see>.
+  /// This value will be passed to the parameter <c>CHANNEL_MASK</c> in the <c>SKSCAN</c> command.
+  /// </param>
+  /// <param name="paaSelector">
+  /// A callback to select the target PAA from the PAAs found during the scan.
+  /// If <see langword="null"/>, selects the PAA which found at first during the scan.
+  /// </param>
+  /// <seealso cref="SkStackChannel.CreateMask"/>
+  [CLSCompliant(false)]
+  public static SkStackActiveScanOptions Create(
+    Func<IEnumerable<int>> scanDurationGeneratorFunc,
+    uint channelMask,
+    Predicate<SkStackPanDescription>? paaSelector = null
+  )
+    => new UserDefinedActiveScanOptions(
+      paaSelector: paaSelector,
+      channelMask: channelMask,
+      scanDurationGeneratorFunc: scanDurationGeneratorFunc
+    );
+
+  private abstract class ScanDurationGeneratorFuncActiveScanOptions : SkStackActiveScanOptions {
+    private protected Func<IEnumerable<int>> ScanDurationGeneratorFunc { get; }
+
+    public ScanDurationGeneratorFuncActiveScanOptions(
+      IEnumerable<int> scanDurationGenerator
+    )
+    {
+      if (scanDurationGenerator is null)
+        throw new ArgumentNullException(nameof(scanDurationGenerator));
+
+      ScanDurationGeneratorFunc = new(() => scanDurationGenerator);
+    }
+
+    public ScanDurationGeneratorFuncActiveScanOptions(
+      Func<IEnumerable<int>> scanDurationGeneratorFunc
+    )
+    {
+      this.ScanDurationGeneratorFunc = scanDurationGeneratorFunc ?? throw new ArgumentNullException(nameof(scanDurationGeneratorFunc));
+    }
+
+    internal override IEnumerable<int> YieldScanDurationFactors() => ScanDurationGeneratorFunc();
+  }
+
+  private sealed class UserDefinedActiveScanOptions : ScanDurationGeneratorFuncActiveScanOptions {
     private readonly Predicate<SkStackPanDescription>? paaSelector;
-    private readonly IEnumerable<int> scanDurationGenerator;
+    private readonly uint? channelMask;
+
+    internal override uint? ChannelMask => channelMask;
 
     public UserDefinedActiveScanOptions(
       Predicate<SkStackPanDescription>? paaSelector,
+      uint? channelMask,
       IEnumerable<int> scanDurationGenerator
     )
+      : base(scanDurationGenerator ?? throw new ArgumentNullException(nameof(scanDurationGenerator)))
+    {
+      this.paaSelector = paaSelector;
+      this.channelMask = channelMask;
+    }
+
+    public UserDefinedActiveScanOptions(
+      Predicate<SkStackPanDescription>? paaSelector,
+      uint? channelMask,
+      Func<IEnumerable<int>> scanDurationGeneratorFunc
+    )
+      : base(scanDurationGeneratorFunc ?? throw new ArgumentNullException(nameof(scanDurationGeneratorFunc)))
     {
       this.paaSelector = paaSelector;
-      this.scanDurationGenerator = scanDurationGenerator ?? throw new ArgumentNullException(nameof(scanDurationGenerator));
+      this.channelMask = channelMask;
     }
 
-    public override SkStackActiveScanOptions Clone() => new UserDefinedActiveScanOptions(paaSelector, scanDurationGenerator.ToArray());
+    public override SkStackActiveScanOptions Clone() => new UserDefinedActiveScanOptions(paaSelector, channelMask, ScanDurationGeneratorFunc);
     internal override bool SelectPanaAuthenticationAgent(SkStackPanDescription desc) => paaSelector?.Invoke(desc) ?? true;
-    internal override IEnumerable<int> YieldScanDurationFactors() => scanDurationGenerator;
   }
 
   /// <summary>
@@ -120,22 +228,45 @@ public abstract class SkStackActiveScanOptions : ICloneable {
       scanDurationGenerator: scanDurationGenerator
     );
 
-  private sealed class FindByMacAddressActiveScanOptions : SkStackActiveScanOptions {
+  /// <summary>
+  /// Creates the <see cref="SkStackActiveScanOptions"/> with the custom selection method and the delegate for generating duration factor.
+  /// </summary>
+  /// <param name="scanDurationGeneratorFunc">A delegate to method that iterates the scan durations.</param>
+  /// <param name="paaMacAddress">
+  /// A <see cref="PhysicalAddress"/> of the target PAA. This method selects the first PAA found during the scan that matches this <see cref="PhysicalAddress"/>.
+  /// </param>
+  public static SkStackActiveScanOptions Create(
+    Func<IEnumerable<int>> scanDurationGeneratorFunc,
+    PhysicalAddress paaMacAddress
+  )
+    => new FindByMacAddressActiveScanOptions(
+      paaMacAddress: paaMacAddress,
+      scanDurationGeneratorFunc: scanDurationGeneratorFunc
+    );
+
+  private sealed class FindByMacAddressActiveScanOptions : ScanDurationGeneratorFuncActiveScanOptions {
     private readonly PhysicalAddress paaMacAddress;
-    private readonly IEnumerable<int> scanDurationGenerator;
 
     public FindByMacAddressActiveScanOptions(
       PhysicalAddress paaMacAddress,
       IEnumerable<int> scanDurationGenerator
     )
+      : base(scanDurationGenerator ?? throw new ArgumentNullException(nameof(scanDurationGenerator)))
+    {
+      this.paaMacAddress = paaMacAddress;
+    }
+
+    public FindByMacAddressActiveScanOptions(
+      PhysicalAddress paaMacAddress,
+      Func<IEnumerable<int>> scanDurationGeneratorFunc
+    )
+      : base(scanDurationGeneratorFunc ?? throw new ArgumentNullException(nameof(scanDurationGeneratorFunc)))
     {
       this.paaMacAddress = paaMacAddress;
-      this.scanDurationGenerator = scanDurationGenerator ?? throw new ArgumentNullException(nameof(scanDurationGenerator));
     }
 
-    public override SkStackActiveScanOptions Clone() => new FindByMacAddressActiveScanOptions(paaMacAddress, scanDurationGenerator.ToArray());
+    public override SkStackActiveScanOptions Clone() => new FindByMacAddressActiveScanOptions(paaMacAddress, ScanDurationGeneratorFunc);
     internal override bool SelectPanaAuthenticationAgent(SkStackPanDescription desc) => desc.MacAddress.Equals(paaMacAddress);
-    internal override IEnumerable<int> YieldScanDurationFactors() => scanDurationGenerator;
   }
 
   /*
@@ -144,6 +275,7 @@ public abstract class SkStackActiveScanOptions : ICloneable {
   // TODO: public IProgress<int> Progress { get; set; }
   public abstract SkStackActiveScanOptions Clone();
   object ICloneable.Clone() => Clone();
+  internal virtual uint? ChannelMask => null;
   internal abstract bool SelectPanaAuthenticationAgent(SkStackPanDescription desc);
   internal abstract IEnumerable<int> YieldScanDurationFactors();
 }
diff --git a/src/Smdn.Net.SkStackIP/Smdn.Net.SkStackIP/SkStackChannel.cs b/src/Smdn.Net.SkStackIP/Smdn.Net.SkStackIP/SkStackChannel.cs
index a870f04..c51447b 100644
--- a/src/Smdn.Net.SkStackIP/Smdn.Net.SkStackIP/SkStackChannel.cs
+++ b/src/Smdn.Net.SkStackIP/Smdn.Net.SkStackIP/SkStackChannel.cs
@@ -11,6 +11,9 @@ namespace Smdn.Net.SkStackIP;
 ///   <para>See 'BP35A1コマンドリファレンス 6. 周波数とチャネル番号' for detailed specifications.</para>
 /// </remarks>
 public readonly struct SkStackChannel : IEquatable<SkStackChannel>, IComparable<SkStackChannel> {
+  private const int ChannelNumberMin = 33;
+  private const int ChannelNumberMax = 60;
+
   public static readonly IReadOnlyDictionary<int, SkStackChannel> Channels = new Dictionary<int, SkStackChannel> {
     { 33, new(channelNumber: 33, frequencyMHz: 922.5m) },
     { 34, new(channelNumber: 34, frequencyMHz: 922.7m) },
@@ -82,6 +85,27 @@ public readonly struct SkStackChannel : IEquatable<SkStackChannel>, IComparable<
           message: "undefined channel"
         );
 
+  /// <summary>
+  /// Creates the value passed to the parameter <c>CHANNEL_MASK</c> in the <c>SKSCAN</c> command.
+  /// </summary>
+  /// <remarks>
+  ///   <para>See 'BP35A1コマンドリファレンス 3.9. SKSCAN' for detailed specifications.</para>
+  /// </remarks>
+  [CLSCompliant(false)]
+  public static uint CreateMask(params SkStackChannel[] channels)
+  {
+    uint mask = 0u;
+
+    foreach (var ch in channels ?? throw new ArgumentNullException(nameof(channels))) {
+      if (ch.ChannelNumber is >= ChannelNumberMin and <= ChannelNumberMax)
+        mask |= 1u << (ch.ChannelNumber - ChannelNumberMin);
+      else
+        throw new InvalidOperationException($"Cannot create mask bits from an invalid channel number {ch.ChannelNumber}.");
+    }
+
+    return mask;
+  }
+
   /*
    * instance members
    */
diff --git a/src/Smdn.Net.SkStackIP/Smdn.Net.SkStackIP/SkStackClient.Functions.PANA.ActiveScan.cs b/src/Smdn.Net.SkStackIP/Smdn.Net.SkStackIP/SkStackClient.Functions.PANA.ActiveScan.cs
index 931d370..d25957c 100644
--- a/src/Smdn.Net.SkStackIP/Smdn.Net.SkStackIP/SkStackClient.Functions.PANA.ActiveScan.cs
+++ b/src/Smdn.Net.SkStackIP/Smdn.Net.SkStackIP/SkStackClient.Functions.PANA.ActiveScan.cs
@@ -21,6 +21,7 @@ partial class SkStackClient {
       writeRBID: CreateActionForWritingRBID(rbid, nameof(rbid)),
       writePassword: CreateActionForWritingPassword(password, nameof(password)),
       scanDurationFactorGenerator: (scanOptions ?? SkStackActiveScanOptions.Default).YieldScanDurationFactors(),
+      channelMask: scanOptions?.ChannelMask,
       cancellationToken: cancellationToken
     );
 
@@ -34,6 +35,7 @@ partial class SkStackClient {
       writeRBID: writeRBID ?? throw new ArgumentNullException(nameof(writeRBID)),
       writePassword: writePassword ?? throw new ArgumentNullException(nameof(writePassword)),
       scanDurationFactorGenerator: (scanOptions ?? SkStackActiveScanOptions.Default).YieldScanDurationFactors(),
+      channelMask: scanOptions?.ChannelMask,
       cancellationToken: cancellationToken
     );
 
@@ -41,6 +43,7 @@ partial class SkStackClient {
     Action<IBufferWriter<byte>>? writeRBID,
     Action<IBufferWriter<byte>>? writePassword,
     IEnumerable<int> scanDurationFactorGenerator,
+    uint? channelMask,
     CancellationToken cancellationToken = default
   )
   {
@@ -59,6 +62,7 @@ partial class SkStackClient {
     foreach (var durationFactor in scanDurationFactorGenerator) {
       var (_, result) = await SendSKSCANActiveScanPairAsync(
         durationFactor: durationFactor,
+        channelMask: channelMask ?? SKSCANDefaultChannelMask,
         cancellationToken: cancellationToken
       ).ConfigureAwait(false);
 
@@ -82,6 +86,7 @@ partial class SkStackClient {
       writeRBID: null,
       writePassword: null,
       scanDurationFactorGenerator: baseScanOptions.YieldScanDurationFactors(),
+      channelMask: baseScanOptions.ChannelMask,
       cancellationToken: cancellationToken
     ).ConfigureAwait(false);
 

Notes

Full Changelog: releases/Smdn.Net.SkStackIP-1.2.0...releases/Smdn.Net.SkStackIP-1.3.0