Lorawan-stack: ๋„คํŠธ์›Œํฌ ์„œ๋ฒ„ ๋ฉ”์‹œ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ตœ์ข… ์žฅ์น˜ ์„ธ์…˜ ํ™•์ธ

์— ๋งŒ๋“  2021๋…„ 01์›” 08์ผ  ยท  8์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: TheThingsNetwork/lorawan-stack

์š”์•ฝ

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๋Š” ๋‹ค์Œ ์ด๋ฒคํŠธ์—์„œ ์ตœ์ข… ์žฅ์น˜ ์„ธ์…˜์„ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: dev.PendingSession ์„ dev.Session ).

  • ์—…๋งํฌ ๋ฉ”์‹œ์ง€(์ด๋ฏธ ๋ฐœ์ƒ)
  • ๋‹ค์šด๋งํฌ ํ™•์ธ
  • ๋‹ค์šด๋งํฌ ๋„ฅ
  • ๋‹ค์šด๋งํฌ ์‹คํŒจ(์˜ค๋ฅ˜๊ฐ€ ์•Œ ์ˆ˜ ์—†๋Š” ์„ธ์…˜์ด ์•„๋‹Œ ๊ฒฝ์šฐ)
  • ๋‹ค์šด๋งํฌ ๋Œ€๊ธฐ์—ด์ด ๋ฌดํšจํ™”๋จ

์™œ ์ด๊ฒƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ?

ํ˜„์žฌ NS๋Š” AS ์—†์ด ์„ธ์…˜์„ '์ „ํ™˜'ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. @rvolosatovs ๋Š” ๋‹ค์Œ ์‹œํ€€์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ v3.11 ์—์„œ ์ด๊ฒƒ์„ ์žฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ์ตœ์ข… ์žฅ์น˜ ์กฐ์ธ - AS๋Š” ์ด ์„ธ์…˜์— ๋Œ€ํ•ด dev.PendingSession ๋กœ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ตœ์ข… ์žฅ์น˜๋Š” FPort=0 ์—…๋งํฌ๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค. - AS๋Š” ์ด ์—…๋งํฌ๋ฅผ ์ˆ˜์‹ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋„คํŠธ์›Œํฌ ์„œ๋ฒ„๋Š” FPort=0 ๋‹ค์šด๋งํฌ๋ฅผ ์˜ˆ์•ฝํ•ฉ๋‹ˆ๋‹ค.
  • ๋„คํŠธ์›Œํฌ ์„œ๋ฒ„๋Š” AS์— DownlinkQueueInvalidated ์ด๋ฒคํŠธ๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
  • AS๋Š” dev.Session ๊ฐ€ ์—†์œผ๋ฏ€๋กœ ์ด ๋‹ค์šด๋งํฌ ๋Œ€๊ธฐ์—ด ๋ฌดํšจํ™”๋ฅผ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค.

์ด ์‹œ์ ์—์„œ AS๋Š” NS๊ฐ€ FPort=0์„ ๋ณด๋‚ผ ๋•Œ ๋ฐœ์ƒํ•œ FCnt ์ฆ๊ฐ€๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฑฐ๋ถ€ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— NS๊ฐ€ ๋ฏธ๋ž˜์— ๋˜ ๋‹ค๋ฅธ ๋ฌดํšจํ™”๋ฅผ ๋ณด๋‚ด์ง€ ์•Š๋Š” ํ•œ ์ด ์„ธ์…˜์—์„œ ๋‹ค์šด๋งํฌ๋ฅผ ๋‹ค์‹œ ์˜ˆ์•ฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค์šด๋งํฌ(์ด์ œ FCnt๋Š” ํ•ญ์ƒ ๋„ˆ๋ฌด ๋‚ฎ์Œ).

