์ ํ๋ฆฌ์ผ์ด์
์๋ฒ๋ ๋ค์ ์ด๋ฒคํธ์์ ์ต์ข
์ฅ์น ์ธ์
์ ํ์ธํด์ผ ํฉ๋๋ค(์: dev.PendingSession
์ dev.Session
).
ํ์ฌ NS๋ AS ์์ด ์ธ์
์ '์ ํ'ํ ์ ์์ต๋๋ค. @rvolosatovs ๋ ๋ค์ ์ํ์ค๋ฅผ ์ฌ์ฉํ์ฌ v3.11
์์ ์ด๊ฒ์ ์ฌํํ์ต๋๋ค.
dev.PendingSession
๋ก ์๊ณ ์์ต๋๋ค.DownlinkQueueInvalidated
์ด๋ฒคํธ๋ฅผ ๋ณด๋
๋๋ค.dev.Session
๊ฐ ์์ผ๋ฏ๋ก ์ด ๋ค์ด๋งํฌ ๋๊ธฐ์ด ๋ฌดํจํ๋ฅผ ๊ฑฐ๋ถํฉ๋๋ค.์ด ์์ ์์ AS๋ NS๊ฐ FPort=0์ ๋ณด๋ผ ๋ ๋ฐ์ํ FCnt
์ฆ๊ฐ๋ฅผ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฑฐ๋ถํ๊ธฐ ๋๋ฌธ์ NS๊ฐ ๋ฏธ๋์ ๋ ๋ค๋ฅธ ๋ฌดํจํ๋ฅผ ๋ณด๋ด์ง ์๋ ํ ์ด ์ธ์
์์ ๋ค์ด๋งํฌ๋ฅผ ๋ค์ ์์ฝํ ์ ์์ต๋๋ค. ๋ค์ด๋งํฌ(์ด์ FCnt๋ ํญ์ ๋๋ฌด ๋ฎ์).
๋์ค์ ๋ฌดํจํ๊ฐ ๋ฐ์ํ์ง ์์ผ๋ฉด ์ธ์ ์ด ๋ณต๊ตฌ๋์ง ์์ต๋๋ค.
SessionKeyID
๋ฅผ DownlinkQueueInvalidation
ํฉ๋๋ค. ๋๊ธฐ์ด์ด ๋น์ด ์์ผ๋ฉด AS๋ ํ์ฌ ์ด๋ค ๋๊ธฐ์ด์ด ๋ฌดํจํ๋์๋์ง ์ ์ ์์ต๋๋ค.dev.Session
์ ๋๋ผ๊ณ ๊ฐ์ ํ๋ ๋์ ์ฌ๋ฐ๋ฅธ ์ธ์
์ queue + FCnt๋ฅผ ์
๋ฐ์ดํธํด์ผ ํฉ๋๋ค.nacked
๋ฉ์์ง๊ฐ ์ด๋ ์ธ์
์์ ์๋์ง ํ์ธํด์ผ ํฉ๋๋ค. - nacked
๋ฉ์์ง๊ฐ ๋ณด๋ฅ ์ค์ธ ์ธ์
(AS ๊ด์ ์์)์ผ ์ ์์ผ๋ฏ๋ก FCnt ์
๋ฐ์ดํธ๋ ๋ค์์์ ์ํ๋์ด์ผ ํฉ๋๋ค. ์ฌ๋ฐ๋ฅธ ์ธ์
.Summary
์ธ๊ธ๋ ๋ฉ์์ง๊ฐ ๋ฐ์ํ ๋ as should ์ธ์
์ dev.PendingSession
์ dev.Session
์ฌ์ด์์ ์ ํํด์ผ ํฉ๋๋ค.v3.11
handleUplink
๋ฐ์ผ๋ก ์ฎ๊ธฐ๊ณ ๋ชจ๋ ์ ์ ํ ์
๋งํฌ ์ ํ์์ ์ํํฉ๋๋ค.DownlinkQueue{Push|Replace}
์ ๋ํ ์ค๋ฅ ์ธ๋ถ ์ ๋ณด๋ฅผ ์ต์ FCnt
๋ฐํํ๊ณ ํญ์ LastAFCntDown
๋ฅผ ์ด ๊ฐ์ผ๋ก ์
๋ฐ์ดํธํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ด๋ค ์ง์ ์์๋ AS์ NS ๊ฐ์ ๋๊ธฐํ๋์ง ์์ ๊ฒฝ์ฐ ์์คํ
์ด ์๋ ด๋ฉ๋๋ค.์ฌ์ ๋จ๊ณ์์ ์ธ๊ธํ ์์๋ฅผ ์ฌ์ํด ๋ณด์ญ์์ค.
์, ํ์ง๋ง ์ด๊ฒ์ ์ฌ์ํ ๋ณ๊ฒฝ ์ฌํญ์ด๋ฏ๋ก ์ด ๋ฌธ์ ์ ๋จผ์ discussion
ํ๊ทธ๋ฅผ ์ง์ ํ๋๋ก ์์ฒญํฉ๋๋ค. ์ด๋ฌํ ๋ณ๊ฒฝ ์ฌํญ์ ๋์
ํ์๊ฒ ์ต๋๊น? ๋ค์ด๋งํฌ ๋๊ธฐ์ด ๋ฌดํจํ ํ๋๋ ์๊ตฌ ์ฌํญ์ผ๋ก ๋ณด์ด์ง๋ง ๋ค๋ฅธ ํ๋๋ ์ผ๊ด์ฑ์ ์ข์ต๋๋ค.
cc @rvolosatovs
์ฐ๋ฆฌ๊ฐ ์ด๋ฏธ ๋
ผ์ํ ๋ฐ์ ๊ฐ์ด ๋๋ ์ด๊ฒ์ ์ฐฌ์ฑํฉ๋๋ค.
Application Server๋ ํญ์ ์ฅ์น ์ธ์
์ ๋ํ ์ต์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ํญ์ ๋คํธ์ํฌ ์๋ฒ๋ฅผ ์ ๋ขฐํด์ผ ํฉ๋๋ค.
- ์ต์ข ์ฅ์น๋ FPort=0 ์ ๋งํฌ๋ฅผ ๋ณด๋ ๋๋ค. - AS๋ ์ด ์ ๋งํฌ๋ฅผ ์์ ํ์ง ์์ต๋๋ค.
NS๊ฐ ์ด๊ฒ์ ๋ณด๋ด๋๋ก ๋ณ๊ฒฝํด์ผ ํ์ง ์์ง๋ง ๋น ํ์ด๋ก๋์ FPort 0์ ์ฌ์ฉํ์ฌ ์ ์คํธ๋ฆผ์ผ๋ก ์ ์ก๋์ง ์๋๋ก ํด์ผ ํฉ๋๊น?
- ์ต์ข ์ฅ์น๋ FPort=0 ์ ๋งํฌ๋ฅผ ๋ณด๋ ๋๋ค. - AS๋ ์ด ์ ๋งํฌ๋ฅผ ์์ ํ์ง ์์ต๋๋ค.
NS๊ฐ ์ด๊ฒ์ ๋ณด๋ด๋๋ก ๋ณ๊ฒฝํด์ผ ํ์ง ์์ง๋ง ๋น ํ์ด๋ก๋์ FPort 0์ ์ฌ์ฉํ์ฌ ์ ์คํธ๋ฆผ์ผ๋ก ์ ์ก๋์ง ์๋๋ก ํด์ผ ํฉ๋๊น?
NS->AS ๋ฉ์์ง์ด ๋น๋๊ธฐ์์ด๋ฏ๋ก ์ธ์
์ ํ์ธ ํ๊ธฐ ์ํด FPort==0
์
๋งํฌ๊ฐ AS๋ก ์ ์ก ๋๊ธฐ ์ ์ ๋๊ธฐ์ด ๋ฌดํจํ๊ฐ ๋์ฐฉํ ์ ์์ผ๋ฏ๋ก ์ด์จ๋ ์ด ์์
์ ์ํํด์ผ ํฉ๋๋ค. NS์ ๋ํ FPort==0
์
๋งํฌ์ ๋ํ ์๋ต์ผ๋ก AS์ ์
๋งํฌ๋ฅผ ๋ณด๋ด๋ ์ ์ผํ ์ด์ ๋ AS๊ฐ ๊ฐ๋ฅํ ํ ๋นจ๋ฆฌ ์ธ์
๋ณ๊ฒฝ์ ํต์ง๋ฐ๋๋ก ํ๊ธฐ ์ํ ๊ฒ์ด์ง๋ง ์ฐ๋ฆฌ๋ ๊ทธ๋ฐ ํ์๊ฐ ์์ต๋๋ค. ๊ทธ๋ฐ ๊ฒฝ์ฐ์๋ NS๊ฐ FPort 0 ์
๋งํฌ ๋์ AS์ ๋ณด๋ผ SessionSwitch
๋ฉ์์ง๋ฅผ ๋์
ํ๋ ๊ฒ์ด ๋ ํฉ๋ฆฌ์ ์
๋๋ค.
v3.11.1
๋ฐฐํฌ์ ์ํฅ์ ๋ฏธ์น๋ฏ๋ก ์ฐ์ ์์๋ฅผ prio/high
๋ก ์
๊ทธ๋ ์ด๋ํ์ต๋๋ค.
๋ณ๊ฒฝ ์ฌํญ์ ๋ค์๊ณผ ๊ฐ์์ผ ํฉ๋๋ค.
SessionKeyID
๋ฅผ DownlinkQueueInvalidation
ํฉ๋๋ค. ๋๊ธฐ์ด์ด ๋น์ด ์์ผ๋ฉด AS๋ ํ์ฌ ์ด๋ค ๋๊ธฐ์ด์ด ๋ฌดํจํ๋์๋์ง ์ ์ ์์ต๋๋ค.๋ค์ proto
์ถ๊ฐ(ํ๋ 3
)๋ก ์ถฉ๋ถํฉ๋๋ค.
message ApplicationInvalidatedDownlinks {
repeated ApplicationDownlink downlinks = 1;
uint32 last_f_cnt_down = 2;
bytes session_key_id = 3 [(gogoproto.customname) = "SessionKeyID", (validate.rules).bytes.max_len = 2048];
}
dev.Session
์ ๋๋ผ๊ณ ๊ฐ์ ํ๋ ๋์ ์ฌ๋ฐ๋ฅธ ์ธ์
์ queue + FCnt๋ฅผ ์
๋ฐ์ดํธํด์ผ ํฉ๋๋ค.dev.Session
ํญ์ ์ฌ์ฉํ๋ ๋์ SessionKeyID
๋ฅผ ์ผ์ ์ฌ์ฉํ ์ธ์
์ ์ค์ ํ์ญ์์ค. ํ์ํ ๊ฒฝ์ฐ ํ์ฌ dev.Session
์
๋ฐ์ดํธํฉ๋๋ค.
nacked
๋ฉ์์ง๊ฐ ์ด๋ ์ธ์
์์ ์๋์ง ํ์ธํด์ผ ํฉ๋๋ค. - nacked
๋ฉ์์ง๊ฐ ๋ณด๋ฅ ์ค์ธ ์ธ์
(AS ๊ด์ ์์)์ผ ์ ์์ผ๋ฏ๋ก FCnt ์
๋ฐ์ดํธ๋ ๋ค์์์ ์ํ๋์ด์ผ ํฉ๋๋ค. ์ฌ๋ฐ๋ฅธ ์ธ์
.์ด์ ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก SessionKeyID
๋ฅผ ์ผ์ ์ฌ์ฉํ ์ธ์
์ ๊ฒฐ์ ํฉ๋๋ค. ํ์ํ ๊ฒฝ์ฐ ํ์ฌ dev.Session
์
๋ฐ์ดํธํฉ๋๋ค.
DownlinkQueue{Push|Replace}
์ ๋ํ ์ค๋ฅ ์ธ๋ถ ์ ๋ณด๋ฅผ ์ต์ FCnt
๋ฐํํ๊ณ ํญ์ LastAFCntDown
๋ฅผ ์ด ๊ฐ์ผ๋ก ์
๋ฐ์ดํธํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ด๋ค ์ง์ ์์๋ AS์ NS ๊ฐ์ ๋๊ธฐํ๋์ง ์์ ๊ฒฝ์ฐ ์์คํ
์ด ์๋ ด๋ฉ๋๋ค.๋ค์ proto
์ถ๊ฐ๋ ์ฑ์์ ธ์ผ ํ๋ฉฐ NS์ errFCntTooLow
์ ์ค๋ฅ ์ธ๋ถ ์ ๋ณด๋ก ์ถ๊ฐ๋์ด์ผ ํฉ๋๋ค.
message UpdateDownlinkQueueErrorDetails {
bytes session_key_id = 1 [(gogoproto.customname) = "SessionKeyID", (validate.rules).bytes.max_len = 2048];
uint32 last_f_cnt_down = 2;
}
๊ทธ๋ฐ ๋ค์ AS๋ ์ด๋ฌํ ์ธ๋ถ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ ํ์ฌ ์ธ์ ์ ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค.
๋ณ๊ฒฝ ์ฌํญ์ ์ด์ ๋ฒ์ ๊ณผ ํธํ๋๋ฉฐ NS ์ธก์์ ์ต์ํ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. genie๋ ์ด๋ฏธ ๋ณ์์ ๋ฒ์ด๋ฌ์ต๋๋ค. AS์ NS ๊ฐ์ ์ ์ฒด ํ๋กํ ์ฝ์ ์ฒ์ฒํ ๋น๋๊ธฐํ๋์์ผ๋ฉฐ ๋จ์ํ FPort=0
๋ณ๊ฒฝ์ ๋๋๋ฆฌ๋ ๊ฒ๋ง์ผ๋ก๋ ์ถฉ๋ถํ์ง ์์ต๋๋ค. ๋๋ ์ด ๋ณํ์ด ๊ฒฐ๊ตญ ์๋ชป๋์๋ค๊ณ ์๊ฐํ์ง ์์ง๋ง ์ธ์
๋ฐ์ด์๋ฎฌ๋ ์ด์
๊ณผ ๊ด๋ จํ์ฌ ์ด๋ฌํ ๋จ์ ์ ์์ ํด์ผ ํฉ๋๋ค.
cc @johanstokking , @rvolosatovs
๋์๊ฒ ์ข์ ์๋ฆฌ!
๋ด๊ฐ ์ฌ๊ธฐ์ ๋ฌด์์ ํ ์ ์์ต๋๊น? ๊ทธ๋ ๋ค๋ฉด ์ ๋ฅผ ๋ค์ ํ ๋นํ๊ณ ๋ฌด์์ธ์ง ์๋ ค์ฃผ์ญ์์ค.
๋ด๊ฐ ์ฌ๊ธฐ์ ๋ฌด์์ ํ ์ ์์ต๋๊น? ๊ทธ๋ ๋ค๋ฉด ์ ๋ฅผ ๋ค์ ํ ๋นํ๊ณ ๋ฌด์์ธ์ง ์๋ ค์ฃผ์ญ์์ค.
์ ๋ ์ด๋ฏธ ๋ค์ ์ฌํญ์ ์ค์ ์ ๋๊ณ ์ด ์์ ์ ํ๊ณ ์์ต๋๋ค.
* (Optional) return error details on `DownlinkQueue{Push|Replace}` with the minimum `FCnt` and always update the `LastAFCntDown` to this value. This would ensure that the system converges if at any point we're for some reason out of sync between AS and NS.
๊ทธ ์ด์ ๋ ํ์ ์ผ๋ถ๋ก NS์์ ๋ฐ์ ์ด๋ฒคํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ ์ ์ํํ๋ ๊ฒ๋ง์ผ๋ก๋ ๊ทผ๋ณธ์ ์ผ๋ก ์ถฉ๋ถํ์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ด๋ฌํ ํน์ฑ์ ๊ณ ๋ คํ ๋ ๋ ๊ฐ์ง ์ต์ ์ด ์์ต๋๋ค.
dev.Session.SessionKeyID
, dev.PendingSession.SessionKeyID
๋ฐ LastAFCntDown
๋ฐํํ๋ค๋ ๊ฒ์
๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ค๋ฅ ์ธ๋ถ ์ ๋ณด๋ฅผ ์ฌ์ฉํ์ฌ AS์์ ์ธ์
์ ์ฌ๊ตฌ์ถํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ด๊ฒ์ ์ค๋๋ ๋ฐ์ดํฐ(์๋ง๋ ์ค๋๋ ์ธ์
, ๋๋ฌด ๋ฎ์ FCnt)๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ด๋งํฌ ๋๊ธฐ์ด ์์
์ ์ํํ๋ ค๊ณ ํ ๋ ๊ฒฐ๊ตญ NS ์ํ๋ก ์๋ ดํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ํ ๋ฒ, ๋ ๋ฒ, ์ธ ๋ฒ ์๋ํด์ผ ํ ์๋ ์์ต๋๋ค. ๋ฌดํ ํ์ ์ ํผํ๊ธฐ ์ํด ๊ฒฝ๊ณ๋ก ๋ง๋ค๊ฒ ์ต๋๋ค. ํ์ง๋ง ์ ์ด๋ ์
๋งํฌ ๋ฉ์์ง ๋๊ธฐ์ด์ ์ ๋ณด๋ณด๋ค ํจ์ฌ ๋ ์ต์ ์ ๋ณด๋ก ์์
ํ๊ณ ์์ต๋๋ค.
- ๊ทธ๋ฅ _NS๋ฅผ ๋ฏฟ์ผ์ธ์_. ์ด๊ฒ์ด ์๋ฏธํ๋ ๋ฐ๋ ํธ์/๋ฐ๊พธ๊ธฐ ์์ ์ด ์ค๋ฅ ์ธ๋ถ ์ ๋ณด์ ์ผ๋ถ๋ก
dev.Session.SessionKeyID
,dev.PendingSession.SessionKeyID
๋ฐLastAFCntDown
๋ฐํํ๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ค๋ฅ ์ธ๋ถ ์ ๋ณด๋ฅผ ์ฌ์ฉํ์ฌ AS์์ ์ธ์ ์ ์ฌ๊ตฌ์ถํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ด๊ฒ์ ์ค๋๋ ๋ฐ์ดํฐ(์๋ง๋ ์ค๋๋ ์ธ์ , ๋๋ฌด ๋ฎ์ FCnt)๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ด๋งํฌ ๋๊ธฐ์ด ์์ ์ ์ํํ๋ ค๊ณ ํ ๋ ๊ฒฐ๊ตญ NS ์ํ๋ก ์๋ ดํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ํ ๋ฒ, ๋ ๋ฒ, ์ธ ๋ฒ ์๋ํด์ผ ํ ์๋ ์์ต๋๋ค. ๋ฌดํ ํ์ ์ ํผํ๊ธฐ ์ํด ๊ฒฝ๊ณ๋ก ๋ง๋ค๊ฒ ์ต๋๋ค. ํ์ง๋ง ์ ์ด๋ ์ ๋งํฌ ๋ฉ์์ง ๋๊ธฐ์ด์ ์ ๋ณด๋ณด๋ค ํจ์ฌ ๋ ์ต์ ์ ๋ณด๋ก ์์ ํ๊ณ ์์ต๋๋ค.
์ด๊ฒ์ด ์ต์ ์ ์ ํ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
v3.11.1
๋ฐฐํฌ์ ์ํฅ์ ๋ฏธ์น๋ฏ๋ก ์ฐ์ ์์๋ฅผprio/high
๋ก ์ ๊ทธ๋ ์ด๋ํ์ต๋๋ค.๋ณ๊ฒฝ ์ฌํญ์ ๋ค์๊ณผ ๊ฐ์์ผ ํฉ๋๋ค.
SessionKeyID
๋ฅผDownlinkQueueInvalidation
ํฉ๋๋ค. ๋๊ธฐ์ด์ด ๋น์ด ์์ผ๋ฉด AS๋ ํ์ฌ ์ด๋ค ๋๊ธฐ์ด์ด ๋ฌดํจํ๋์๋์ง ์ ์ ์์ต๋๋ค.๋ค์
proto
์ถ๊ฐ(ํ๋3
)๋ก ์ถฉ๋ถํฉ๋๋ค.dev.Session
์ ๋๋ผ๊ณ ๊ฐ์ ํ๋ ๋์ ์ฌ๋ฐ๋ฅธ ์ธ์ ์ queue + FCnt๋ฅผ ์ ๋ฐ์ดํธํด์ผ ํฉ๋๋ค.https://github.com/TheThingsNetwork/lorawan-stack/blob/e2fa6c085eaaf1a0b70939020244875bd01e5857/pkg/applicationserver/applicationserver.go#L1020 -L1038
dev.Session
ํญ์ ์ฌ์ฉํ๋ ๋์SessionKeyID
๋ฅผ ์ผ์ ์ฌ์ฉํ ์ธ์ ์ ์ค์ ํ์ญ์์ค. ํ์ํ ๊ฒฝ์ฐ ํ์ฌdev.Session
์ ๋ฐ์ดํธํฉ๋๋ค.nacked
๋ฉ์์ง๊ฐ ์ด๋ ์ธ์ ์์ ์๋์ง ํ์ธํด์ผ ํฉ๋๋ค. -nacked
๋ฉ์์ง๊ฐ ๋ณด๋ฅ ์ค์ธ ์ธ์ (AS ๊ด์ ์์)์ผ ์ ์์ผ๋ฏ๋ก FCnt ์ ๋ฐ์ดํธ๋ ๋ค์์์ ์ํ๋์ด์ผ ํฉ๋๋ค. ์ฌ๋ฐ๋ฅธ ์ธ์ .https://github.com/TheThingsNetwork/lorawan-stack/blob/e2fa6c085eaaf1a0b70939020244875bd01e5857/pkg/applicationserver/applicationserver.go#L1060 -L1073
์ด์ ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก
SessionKeyID
๋ฅผ ์ผ์ ์ฌ์ฉํ ์ธ์ ์ ๊ฒฐ์ ํฉ๋๋ค. ํ์ํ ๊ฒฝ์ฐ ํ์ฌdev.Session
์ ๋ฐ์ดํธํฉ๋๋ค.DownlinkQueue{Push|Replace}
์ ๋ํ ์ค๋ฅ ์ธ๋ถ ์ ๋ณด๋ฅผ ์ต์FCnt
๋ฐํํ๊ณ ํญ์LastAFCntDown
๋ฅผ ์ด ๊ฐ์ผ๋ก ์ ๋ฐ์ดํธํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ด๋ค ์ง์ ์์๋ AS์ NS ๊ฐ์ ๋๊ธฐํ๋์ง ์์ ๊ฒฝ์ฐ ์์คํ ์ด ์๋ ด๋ฉ๋๋ค.๋ค์
proto
์ถ๊ฐ๋ ์ฑ์์ ธ์ผ ํ๋ฉฐ NS์errFCntTooLow
์ ์ค๋ฅ ์ธ๋ถ ์ ๋ณด๋ก ์ถ๊ฐ๋์ด์ผ ํฉ๋๋ค.๊ทธ๋ฐ ๋ค์ AS๋ ์ด๋ฌํ ์ธ๋ถ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ ํ์ฌ ์ธ์ ์ ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค.
๋ณ๊ฒฝ ์ฌํญ์ ์ด์ ๋ฒ์ ๊ณผ ํธํ๋๋ฉฐ NS ์ธก์์ ์ต์ํ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. genie๋ ์ด๋ฏธ ๋ณ์์ ๋ฒ์ด๋ฌ์ต๋๋ค. AS์ NS ๊ฐ์ ์ ์ฒด ํ๋กํ ์ฝ์ ์ฒ์ฒํ ๋น๋๊ธฐํ๋์์ผ๋ฉฐ ๋จ์ํ
FPort=0
๋ณ๊ฒฝ์ ๋๋๋ฆฌ๋ ๊ฒ๋ง์ผ๋ก๋ ์ถฉ๋ถํ์ง ์์ต๋๋ค. ๋๋ ์ด ๋ณํ์ด ๊ฒฐ๊ตญ ์๋ชป๋์๋ค๊ณ ์๊ฐํ์ง ์์ง๋ง ์ธ์ ๋ฐ์ด์๋ฎฌ๋ ์ด์ ๊ณผ ๊ด๋ จํ์ฌ ์ด๋ฌํ ๋จ์ ์ ์์ ํด์ผ ํฉ๋๋ค.cc @johanstokking , @rvolosatovs