Skip to content

Commit cff414d

Browse files
committed
add SkStackClient.PanaSessionState
1 parent 8167bba commit cff414d

File tree

6 files changed

+96
-1
lines changed

6 files changed

+96
-1
lines changed

src/Smdn.Net.SkStackIP/Smdn.Net.SkStackIP/SkStackClient.Events.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,21 +95,29 @@ CancellationToken cancellationToken
9595
break;
9696
}
9797

98-
// raise event
98+
// update state and raise event
9999
switch (ev.Number) {
100+
case SkStackEventNumber.PanaSessionEstablishmentError:
101+
PanaSessionState = ev.Number;
102+
PanaSessionPeerAddress = null;
103+
break;
104+
100105
case SkStackEventNumber.PanaSessionEstablishmentCompleted:
106+
PanaSessionState = ev.Number;
101107
PanaSessionPeerAddress = ev.SenderAddress;
102108
RaiseEventPanaSessionEstablished(ev);
103109
break;
104110

105111
case SkStackEventNumber.PanaSessionTerminationRequestReceived:
106112
case SkStackEventNumber.PanaSessionTerminationCompleted:
107113
case SkStackEventNumber.PanaSessionTerminationTimedOut:
114+
PanaSessionState = ev.Number;
108115
PanaSessionPeerAddress = null;
109116
RaiseEventPanaSessionTerminated(ev);
110117
break;
111118

112119
case SkStackEventNumber.PanaSessionExpired:
120+
PanaSessionState = ev.Number;
113121
PanaSessionPeerAddress = null;
114122
RaiseEventPanaSessionExpired(ev);
115123
break;

src/Smdn.Net.SkStackIP/Smdn.Net.SkStackIP/SkStackClient.Functions.PANA.cs

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,69 @@ partial class SkStackClient {
1616
#pragma warning restore IDE0040
1717
/// <summary>Gets the <see cref="IPAddress"/> of current PANA session peer.</summary>
1818
/// <value><see langword="null"/> if PANA session has been terminated, expired, or not been established.</value>
19+
/// <seealso cref="PanaSessionState"/>
1920
public IPAddress? PanaSessionPeerAddress { get; private set; }
2021

22+
/// <summary>
23+
/// Gets the value of the <see cref="SkStackEventNumber"/> that indicating current status of the PANA session.
24+
/// </summary>
25+
/// <value>
26+
/// The value of this property will be one of the following.
27+
/// <list type="bullet">
28+
/// <item>
29+
/// <term><see cref="SkStackEventNumber.Undefined"/></term>
30+
/// <description>
31+
/// Initial state of the instance, where neither PANA session establishment nor termination has been attempted.
32+
/// <see cref="PanaSessionPeerAddress"/> will be <see langword="null"/>.
33+
/// </description>
34+
/// </item>
35+
/// <item>
36+
/// <term><see cref="SkStackEventNumber.PanaSessionEstablishmentError"/></term>
37+
/// <description>
38+
/// State where the PANA session establishment was attempted but failed.
39+
/// <see cref="PanaSessionPeerAddress"/> becomes <see langword="null"/>.
40+
/// </description>
41+
/// </item>
42+
/// <item>
43+
/// <term><see cref="SkStackEventNumber.PanaSessionEstablishmentCompleted"/></term>
44+
/// <description>
45+
/// State where the PANA session establishment was successful.
46+
/// <see cref="PanaSessionPeerAddress"/> becomes a <see cref="IPAddress"/> representing the peer's address.
47+
/// </description>
48+
/// </item>
49+
/// <item>
50+
/// <term><see cref="SkStackEventNumber.PanaSessionTerminationRequestReceived"/></term>
51+
/// <description>
52+
/// State where the PANA session termination was requested by the peer.
53+
/// <see cref="PanaSessionPeerAddress"/> becomes <see langword="null"/>.
54+
/// </description>
55+
/// </item>
56+
/// <item>
57+
/// <term><see cref="SkStackEventNumber.PanaSessionTerminationCompleted"/></term>
58+
/// <description>
59+
/// State where the PANA session was terminated.
60+
/// <see cref="PanaSessionPeerAddress"/> becomes <see langword="null"/>.
61+
/// </description>
62+
/// </item>
63+
/// <item>
64+
/// <term><see cref="SkStackEventNumber.PanaSessionTerminationTimedOut"/></term>
65+
/// <description>
66+
/// State where the PANA session was terminated, but the response to the termination request timed out.
67+
/// <see cref="PanaSessionPeerAddress"/> becomes <see langword="null"/>.
68+
/// </description>
69+
/// </item>
70+
/// <item>
71+
/// <term><see cref="SkStackEventNumber.PanaSessionExpired"/></term>
72+
/// <description>
73+
/// State where the PANA session has ended due to expiration.
74+
/// <see cref="PanaSessionPeerAddress"/> becomes <see langword="null"/>.
75+
/// </description>
76+
/// </item>
77+
/// </list>
78+
/// </value>
79+
/// <seealso cref="PanaSessionPeerAddress"/>
80+
public SkStackEventNumber PanaSessionState { get; private set; }
81+
2182
/// <summary>Gets a value indicating whether or not the PANA session is alive.</summary>
2283
/// <value><see langword="true"/> if PANA session is established and alive, <see langword="false"/> if PANA session has been terminated, expired, or not been established.</value>
2384
#if SYSTEM_DIAGNOSTICS_CODEANALYSIS_MEMBERNOTNULLATTRIBUTE

tests/Smdn.Net.SkStackIP/Smdn.Net.SkStackIP/SkStackClient.Commands.3.4.SKJOIN.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ async Task RaisePanaSessionEstablishmentEventsAsync()
4646
using var client = new SkStackClient(stream, logger: CreateLoggerForTestCase());
4747

4848
Assert.That(client.PanaSessionPeerAddress, Is.Null, nameof(client.PanaSessionPeerAddress));
49+
Assert.That(client.PanaSessionState, Is.Default, nameof(client.PanaSessionState));
4950
Assert.That(client.IsPanaSessionAlive, Is.False, nameof(client.IsPanaSessionAlive));
5051

5152
Exception? thrownExceptionInEventHandler = null;
@@ -56,6 +57,7 @@ async Task RaisePanaSessionEstablishmentEventsAsync()
5657
Assert.That(sender, Is.SameAs(client), nameof(sender));
5758
Assert.That(e, Is.Not.Null, nameof(e));
5859
Assert.That(e.PanaSessionPeerAddress, Is.EqualTo(IPAddress.Parse(PaaIPv6Address)), nameof(e.PanaSessionPeerAddress));
60+
Assert.That(client.PanaSessionState, Is.EqualTo(SkStackEventNumber.PanaSessionEstablishmentCompleted), nameof(client.PanaSessionState));
5961
Assert.That(e.EventNumber, Is.EqualTo(SkStackEventNumber.PanaSessionEstablishmentCompleted), nameof(e.EventNumber));
6062
Assert.That(client.PanaSessionPeerAddress, Is.Not.Null, nameof(client.PanaSessionPeerAddress));
6163
Assert.That(e.PanaSessionPeerAddress, Is.EqualTo(client.PanaSessionPeerAddress), nameof(client.PanaSessionPeerAddress));
@@ -124,6 +126,7 @@ async Task RaisePanaSessionEstablishmentEventsAsync()
124126
using var client = new SkStackClient(stream, logger: CreateLoggerForTestCase());
125127

126128
Assert.That(client.PanaSessionPeerAddress, Is.Null, nameof(client.PanaSessionPeerAddress));
129+
Assert.That(client.PanaSessionState, Is.Default, nameof(client.PanaSessionState));
127130
Assert.That(client.IsPanaSessionAlive, Is.False, nameof(client.IsPanaSessionAlive));
128131

129132
var raisedEventCount = 0;
@@ -146,6 +149,7 @@ async Task RaisePanaSessionEstablishmentEventsAsync()
146149
Assert.That(raisedEventCount, Is.Zero, nameof(raisedEventCount));
147150

148151
Assert.That(client.PanaSessionPeerAddress, Is.Null, nameof(client.PanaSessionPeerAddress));
152+
Assert.That(client.PanaSessionState, Is.EqualTo(SkStackEventNumber.PanaSessionEstablishmentError), nameof(client.PanaSessionState));
149153
Assert.That(client.IsPanaSessionAlive, Is.False, nameof(client.IsPanaSessionAlive));
150154

151155
Assert.That(

tests/Smdn.Net.SkStackIP/Smdn.Net.SkStackIP/SkStackClient.Commands.3.5.SKREJOIN.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ async Task RaisePanaSessionEstablishmentEventsAsync()
5050
Assert.That(e, Is.Not.Null, nameof(e));
5151
Assert.That(e.PanaSessionPeerAddress, Is.EqualTo(IPAddress.Parse(PaaIPv6Address)), nameof(e.PanaSessionPeerAddress));
5252
Assert.That(e.EventNumber, Is.EqualTo(SkStackEventNumber.PanaSessionEstablishmentCompleted), nameof(e.EventNumber));
53+
Assert.That(client.PanaSessionState, Is.EqualTo(SkStackEventNumber.PanaSessionEstablishmentCompleted), nameof(client.PanaSessionState));
5354
Assert.That(e.PanaSessionPeerAddress, Is.EqualTo(client.PanaSessionPeerAddress), nameof(client.PanaSessionPeerAddress));
5455
Assert.That(client.IsPanaSessionAlive, Is.True, nameof(client.IsPanaSessionAlive));
5556
raisedEventCount++;
@@ -60,6 +61,7 @@ async Task RaisePanaSessionEstablishmentEventsAsync()
6061
};
6162

6263
Assert.That(client.PanaSessionPeerAddress, Is.Null, nameof(client.PanaSessionPeerAddress));
64+
Assert.That(client.PanaSessionState, Is.Default, nameof(client.PanaSessionState));
6365
Assert.That(client.IsPanaSessionAlive, Is.False, nameof(client.IsPanaSessionAlive));
6466

6567
#pragma warning disable CA2012
@@ -79,6 +81,7 @@ async Task RaisePanaSessionEstablishmentEventsAsync()
7981
Assert.That(IPAddress.Parse(PaaIPv6Address), Is.EqualTo(rejoinedSessionPeerAddress));
8082

8183
Assert.That(IPAddress.Parse(PaaIPv6Address), Is.EqualTo(client.PanaSessionPeerAddress), nameof(client.PanaSessionPeerAddress));
84+
Assert.That(client.PanaSessionState, Is.EqualTo(SkStackEventNumber.PanaSessionEstablishmentCompleted), nameof(client.PanaSessionState));
8285
Assert.That(client.IsPanaSessionAlive, Is.True, nameof(client.IsPanaSessionAlive));
8386

8487
Assert.That(
@@ -120,6 +123,7 @@ async Task RaisePanaSessionEstablishmentEventsAsync()
120123
client.PanaSessionEstablished += (sender, e) => raisedEventCount++;
121124

122125
Assert.That(client.PanaSessionPeerAddress, Is.Null, nameof(client.PanaSessionPeerAddress));
126+
Assert.That(client.PanaSessionState, Is.Default, nameof(client.PanaSessionState));
123127
Assert.That(client.IsPanaSessionAlive, Is.False, nameof(client.IsPanaSessionAlive));
124128

125129
#pragma warning disable CA2012
@@ -140,6 +144,7 @@ async Task RaisePanaSessionEstablishmentEventsAsync()
140144
Assert.That(raisedEventCount, Is.Zero, nameof(raisedEventCount));
141145

142146
Assert.That(client.PanaSessionPeerAddress, Is.Null, nameof(client.PanaSessionPeerAddress));
147+
Assert.That(client.PanaSessionState, Is.EqualTo(SkStackEventNumber.PanaSessionEstablishmentError), nameof(client.PanaSessionState));
143148
Assert.That(client.IsPanaSessionAlive, Is.False, nameof(client.IsPanaSessionAlive));
144149

145150
Assert.That(
@@ -161,6 +166,7 @@ public void SKREJOIN_Fail()
161166
client.PanaSessionEstablished += (sender, e) => raisedEventCount++;
162167

163168
Assert.That(client.PanaSessionPeerAddress, Is.Null, nameof(client.PanaSessionPeerAddress));
169+
Assert.That(client.PanaSessionState, Is.Default, nameof(client.PanaSessionState));
164170
Assert.That(client.IsPanaSessionAlive, Is.False, nameof(client.IsPanaSessionAlive));
165171

166172
Assert.That(
@@ -175,6 +181,7 @@ public void SKREJOIN_Fail()
175181
Assert.That(raisedEventCount, Is.Zero, nameof(raisedEventCount));
176182

177183
Assert.That(client.PanaSessionPeerAddress, Is.Null, nameof(client.PanaSessionPeerAddress));
184+
Assert.That(client.PanaSessionState, Is.Default, nameof(client.PanaSessionState));
178185
Assert.That(client.IsPanaSessionAlive, Is.False, nameof(client.IsPanaSessionAlive));
179186

180187
Assert.That(

tests/Smdn.Net.SkStackIP/Smdn.Net.SkStackIP/SkStackClient.Commands.3.6.SKTERM.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ string addressString
2727
await client.SendSKJOINAsync(address);
2828

2929
Assert.That(address, Is.EqualTo(client.PanaSessionPeerAddress));
30+
Assert.That(client.PanaSessionState, Is.EqualTo(SkStackEventNumber.PanaSessionEstablishmentCompleted), nameof(client.PanaSessionState));
3031
Assert.That(client.IsPanaSessionAlive, Is.True, nameof(client.IsPanaSessionAlive));
3132

3233
stream.ClearSentData();
@@ -68,6 +69,7 @@ async Task RaisePanaSessionTerminationEventsAsync()
6869
Assert.That(e, Is.Not.Null, nameof(e));
6970
Assert.That(e.PanaSessionPeerAddress, Is.EqualTo(address), nameof(e.PanaSessionPeerAddress));
7071
Assert.That(e.EventNumber, Is.EqualTo(SkStackEventNumber.PanaSessionTerminationCompleted), nameof(e.EventNumber));
72+
Assert.That(client.PanaSessionState, Is.EqualTo(SkStackEventNumber.PanaSessionTerminationCompleted), nameof(client.PanaSessionState));
7173
Assert.That(client.PanaSessionPeerAddress, Is.Null, nameof(client.PanaSessionPeerAddress));
7274
Assert.That(client.IsPanaSessionAlive, Is.False, nameof(client.IsPanaSessionAlive));
7375
raisedEventCount++;
@@ -78,6 +80,7 @@ async Task RaisePanaSessionTerminationEventsAsync()
7880
};
7981

8082
Assert.That(client.PanaSessionPeerAddress, Is.Not.Null, nameof(client.PanaSessionPeerAddress));
83+
Assert.That(client.PanaSessionState, Is.EqualTo(SkStackEventNumber.PanaSessionEstablishmentCompleted), nameof(client.PanaSessionState));
8184
Assert.That(client.IsPanaSessionAlive, Is.True, nameof(client.IsPanaSessionAlive));
8285

8386
#pragma warning disable CA2012
@@ -97,6 +100,7 @@ async Task RaisePanaSessionTerminationEventsAsync()
97100
Assert.That(isCompletedSuccessfully, Is.True);
98101

99102
Assert.That(client.PanaSessionPeerAddress, Is.Null, nameof(client.PanaSessionPeerAddress));
103+
Assert.That(client.PanaSessionState, Is.EqualTo(SkStackEventNumber.PanaSessionTerminationCompleted), nameof(client.PanaSessionState));
100104
Assert.That(client.IsPanaSessionAlive, Is.False, nameof(client.IsPanaSessionAlive));
101105

102106
Assert.That(
@@ -137,6 +141,7 @@ async Task RaisePanaSessionTerminationEventsAsync()
137141
Assert.That(e, Is.Not.Null, nameof(e));
138142
Assert.That(e.PanaSessionPeerAddress, Is.EqualTo(address), nameof(e.PanaSessionPeerAddress));
139143
Assert.That(e.EventNumber, Is.EqualTo(SkStackEventNumber.PanaSessionTerminationTimedOut), nameof(e.EventNumber));
144+
Assert.That(client.PanaSessionState, Is.EqualTo(SkStackEventNumber.PanaSessionTerminationTimedOut), nameof(client.PanaSessionState));
140145
Assert.That(client.PanaSessionPeerAddress, Is.Null, nameof(client.PanaSessionPeerAddress));
141146
Assert.That(client.IsPanaSessionAlive, Is.False, nameof(client.IsPanaSessionAlive));
142147
raisedEventCount++;
@@ -147,6 +152,7 @@ async Task RaisePanaSessionTerminationEventsAsync()
147152
};
148153

149154
Assert.That(client.PanaSessionPeerAddress, Is.Not.Null, nameof(client.PanaSessionPeerAddress));
155+
Assert.That(client.PanaSessionState, Is.EqualTo(SkStackEventNumber.PanaSessionEstablishmentCompleted), nameof(client.PanaSessionState));
150156

151157
#pragma warning disable CA2012
152158
var taskSendCommand = client.SendSKTERMAsync().AsTask();
@@ -191,6 +197,7 @@ public async Task SKTERM_FAIL()
191197
client.PanaSessionTerminated += (sender, e) => raisedEventCount++;
192198

193199
Assert.That(client.PanaSessionPeerAddress, Is.Not.Null, nameof(client.PanaSessionPeerAddress));
200+
Assert.That(client.PanaSessionState, Is.EqualTo(SkStackEventNumber.PanaSessionEstablishmentCompleted), nameof(client.PanaSessionState));
194201
Assert.That(client.IsPanaSessionAlive, Is.True, nameof(client.IsPanaSessionAlive));
195202

196203
Assert.ThrowsAsync<SkStackErrorResponseException>(
@@ -200,6 +207,7 @@ public async Task SKTERM_FAIL()
200207
Assert.That(raisedEventCount, Is.Zero, nameof(raisedEventCount));
201208

202209
Assert.That(client.PanaSessionPeerAddress, Is.Not.Null, nameof(client.PanaSessionPeerAddress));
210+
Assert.That(client.PanaSessionState, Is.EqualTo(SkStackEventNumber.PanaSessionEstablishmentCompleted), nameof(client.PanaSessionState));
203211
Assert.That(client.IsPanaSessionAlive, Is.True, nameof(client.IsPanaSessionAlive));
204212

205213
Assert.That(

tests/Smdn.Net.SkStackIP/Smdn.Net.SkStackIP/SkStackClient.Events.4.8.EVENT.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ string addressString
2525
await client.SendSKJOINAsync(address);
2626

2727
Assert.That(address, Is.EqualTo(client.PanaSessionPeerAddress));
28+
Assert.That(client.PanaSessionState, Is.EqualTo(SkStackEventNumber.PanaSessionEstablishmentCompleted), nameof(client.PanaSessionState));
2829
Assert.That(client.IsPanaSessionAlive, Is.True, nameof(client.IsPanaSessionAlive));
2930

3031
stream.ClearSentData();
@@ -51,6 +52,7 @@ public async Task EVENT_26_RaiseEventPanaSessionTerminated()
5152
Assert.That(e.PanaSessionPeerAddress, Is.EqualTo(address), nameof(e.PanaSessionPeerAddress));
5253
Assert.That(e.EventNumber, Is.EqualTo(SkStackEventNumber.PanaSessionTerminationRequestReceived), nameof(e.EventNumber));
5354
Assert.That(client.PanaSessionPeerAddress, Is.Null, nameof(client.PanaSessionPeerAddress));
55+
Assert.That(client.PanaSessionState, Is.EqualTo(SkStackEventNumber.PanaSessionTerminationRequestReceived), nameof(client.PanaSessionState));
5456
Assert.That(client.IsPanaSessionAlive, Is.False, nameof(client.IsPanaSessionAlive));
5557
raisedEventCount++;
5658
}
@@ -65,6 +67,7 @@ public async Task EVENT_26_RaiseEventPanaSessionTerminated()
6567
stream.ResponseWriter.WriteLine("OK");
6668

6769
Assert.That(client.PanaSessionPeerAddress, Is.Not.Null, nameof(client.PanaSessionPeerAddress));
70+
Assert.That(client.PanaSessionState, Is.EqualTo(SkStackEventNumber.PanaSessionEstablishmentCompleted), nameof(client.PanaSessionState));
6871
Assert.That(client.IsPanaSessionAlive, Is.True, nameof(client.IsPanaSessionAlive));
6972

7073
Assert.DoesNotThrowAsync(async () => await client.SendSKVERAsync());
@@ -73,6 +76,7 @@ public async Task EVENT_26_RaiseEventPanaSessionTerminated()
7376
Assert.That(raisedEventCount, Is.EqualTo(1), nameof(raisedEventCount));
7477

7578
Assert.That(client.PanaSessionPeerAddress, Is.Null, nameof(client.PanaSessionPeerAddress));
79+
Assert.That(client.PanaSessionState, Is.EqualTo(SkStackEventNumber.PanaSessionTerminationRequestReceived), nameof(client.PanaSessionState));
7680
Assert.That(client.IsPanaSessionAlive, Is.False, nameof(client.IsPanaSessionAlive));
7781
}
7882

@@ -97,6 +101,7 @@ public async Task EVENT_29_RaiseEventPanaSessionExpired()
97101
Assert.That(e.PanaSessionPeerAddress, Is.EqualTo(address), nameof(e.PanaSessionPeerAddress));
98102
Assert.That(e.EventNumber, Is.EqualTo(SkStackEventNumber.PanaSessionExpired), nameof(e.EventNumber));
99103
Assert.That(client.PanaSessionPeerAddress, Is.Null, nameof(client.PanaSessionPeerAddress));
104+
Assert.That(client.PanaSessionState, Is.EqualTo(SkStackEventNumber.PanaSessionExpired), nameof(client.PanaSessionState));
100105
Assert.That(client.IsPanaSessionAlive, Is.False, nameof(client.IsPanaSessionAlive));
101106
raisedEventCount++;
102107
}
@@ -111,6 +116,7 @@ public async Task EVENT_29_RaiseEventPanaSessionExpired()
111116
stream.ResponseWriter.WriteLine("OK");
112117

113118
Assert.That(client.PanaSessionPeerAddress, Is.Not.Null, nameof(client.PanaSessionPeerAddress));
119+
Assert.That(client.PanaSessionState, Is.EqualTo(SkStackEventNumber.PanaSessionEstablishmentCompleted), nameof(client.PanaSessionState));
114120
Assert.That(client.IsPanaSessionAlive, Is.True, nameof(client.IsPanaSessionAlive));
115121

116122
Assert.DoesNotThrowAsync(async () => await client.SendSKVERAsync());
@@ -119,6 +125,7 @@ public async Task EVENT_29_RaiseEventPanaSessionExpired()
119125
Assert.That(raisedEventCount, Is.EqualTo(1), nameof(raisedEventCount));
120126

121127
Assert.That(client.PanaSessionPeerAddress, Is.Null, nameof(client.PanaSessionPeerAddress));
128+
Assert.That(client.PanaSessionState, Is.EqualTo(SkStackEventNumber.PanaSessionExpired), nameof(client.PanaSessionState));
122129
Assert.That(client.IsPanaSessionAlive, Is.False, nameof(client.IsPanaSessionAlive));
123130
}
124131
}

0 commit comments

Comments
 (0)