์ด๋ฏธ ๊ฑฐ๊ธฐ์— ๋ฌด์—‡์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ง€๊ธˆ ๋ฌด์—‡์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜์ค‘์— ๋ฌดํšจํ™”๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฉด ์„ธ์…˜์ด ๋ณต๊ตฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์—†์–ด์ง„ ๋ฌผ๊ฑด ์žˆ์–ด์š”? ๋ญ๋ฅผ๋ณด๊ณ  ์‹ถ์œผ์„ธ์š”?

  • SessionKeyID ๋ฅผ DownlinkQueueInvalidation ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๊ธฐ์—ด์ด ๋น„์–ด ์žˆ์œผ๋ฉด AS๋Š” ํ˜„์žฌ ์–ด๋–ค ๋Œ€๊ธฐ์—ด์ด ๋ฌดํšจํ™”๋˜์—ˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • AS๋Š” ํ•ญ์ƒ ๋ฌดํšจํ™”๊ฐ€ dev.Session ์ •๋„๋ผ๊ณ  ๊ฐ€์ •ํ•˜๋Š” ๋Œ€์‹  ์˜ฌ๋ฐ”๋ฅธ ์„ธ์…˜์˜ queue + FCnt๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • AS๋Š” nacked ๋ฉ”์‹œ์ง€๊ฐ€ ์–ด๋Š ์„ธ์…˜์—์„œ ์™”๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. - nacked ๋ฉ”์‹œ์ง€๊ฐ€ ๋ณด๋ฅ˜ ์ค‘์ธ ์„ธ์…˜(AS ๊ด€์ ์—์„œ)์ผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ FCnt ์—…๋ฐ์ดํŠธ๋Š” ๋‹ค์Œ์—์„œ ์ˆ˜ํ–‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅธ ์„ธ์…˜.
  • ๋งˆ์ง€๋ง‰์œผ๋กœ AS๋Š” Summary ์–ธ๊ธ‰๋œ ๋ฉ”์‹œ์ง€๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ as should ์„ธ์…˜์„ dev.PendingSession ์™€ dev.Session ์‚ฌ์ด์—์„œ ์ „ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ™˜๊ฒฝ

v3.11

์ด๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ป๊ฒŒ ์ œ์•ˆํ•ฉ๋‹ˆ๊นŒ?

  • ํ•„์š”ํ•œ proto ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  NS ์ธก์—์„œ ์ฑ„์šฐ์‹ญ์‹œ์˜ค.
  • ๋ฌดํšจํ™”/nack ๋™์•ˆ ์‚ฌ์šฉ ์ค‘์ธ ์„ธ์…˜์„ ํ™•์ธํ•˜๊ณ  AS์—์„œ ํ•ด๋‹น ์„ธ์…˜์„ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์„ธ์…˜ ์ „ํ™˜ ์ ˆ์ฐจ๋ฅผ handleUplink ๋ฐ–์œผ๋กœ ์˜ฎ๊ธฐ๊ณ  ๋ชจ๋“  ์ ์ ˆํ•œ ์—…๋งํฌ ์œ ํ˜•์—์„œ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • (์„ ํƒ ์‚ฌํ•ญ) DownlinkQueue{Push|Replace} ์— ๋Œ€ํ•œ ์˜ค๋ฅ˜ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ์ตœ์†Œ FCnt ๋ฐ˜ํ™˜ํ•˜๊ณ  ํ•ญ์ƒ LastAFCntDown ๋ฅผ ์ด ๊ฐ’์œผ๋กœ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์–ด๋–ค ์ง€์ ์—์„œ๋“  AS์™€ NS ๊ฐ„์— ๋™๊ธฐํ™”๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์‹œ์Šคํ…œ์ด ์ˆ˜๋ ด๋ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ป๊ฒŒ ์ œ์•ˆํ•ฉ๋‹ˆ๊นŒ?

์žฌ์ƒ ๋‹จ๊ณ„์—์„œ ์–ธ๊ธ‰ํ•œ ์ˆœ์„œ๋ฅผ ์žฌ์ƒํ•ด ๋ณด์‹ญ์‹œ์˜ค.

์ด ์ž‘์—…์„ ์ง์ ‘ ์ˆ˜ํ–‰ํ•˜๊ณ  Pull Request๋ฅผ ์ œ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์˜ˆ, ํ•˜์ง€๋งŒ ์ด๊ฒƒ์€ ์‚ฌ์†Œํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด๋ฏ€๋กœ ์ด ๋ฌธ์ œ์— ๋จผ์ € discussion ํƒœ๊ทธ๋ฅผ ์ง€์ •ํ•˜๋„๋ก ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋„์ž…ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๋‹ค์šด๋งํฌ ๋Œ€๊ธฐ์—ด ๋ฌดํšจํ™” ํ•˜๋‚˜๋Š” ์š”๊ตฌ ์‚ฌํ•ญ์œผ๋กœ ๋ณด์ด์ง€๋งŒ ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ์ผ๊ด€์„ฑ์— ์ข‹์Šต๋‹ˆ๋‹ค.

