요약·해설과 원문, 전문 번역을 서로 분리했습니다. API 이름, symbol, source path는 원문 표기를 사용합니다.
1. 요약·해설
원문의 핵심 논리와 kernel programming 관점의 보충 설명입니다. 아래의 전문 번역과는 별도로 작성했습니다.
2. 영어 원문 전체
번역 기준이 된 Linux v6.18.37 원문입니다. 줄 번호는 이 버전의 파일 좌표입니다.
원문 전체 펼치기
.. SPDX-License-Identifier: GPL-2.0
==============================================
Netdev private dataroom for 6lowpan interfaces
==============================================
All 6lowpan able net devices, means all interfaces with ARPHRD_6LOWPAN,
must have "struct lowpan_priv" placed at beginning of netdev_priv.
The priv_size of each interface should be calculate by::
dev->priv_size = LOWPAN_PRIV_SIZE(LL_6LOWPAN_PRIV_DATA);
Where LL_PRIV_6LOWPAN_DATA is sizeof linklayer 6lowpan private data struct.
To access the LL_PRIV_6LOWPAN_DATA structure you can cast::
lowpan_priv(dev)-priv;
to your LL_6LOWPAN_PRIV_DATA structure.
Before registering the lowpan netdev interface you must run::
lowpan_netdev_setup(dev, LOWPAN_LLTYPE_FOOBAR);
wheres LOWPAN_LLTYPE_FOOBAR is a define for your 6LoWPAN linklayer type of
enum lowpan_lltypes.
Example to evaluate the private usually you can do::
static inline struct lowpan_priv_foobar *
lowpan_foobar_priv(struct net_device *dev)
{
return (struct lowpan_priv_foobar *)lowpan_priv(dev)->priv;
}
switch (dev->type) {
case ARPHRD_6LOWPAN:
lowpan_priv = lowpan_priv(dev);
/* do great stuff which is ARPHRD_6LOWPAN related */
switch (lowpan_priv->lltype) {
case LOWPAN_LLTYPE_FOOBAR:
/* do 802.15.4 6LoWPAN handling here */
lowpan_foobar_priv(dev)->bar = foo;
break;
...
}
break;
...
}
In case of generic 6lowpan branch ("net/6lowpan") you can remove the check
on ARPHRD_6LOWPAN, because you can be sure that these function are called
by ARPHRD_6LOWPAN interfaces.
3. 한국어 전문 번역
영어 원문의 문단 순서와 의미를 유지한 전체 번역입니다. 코드, 함수명, symbol과 URL은 원문 표기를 유지합니다.
6LoWPAN netdev private 영역의 선두 배치
1-8`.. SPDX-License-Identifier: GPL-2.0`
6lowpan 인터페이스를 위한 netdev private 데이터 영역
6lowpan을 사용할 수 있는 모든 네트워크 장치, 즉 `ARPHRD_6LOWPAN`을 사용하는 모든 인터페이스는 `netdev_priv`의 시작 부분에 `struct lowpan_priv`를 배치해야 합니다.
.. SPDX-License-Identifier: GPL-2.0
==============================================
Netdev private dataroom for 6lowpan interfaces
==============================================
All 6lowpan able net devices, means all interfaces with ARPHRD_6LOWPAN,
must have "struct lowpan_priv" placed at beginning of netdev_priv.
크기 계산, 접근, 초기화
9-27각 인터페이스의 `priv_size`는 다음과 같이 계산해야 합니다.
dev->priv_size = LOWPAN_PRIV_SIZE(LL_6LOWPAN_PRIV_DATA);
`LL_PRIV_6LOWPAN_DATA`는 링크 계층 6lowpan private data 구조체의 `sizeof` 값입니다. `LL_PRIV_6LOWPAN_DATA` 구조체에 접근하려면 다음 표현을 사용해 해당 `LL_6LOWPAN_PRIV_DATA` 구조체 형식으로 캐스팅할 수 있습니다.
lowpan_priv(dev)-priv;
lowpan netdev 인터페이스를 등록하기 전에 다음 함수를 반드시 실행해야 합니다.
lowpan_netdev_setup(dev, LOWPAN_LLTYPE_FOOBAR);
여기서 `LOWPAN_LLTYPE_FOOBAR`는 `enum lowpan_lltypes`에 속하는 해당 6LoWPAN 링크 계층 형식의 정의입니다.
The priv_size of each interface should be calculate by::
dev->priv_size = LOWPAN_PRIV_SIZE(LL_6LOWPAN_PRIV_DATA);
Where LL_PRIV_6LOWPAN_DATA is sizeof linklayer 6lowpan private data struct.
To access the LL_PRIV_6LOWPAN_DATA structure you can cast::
lowpan_priv(dev)-priv;
to your LL_6LOWPAN_PRIV_DATA structure.
Before registering the lowpan netdev interface you must run::
lowpan_netdev_setup(dev, LOWPAN_LLTYPE_FOOBAR);
wheres LOWPAN_LLTYPE_FOOBAR is a define for your 6LoWPAN linklayer type of
enum lowpan_lltypes.
링크 계층 private data 접근 예
28-50보통 다음과 같이 private data를 가져올 수 있습니다.
static inline struct lowpan_priv_foobar *
lowpan_foobar_priv(struct net_device *dev)
{
return (struct lowpan_priv_foobar *)lowpan_priv(dev)->priv;
}
먼저 `dev->type`이 `ARPHRD_6LOWPAN`인지 검사해 공통 `lowpan_priv`를 얻고, 이어서 `lowpan_priv->lltype`을 검사합니다. 링크 계층 형식이 `LOWPAN_LLTYPE_FOOBAR`이면 `lowpan_foobar_priv(dev)`로 전용 구조체에 접근해 802.15.4 6LoWPAN 처리를 수행합니다.
Example to evaluate the private usually you can do::
static inline struct lowpan_priv_foobar *
lowpan_foobar_priv(struct net_device *dev)
{
return (struct lowpan_priv_foobar *)lowpan_priv(dev)->priv;
}
switch (dev->type) {
case ARPHRD_6LOWPAN:
lowpan_priv = lowpan_priv(dev);
/* do great stuff which is ARPHRD_6LOWPAN related */
switch (lowpan_priv->lltype) {
case LOWPAN_LLTYPE_FOOBAR:
/* do 802.15.4 6LoWPAN handling here */
lowpan_foobar_priv(dev)->bar = foo;
break;
...
}
break;
...
}
일반 6lowpan 분기
51-53일반 6lowpan 분기인 `net/6lowpan`에서는 이 함수들이 `ARPHRD_6LOWPAN` 인터페이스에서 호출된다는 점이 보장되므로 `ARPHRD_6LOWPAN` 검사를 제거할 수 있습니다.
In case of generic 6lowpan branch ("net/6lowpan") you can remove the check
on ARPHRD_6LOWPAN, because you can be sure that these function are called
by ARPHRD_6LOWPAN interfaces.
요약·해설
6lowpan.rst:1-536LoWPAN 장치 드라이버는 `netdev_priv`의 첫 부분을 공통 `struct lowpan_priv`로 통일하고 그 뒤에 링크 계층 전용 private data를 둡니다. 이 배치 덕분에 공통 6LoWPAN 코드는 장치 형식과 `lltype`을 확인한 뒤 전용 구조체로 안전하게 내려갈 수 있습니다.
공통 prefix와 링크 계층 전용 영역의 관계를 정리했습니다.
장치 유형과 링크 계층 유형을 차례로 검사합니다.