아래의 코드는 파일 오퍼레이션에 관련 함수를 등록 하고, net_device_ops 구조체의 init과 관련된 함수의 소스 입니다.

alloc_percpu 함수는 멀티코어 에서 각각 CPU 별로, 메모리를 할당 하는 메크로 입니다. 



 

// 루프백 디바이스 초기화

static int loopback_dev_init(struct net_device *dev)

{

        struct pcpu_lstats __percpu *lstats;


        lstats = alloc_percpu(struct pcpu_lstats);   // 메모리 할당

        if (!lstats)                                                      // 만일 메모리 할당이 되지 않으면 -ENOMEM 에러를 반환

                return -ENOMEM;


        dev->ml_priv = (void __force *)lstats;               // 프라이빗 구조체에 할당한 메모리를 연결

        return 0;

}


// 루프백 디바이스에 할당한 메모리 해제 하기

static void loopback_dev_free(struct net_device *dev)

{

        struct pcpu_lstats __percpu *lstats =

                (void __percpu __force *)dev->ml_priv;


        free_percpu(lstats);           // init 함수에서 할당한 lstats 메모리 해제

        free_netdev(dev);              //  loopback_net_init 함수에서 할당한 dev 메모리 해제

}


// 파일 오퍼레이션 구조체에 함수 등록 하기

static const struct net_device_ops loopback_ops = {

        .ndo_init      = loopback_dev_init,          // 초기화

        .ndo_start_xmit= loopback_xmit,          // 데이터 전송

        .ndo_get_stats = loopback_get_stats,  // 상태값 읽기 

};