cc @rvolosatovs

bug application server network server in progress

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

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];
}
  • AS๋Š” ํ•ญ์ƒ ๋ฌดํšจํ™”๊ฐ€ dev.Session ์ •๋„๋ผ๊ณ  ๊ฐ€์ •ํ•˜๋Š” ๋Œ€์‹  ์˜ฌ๋ฐ”๋ฅธ ์„ธ์…˜์˜ queue + FCnt๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

https://github.com/TheThingsNetwork/lorawan-stack/blob/e2fa6c085eaaf1a0b70939020244875bd01e5857/pkg/applicationserver/applicationserver.go#L1020 -L1038

dev.Session ํ•ญ์ƒ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  SessionKeyID ๋ฅผ ์ผœ์„œ ์‚ฌ์šฉํ•  ์„ธ์…˜์„ ์„ค์ •ํ•˜์‹ญ์‹œ์˜ค. ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํ˜„์žฌ dev.Session ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

  • AS๋Š” 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 ์— ์˜ค๋ฅ˜ ์„ธ๋ถ€ ์ •๋ณด๋กœ ์ถ”๊ฐ€๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

๋ชจ๋“  8 ๋Œ“๊ธ€

์šฐ๋ฆฌ๊ฐ€ ์ด๋ฏธ ๋…ผ์˜ํ•œ ๋ฐ”์™€ ๊ฐ™์ด ๋‚˜๋Š” ์ด๊ฒƒ์— ์ฐฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
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];
}
  • AS๋Š” ํ•ญ์ƒ ๋ฌดํšจํ™”๊ฐ€ dev.Session ์ •๋„๋ผ๊ณ  ๊ฐ€์ •ํ•˜๋Š” ๋Œ€์‹  ์˜ฌ๋ฐ”๋ฅธ ์„ธ์…˜์˜ queue + FCnt๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

https://github.com/TheThingsNetwork/lorawan-stack/blob/e2fa6c085eaaf1a0b70939020244875bd01e5857/pkg/applicationserver/applicationserver.go#L1020 -L1038

