간단한 네트워크 디바이스 드라이버에 대하여 살펴 보도록 하겠습니다.

 

리눅스 커널에서 우리가 코드 만을 가지고 이해 할 수 있는 샘플이 있습니다.

 

이 파일은 커널에 있는 디바이스 드라이버 예는 drivers/net/loopback.c 파일 입니다.

loopback.c 파일은 리눅스에서 lo 인터페이스(루프백 인터페이스)를 구현 하기 위해 사용되는 네트워크 디바이스 드라이버 입니다.

 

이 루프백 인터페이스로 데이터를 보내면 자신에게 데이터가 도착 한것처럼 보입니다.

 

우선 간단하게 구현 되어 있는 loopback.c 파일 부터 조금씩 살펴 보도록 하겠습니다.

 

실제 내용은 190 라인 정도로 짧게 구성 되어 있습니다.

 

아래의 코드는 모듈 초기화  관련된 부분 입니다.

 

 

/* 루프백 디바이스의 등록과 설정 */
static __net_init int loopback_net_init(struct net *net)
{
        struct net_device *dev;
        int err;

        err = -ENOMEM;
        // 드라이버 사용을위하여 구조체 net_device를 데이터 공간에 할당 하고, 기본 초기화를 수행 합니다.
        dev = alloc_netdev(0, "lo", loopback_setup);
        if (!dev)             // 만일 공간이 할당되지 않으면, out 라벨로 갑니다.
                goto out;

        dev_net_set(dev, net);  // net->use_cnt 값을 증가 합니다.
        err = register_netdev(dev);  // 네트워크 디바이스를 등록 합니다. 네트워크 장치 구조를 커널 인터페이스에 추가 합니다. '0' 은 성공 이며, 음수는 에러 입니다. 같은 이름을 또 등록 할 경우도 에러로 리턴 합니다.
        if (err)
                goto out_free_netdev;

        net->loopback_dev = dev;  // struct net_device 형태로 되어 있는 loopback_dev 에 위에서 할당 받은 dev 를 연결 합니다.
        return 0;

out_free_netdev:
        free_netdev(dev);
out:  // out 라벨에서는 net 과 &init_net 이 같으면 panic 함수가 호출 됩니다. 그리고 err를 리턴 합니다.
        if (net_eq(net, &init_net))
                panic("loopback: Failed to register netdevice: %d\n", err);
        return err;
}

/* net/core/dev.c 에 의하여 등록을 수행 한다. */
struct pernet_operations __net_initdata loopback_net_ops = {
       .init = loopback_net_init,
};