IPv6 over LoRaWAN.
More...
#include <IPv6LoRaWAN.hpp>
|
| | IPv6LoRaWAN (LoRaMac &mac, uint8_t fPort=0) |
| | IPv6LoRaWAN 인터페이스를 생성합니다.
|
| error_t | begin (const uint8_t *devIID, const uint8_t *appIID) |
| | IPv6LoRaWAN 인터페이스를 시작합니다.
|
|
| IPv6Interface (Type_t type, uint8_t neigh_list_len, uint8_t prefix_list_len, uint16_t mtu) |
| error_t | getAddress (IPv6Address::Type_t type, IPv6Address &dst) |
| | Get an IPv6 address assigned to the inf interface.
|
|
error_t | getAddress (IPv6Address::Type_t type, uint8_t *dst) |
| uint8_t | setPrefix (const IPv6Address &prefix_addr, uint8_t prefix_len, uint32_t lifetime, uint32_t pref_lifetime, bool autoconf) |
| | Set a prefix to an IPv6 interface.
|
|
void | setStateNotifier (void(*func)(IPv6Interface &, State_t)) |
|
bool | isAttached () |
|
State_t | setState (State_t s) |
|
| error_t | getIID (uint8_t *dst) override |
| bool | isInMulticastGroup (const IPv6Address &mcaddr) override |
| error_t | send (uint8_t nxhop, IPv6PacketBuffer *ippkt) override |
| void | receiveRS (IPv6::Header_t &ip6, void *msg, uint16_t len) override |
| void | receiveRA (IPv6::Header_t &ip6, void *msg, uint16_t len) override |
| void | receiveNS (IPv6::Header_t &ip6, void *msg, uint16_t len) override |
| void | receiveNA (IPv6::Header_t &ip6, void *msg, uint16_t len) override |
| void | receiveRedirect (IPv6::Header_t &ip6, void *msg, uint16_t len) override |
| void | confirmReach (uint8_t neigh) override |
| void | onTick () override |
| void | onStateChanged () override |
| void | notifySendDone (PacketRadio &, RadioPacket *) override |
| void | notifyReceive (PacketRadio &, const RadioPacket *) override |
|
bool | hasIID (const uint8_t *iid) |
|
virtual uint8_t | addNeighbor (const IPv6Address &addr) |
|
void | removeNeighbor (uint8_t n) |
|
IPv6Neighbor * | getNeighbor (const IPv6Address &addr) |
|
uint8_t | getNeighborIndex (const IPv6Address &addr) |
|
| enum | Type_t {
TYPE_UNKNOWN = 0
, TYPE_6LOWPAN = 1
, TYPE_ETHERNET = 2
, TYPE_PPP = 3
,
TYPE_6LPWAN = 4
} |
| enum | State_t {
STATE_NONE = 0
, STATE_BECOMING_HOST = 1
, STATE_DUPLICATE = 2
, STATE_HOST = 3
,
STATE_BECOMING_ROUTER = 4
, STATE_ROUTER = 5
} |
|
static const char * | GetStateString (State_t) |
|
bool | ll_dad_passed |
|
uint8_t | def_hop_limit |
|
const uint16_t | MTU |
|
uint16_t | pmtu |
|
Type_t | dev_type |
|
IPv6Prefix ** | prefix = NULL |
|
const uint8_t | MAX_NUM_PREFIX |
|
uint8_t | num_valid_prefix |
|
IPv6Neighbor ** | neighbor = NULL |
|
const uint8_t | MAX_NUM_NEIGH |
|
State_t | state |
|
void(* | notify )(IPv6Interface &, State_t) = NULL |
|
IPv6Interface * | next = NULL |
IPv6 over LoRaWAN.
LoRaWAN 에서 IPv6 패킷을 전송하기 위한 IPv6 인터페이스입니다. IETF의 LPWAN WG의 draft-ietf-lpwan-ipv6-static-context-hc-16 (이하 IPv6 SCHC)을 기반으로 구현되었습니다. 해당 IETF 문서는 RFC가 아니며 이 클래스 또한 실험적으로 구현되었습니다. 또한 이를 연동하기 위해서는 server-side 에서도 적절한 내용이 구현되어야 합니다. 자세한 기술 문의는 suppo.nosp@m.rt@c.nosp@m.oxlab.nosp@m..kr 로 해주시기 바랍니다.
SCHC는 대역폭이 매우 제한적인 LoRaWAN 환경에서 애플리케이션 서버(이하 서버)와 디바이스가 공통의 context를 공유하여 IPv6에 대해 최고의 압축을 수행하여 IPv6 패킷을 전송하기 위한 압축기술 입니다. SCHC는 LoRaWAN 을 포함한 LPWAN에서 공통으로 적용될 수 있는 내용을 기술한 것으로 LoRaWAN-specific SCHC는 별도의 문서(draft-petrov-lpwan-ipv6-schc-over-lorawan-02)에 정의가 될 예정입니다. 하지만 현 시점에서 그 내용이 아직 부족하여 다음과 같이 몇가지를 강제합니다.
- Rule ID: draft-petrov-lpwan-ipv6-schc-over-lorawan-02에서는 이를 LoRaWAN MAC header의 FPort field를 활용한다고 하는데 우리는 fPort를 222번으로 할당하고 Rule ID는 payload에 포함되도록 하였습니다. 이는 IoT.own 등 LoRaWAN 서버들이 당장 IPv6 만을 지원하기 보다는 기존 MAC 프로토콜로도 통신이 되어야 할 가능성이 현실적으로 높기 때문입니다. 따라서 MAC payload는 다음과 같은 내용들이 채워질 것입니다.
| IPv6 SCHC Rule ID (8-byte) | Compression Residue (M-byte) | UDP data (N-byte) |
- 서버와 디바이스간 Rule ID 및 Rule 에 대한 정의는 factory-programmed를 가정하며 별도의 on-the-fly 전파 프로토콜은 고려하지 않습니다.
- 압축을 하지 않고 전송할 때는 Rule ID 255를 사용합니다.
- 최소한의 압축을 수행하는 Rule ID 254는 다음과 같이 정의합니다.
| Field | FL | FP | DI | Value | Match Operation | Comp./Decomp. Action | Sent Bits |
| IPv6 Version | 4 | 1 | Bi | 6 | equal | not-sent | 0 |
| IPv6 DiffServ | 8 | 1 | Bi | 0 | equal | not-sent | 0 |
| IPv6 Flow Label | 20 | 1 | Bi | 0 | equal | not-sent | 0 |
| IPv6 Length | 16 | 1 | Bi | | ignore | comp-length | 0 |
| IPv6 Next Header | 8 | 1 | Bi | 17 | equal | not-sent | 0 |
| IPv6 Hop Limit | 8 | 1 | Bi | | ignore | value-sent | 8 |
| IPv6 Dev Prefix | 64 | 1 | Bi | fe80:: | equal | not-sent | 0 |
| IPv6 Dev IID | 64 | 1 | Bi | | ignore | DevEUI | 0 |
| IPv6 App Prefix | 64 | 1 | Bi | fe80:: | equal | not-sent | 0 |
| IPv6 App IID | 64 | 1 | Bi | | ignore | AppEUI | 0 |
| UDP Dev Port | 16 | 1 | Bi | | ignore | value-sent | 16 |
| UDP App Port | 16 | 1 | Bi | | ignore | value-sent | 16 |
| UDP Length | 16 | 1 | Bi | | ignore | comp-length | 0 |
| UDP Checksum | 16 | 1 | Bi | | ignore | comp-checksum | 0 |
- Fragmentation/Reassembly는 지원하지 않습니다.
- CoAP SCHC (draft-ietf-lpwan-coap-static-context-hc-04)는 지원하지 않습니다.
- Examples
- plm100s/IPv6overLoRaWAN/main.cpp.
◆ IPv6LoRaWAN()
| IPv6LoRaWAN::IPv6LoRaWAN |
( |
LoRaMac & | mac, |
|
|
uint8_t | fPort = 0 ) |
IPv6LoRaWAN 인터페이스를 생성합니다.
- Parameters
-
| mac | 사용할 LoRaWAN MAC |
| fPort | 사용할 fPort 주소. 0 인 경우, Rule ID에 해당하는 fPort로 전송합니다. 0 이 아닌 경우, 지정한 fPort로 전송이 되며, Rule ID는 SCHC 패킷 가장 앞에 위치하게 됩니다. (기본 값: 0) |
◆ begin()
| error_t IPv6LoRaWAN::begin |
( |
const uint8_t * | devIID, |
|
|
const uint8_t * | appIID ) |
IPv6LoRaWAN 인터페이스를 시작합니다.
- Parameters
-
| devIID | 내 주소 생성에 사용할 나의 EUI-64 |
| appIID | 상대방 주소에 참고할 애플리케이션 서버의 EUI-64 |
이 함수를 부르기 전, 생성자에서 지정한 LoRaWAN MAC은 각종 콜백함수 지정, 시작(LoRaMac::begin()) 및 네트워크에 join이 완료되어야 합니다.
IPv6LoRaWAN 인터페이스가 시작되면 LoRaWAN MAC의 다음 함수에서 지정한 콜백들은 이 인터페이스에 의해 인터셉트됩니다.
◆ confirmReach()
| void IPv6LoRaWAN::confirmReach |
( |
uint8_t | neigh | ) |
|
|
overrideprotectedvirtual |
◆ getIID()
| error_t IPv6LoRaWAN::getIID |
( |
uint8_t * | dst | ) |
|
|
overrideprotectedvirtual |
◆ isInMulticastGroup()
| bool IPv6LoRaWAN::isInMulticastGroup |
( |
const IPv6Address & | mcaddr | ) |
|
|
overrideprotectedvirtual |
◆ notifyReceive()
◆ notifySendDone()
◆ onStateChanged()
| void IPv6LoRaWAN::onStateChanged |
( |
| ) |
|
|
overrideprotectedvirtual |
◆ onTick()
| void IPv6LoRaWAN::onTick |
( |
| ) |
|
|
overrideprotectedvirtual |
◆ receiveNA()
| void IPv6LoRaWAN::receiveNA |
( |
IPv6::Header_t & | ip6, |
|
|
void * | msg, |
|
|
uint16_t | len ) |
|
overrideprotectedvirtual |
◆ receiveNS()
| void IPv6LoRaWAN::receiveNS |
( |
IPv6::Header_t & | ip6, |
|
|
void * | msg, |
|
|
uint16_t | len ) |
|
overrideprotectedvirtual |
◆ receiveRA()
| void IPv6LoRaWAN::receiveRA |
( |
IPv6::Header_t & | ip6, |
|
|
void * | msg, |
|
|
uint16_t | len ) |
|
overrideprotectedvirtual |
◆ receiveRedirect()
| void IPv6LoRaWAN::receiveRedirect |
( |
IPv6::Header_t & | ip6, |
|
|
void * | msg, |
|
|
uint16_t | len ) |
|
overrideprotectedvirtual |
◆ receiveRS()
| void IPv6LoRaWAN::receiveRS |
( |
IPv6::Header_t & | ip6, |
|
|
void * | msg, |
|
|
uint16_t | len ) |
|
overrideprotectedvirtual |
◆ send()
The documentation for this class was generated from the following file: