2016-12-21 2 views
0

우분투 16.04.1을 실행하는 qemu VM에서 네트워크 드라이버를 실험하고 있습니다. uname -r은 커널 버전으로 4.4.0-31-generic을 제공합니다. 내 코드에서,netdev_ops 함수 포인터에 드라이버 기능을 할당 할 때 "읽기 전용"오류가 발생했습니다.

그러나 과제를 "콜백 몇 가지 포인터를 포함, 하나는 NDO _ *() 함수를 오버라이드 (override)하고자하는 경우 @netdev_ops"

linux/netdevice.h for that kernel version, 나는 코멘트

발견

assignment of member 'ndo_open' in read-only object

또한,(netmod_open 내 자신의 드라이버의 공개 방법) dev->netdev_ops->ndo_open = netmod_open 컴파일러 오류를 제공 등

const struct net_device_ops *netdev_ops; 

가 어떻게 자신의 포인터를 포함하는 구조체 const 경우 "를 NDO _ *() 함수를 오버라이드 (override)"을 할 수 있습니다 :소스에 const로 선언?

+0

내 자신의'struct net_device_ops'를 만들고'dev-> netdev_ops'에'struct'의 주소를 할당해야합니다. 따라서 일반적으로 커널에서 데이터 구조가 전달되는 방식에 대해 더 자세히 알아야합니다. 그러한 정보에 대한 링크는 인정 될 것입니다. 대부분의 튜토리얼에서 오래된 커널 API가있는 것처럼 보입니다. – Vale132

답변

1

How can I "override the ndo_*() functions"

는 오버라이드 (override) 할 유형 struct net_device_ops, (실제로 후크) 설정의 필드의 자신의 변수를 정의하고 dev->netdev_ops에이 변수를 할당합니다.

struct net_device_ops의 경우 description에 따라 .ndo_start_xmit 필드 만 설정해야하며 다른 필드는 초기화되지 않은 상태 (즉, NULL) 일 수 있습니다.