dev.Session ํ•ญ์ƒ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  SessionKeyID ๋ฅผ ์ผœ์„œ ์‚ฌ์šฉํ•  ์„ธ์…˜์„ ์„ค์ •ํ•˜์‹ญ์‹œ์˜ค. ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํ˜„์žฌ dev.Session ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

  • AS๋Š” 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 ์— ์˜ค๋ฅ˜ ์„ธ๋ถ€ ์ •๋ณด๋กœ ์ถ”๊ฐ€๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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์—์„œ ๋ฐ›์€ ์ด๋ฒคํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋Š” ๊ทผ๋ณธ์ ์œผ๋กœ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

  • ๋ฉ”์‹œ์ง€๊ฐ€ ์˜ค๋ž˜๋˜์—ˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ _now_ ๋Œ€๊ธฐ์—ด์„ ์ˆ˜์ •ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
  • ๋ฉ”์‹œ์ง€๊ฐ€ ์†์‹ค๋  ์ˆ˜ ์žˆ์Œ - ๋Œ€๊ธฐ์—ด์ด ๋ฌดํ•œํ•˜์ง€ ์•Š์Œ
  • ๋ฉ”์‹œ์ง€๋Š” ์žฌ์ •๋ ฌ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๊ธฐ์—ด์— ๋น„๋™๊ธฐ์‹์œผ๋กœ ํ‘ธ์‹œ๋˜๊ณ  ์ž ์žฌ์ ์œผ๋กœ ์žฌ์ •๋ ฌ๋œ ๋ฐฉ์‹์œผ๋กœ ํŒ๋ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ํŠน์„ฑ์„ ๊ณ ๋ คํ•  ๋•Œ ๋‘ ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ผ๊ด„ ์ฒ˜๋ฆฌ๊ฐ€ ๋๋‚  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ์—ด ๊ณ„์‚ฐ์„ ์ง€์—ฐํ•ฉ๋‹ˆ๋‹ค(๊ธฐ๋ณธ์ ์œผ๋กœ 10๊ฐœ์˜ ๋‹ค์šด๋งํฌ ๋Œ€๊ธฐ์—ด ๋ฌดํšจํ™”๋ฅผ ์ˆ˜์‹ ํ•˜๋Š” ๊ฒฝ์šฐ ๋งˆ์ง€๋ง‰์—๋งŒ ๋Œ€๊ธฐ์—ด์„ ๋‹ค์‹œ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค). ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

    • AS๊ฐ€ ๋ฉ”์‹œ์ง€ ์ผ๊ด„ ์ฒ˜๋ฆฌ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ๋Œ€๊ธฐ์—ด ๋์— _์ •๋ง_ ์žˆ๋Š”์ง€ ๋˜๋Š” ์ค‘๊ฐ„์— ์ผ๋ถ€ ์ผ๊ด„ ์ฒ˜๋ฆฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ๋Š”์ง€ ์—ฌ์ „ํžˆ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

    • ๋ฉ”์‹œ์ง€๋Š” ์—ฌ์ „ํžˆ ์†์‹ค๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ˆœ์„œ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์€ ๊ฐ„๋‹จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • ๊ทธ๋ƒฅ _NS๋ฅผ ๋ฏฟ์œผ์„ธ์š”_. ์ด๊ฒƒ์ด ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋Š” ํ‘ธ์‹œ/๋ฐ”๊พธ๊ธฐ ์ž‘์—…์ด ์˜ค๋ฅ˜ ์„ธ๋ถ€ ์ •๋ณด์˜ ์ผ๋ถ€๋กœ dev.Session.SessionKeyID , dev.PendingSession.SessionKeyID ๋ฐ LastAFCntDown ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์˜ค๋ฅ˜ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ AS์—์„œ ์„ธ์…˜์„ ์žฌ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด๊ฒƒ์€ ์˜ค๋ž˜๋œ ๋ฐ์ดํ„ฐ(์•„๋งˆ๋„ ์˜ค๋ž˜๋œ ์„ธ์…˜, ๋„ˆ๋ฌด ๋‚ฎ์€ FCnt)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์šด๋งํฌ ๋Œ€๊ธฐ์—ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๊ฒฐ๊ตญ NS ์ƒํƒœ๋กœ ์ˆ˜๋ ดํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ํ•œ ๋ฒˆ, ๋‘ ๋ฒˆ, ์„ธ ๋ฒˆ ์‹œ๋„ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌดํ•œ ํšŒ์ „์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๊ฒฝ๊ณ„๋กœ ๋งŒ๋“ค๊ฒ ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ ์–ด๋„ ์—…๋งํฌ ๋ฉ”์‹œ์ง€ ๋Œ€๊ธฐ์—ด์˜ ์ •๋ณด๋ณด๋‹ค ํ›จ์”ฌ ๋” ์ตœ์‹  ์ •๋ณด๋กœ ์ž‘์—…ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ทธ๋ƒฅ _NS๋ฅผ ๋ฏฟ์œผ์„ธ์š”_. ์ด๊ฒƒ์ด ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋Š” ํ‘ธ์‹œ/๋ฐ”๊พธ๊ธฐ ์ž‘์—…์ด ์˜ค๋ฅ˜ ์„ธ๋ถ€ ์ •๋ณด์˜ ์ผ๋ถ€๋กœ dev.Session.SessionKeyID , dev.PendingSession.SessionKeyID ๋ฐ LastAFCntDown ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์˜ค๋ฅ˜ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ AS์—์„œ ์„ธ์…˜์„ ์žฌ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด๊ฒƒ์€ ์˜ค๋ž˜๋œ ๋ฐ์ดํ„ฐ(์•„๋งˆ๋„ ์˜ค๋ž˜๋œ ์„ธ์…˜, ๋„ˆ๋ฌด ๋‚ฎ์€ FCnt)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์šด๋งํฌ ๋Œ€๊ธฐ์—ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๊ฒฐ๊ตญ NS ์ƒํƒœ๋กœ ์ˆ˜๋ ดํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ํ•œ ๋ฒˆ, ๋‘ ๋ฒˆ, ์„ธ ๋ฒˆ ์‹œ๋„ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌดํ•œ ํšŒ์ „์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๊ฒฝ๊ณ„๋กœ ๋งŒ๋“ค๊ฒ ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ ์–ด๋„ ์—…๋งํฌ ๋ฉ”์‹œ์ง€ ๋Œ€๊ธฐ์—ด์˜ ์ •๋ณด๋ณด๋‹ค ํ›จ์”ฌ ๋” ์ตœ์‹  ์ •๋ณด๋กœ ์ž‘์—…ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์ตœ์„ ์˜ ์„ ํƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