네트워크 장치 등록 및 초기 화

11114 단어
NIC 사용 전, 관련 netdevice 데이터 구 조 는 먼저 초기 화 되 어야 합 니 다. 커 널 네트워크 장치 데이터 베이스 에 추가 하고 설정 하 며 켜 야 합 니 다.등록 / 제명 및 오픈 / 닫 기 를 혼동 하지 않 는 것 이 중요 합 니 다. 이것 은 두 가지 서로 다른 개념 입 니 다.
  • 장치 드라이버 모듈 을 불 러 오 는 동작 을 제외 하면 등록 과 제 명 은 사용자 외 에 독립 되 고 커 널 에 의 해 작 동 됩 니 다.등 록 된 설비 만 으로 는 작 동 할 수 없다.
  • 장 치 를 켜 고 끄 는 데 모두 사용자 가 참여 해 야 한다.장치 가 커 널 에 등록 되면 사용 자 는 사용자 명령 을 통 해 이 장 치 를 보고 설정 하고 열 수 있 습 니 다.

  • 장치 등록 시
    NIC 장치 드라이버 불 러 오기
    NIC 장치 드라이버 가 커 널 에 설치 되 어 있 으 면 안내 기간 에 초기 화 합 니 다.그렇지 않 으 면 모듈 로 불 러 오 면 실행 기간 에 초기 화 됩 니 다.그렇지 않 으 면 모듈 로 불 러 오 면 실행 기간 에 초기 화 됩 니 다.초기 화가 발생 할 때마다 이 드라이버 가 제어 하 는 모든 NIC 가 등 록 됩 니 다.
    핫 플러그 네트워크 장치 삽입
    사용자 가 핫 플러그 NIC 장 치 를 삽입 할 때 커 널 은 드라이버 에 알 리 고 드라이버 는 이 장 치 를 등록 하고 있 습 니 다.
    장치 이름 제거 시
    NIC 장치 드라이버 마 운 트 해제
    이것 은 모듈 로 불 러 오 는 드라이버 만 을 위 한 것 으로 내부 에 내장 되 어 있 는 드라이버 에 적합 하지 않 습 니 다.관리자 가 NIC 장치 드라이버 를 마 운 트 해제 할 때 관련 된 모든 NIC 는 제거 해 야 합 니 다.
    핫 플러그 네트워크 장치 삭제
    사용자 가 시스템 (실행 중인 커 널 지원 핫 플러그 장치) 에서 핫 플러그 NIC 를 삭제 하면 네트워크 장치 가 제 거 됩 니 다.
    장치 등록 상태 알림
    커 널 구성 요소 와 사용자 공간 응용 프로그램 은 네트워크 장치 등록, 제명, 종료 또는 열 리 는 일이 언제 발생 하 는 지 알 고 싶 어 할 수 있 습 니 다.이러한 이벤트 의 통 지 는 두 가지 채널 을 통 해 전 송 됩 니 다.
    netdev_chain, 커 널 구성 요 소 는 이 알림 체인 을 등록 할 수 있 습 니 다.장치 의 등록 과 제 명 은 각 단계 에서 netdev 를 통 해 진행 되 고 있 습 니 다.체인 알림 체인 보고.이 체인 은 net / core / dev. c 에 정의 되 어 있 으 며, 이러한 이벤트 에 관심 이 있 는 커 널 구성 요 소 는 register 를 통 해 정의 할 수 있 습 니 다.netdevice_notifier 와 unregisternetdevice_notifier 는 각각 이 체인 에 등록 하거나 이름 을 제외 합 니 다.
    netdev_chain 보고서 의 이벤트:
    NETDEV_UP,NETDEV_GOING_DOWN,NETDEV_DOWN, NETDEV 보 내기UP 는 장치 가 켜 졌 음 을 보고 하고 이 사건 은 dev오픈 생 성.장치 가 꺼 지 려 고 할 때 NETDEV 를 보 냅 니 다.GOING_DOWN. 장치 가 꺼 졌 을 때 NETDEV 를 보 냅 니 다.DOWN. 이 사건 들 은 모두 devclose () 에서 생 긴 것.
    NETDEV_REGISTER 장치 가 등록 되 었 습 니 다. 이 이 벤트 는 register 입 니 다.netdevice 에서 생 긴.
    NETDEV_UNREGISTER, 장치 이름 이 제거 되 었 습 니 다. 이 사건 은 unregister 입 니 다.netdevice 에서 생 긴.
    NETDEV_CHANGEADDR 장치 의 하드웨어 주소 가 변경 되 었 습 니 다.
    NETDEV_CHANGENAME 장치 의 이름 이 변경 되 었 습 니 다.
    NETDEV_CHANGE 장치 의 상태 나 설정 이 변경 되 었 습 니 다. 이 이 벤트 는 상기 상황 에 포함 되 지 않 은 다른 상황 에서 사 용 됩 니 다.
    주의, 체인 에 등록 시, registernetdevice_notifier 도 (새 등록 자만) 현재 시스템 에 등 록 된 장치 의 과거 NETDEV 를 다시 재생 합 니 다.REGISTER 와 NETDEVUP 알림 메시지.이렇게 하면 새 등록 자 에 게 이미 등 록 된 장치 에 대한 선명 한 이미 지 를 줄 수 있다.커 널 등록 이 체인 의 서브 시스템: 경로, 이 알림 정 보 를 사용 하여 이 장치 와 연 결 된 모든 경로 항목 을 추가 하거나 삭제 합 니 다.프로 토 콜 코드 는 로 컬 장치 의 MAC 주 소 를 변경 할 때 ARP 표 도 이에 따라 업데이트 해 야 합 니 다.RTnetlink。
    Netlink 의 RTMGRPLINK 멀티캐스트 그룹, 사용자 공간 프로그램 은 netlink 의 RTMGRP 를 등록 할 수 있 습 니 다.LINK 멀티캐스트 그룹, 장치 상태 나 설정 이 변경 되면 rtmsgifinfo 는 알림 정 보 를 링크 멀티캐스트 그룹 RTMGRP 에 전송 합 니 다.LINK, 그 중 일부 알림 정 보 는 다음 과 같 습 니 다.
  • netdevchain 알림 체인 이 알림 메 시 지 를 받 았 을 때 RTnetlink 는 이전 절 에 언급 한 netdev 를 등록 합 니 다.chain, 그리고 받 은 알림 정 보 를 다시 놓 습 니 다.
  • 닫 힌 장치 가 켜 졌 을 때 또는 반대 되 는 과정 에 있 습 니 다.
  • netdevice - > flags 의 표지 가 바 뀌 었 을 때.

  • netplugd 는 데 몬 입 니 다. 이 알림 정 보 를 듣 고 사용자 설정 파일 에 따라 반응 합 니 다.
    함수 netdevwait_allrefs
    netdev_wait_allrefs 는 하나의 순환 으로 구성 되 어 있 으 며, dev - > refcnt 가 0 시 까지 만들어 져 야 끝 납 니 다.이 함 수 는 1 초 에 하나의 NETDEV 를 보 냅 니 다.UNREGISTER 알림 메 시 지 는 10 초 만 에 콘 솔 에 경고 메 시 지 를 출력 합 니 다.남 은 시간 은 모두 휴면 하고 있다.이 함 수 는 입력 net 까지device 구조의 모든 인용 이 풀 릴 때 까지 입 니 다.두 가지 흔히 볼 수 있 는 상황 은 하나 이상 의 통지 정 보 를 전송 해 야 한다.
    bug, 예 를 들 어 세그먼트 코드 가 net 를 가지 고 있 습 니 다.device 구조의 인용, 하지만 netdev 에 없 기 때문에chain 알림 체인 등록 또는 알림 정 보 를 정확하게 처리 하지 않 아서 풀 수 없습니다.
    미결 타이머, 예 를 들 어 타이머 가 만 료 되 었 을 때 실행 할 함수 가 방문 해 야 할 데이터 에 net 가 포함 되 어 있다 고 가정 합 니 다.device 구조의 참조.이 경우 타이머 가 만 료 될 때 까지 기 다 려 야 하 며, 처리 함수 가 인용 을 방출 할 수 있 습 니 다.
       1:  /*
       2:   * netdev_wait_allrefs - wait until all references are gone.
       3:   *
       4:   * This is called when unregistering network devices.
       5:   *
       6:   * Any protocol or device that holds a reference should register
       7:   * for netdevice notification, and cleanup and put back the
       8:   * reference if they receive an UNREGISTER event.
       9:   * We can get stuck here if buggy protocols don't correctly
      10:   * call dev_put.
      11:   */
      12:  static void netdev_wait_allrefs(struct net_device *dev)
      13:  {
      14:      unsigned long rebroadcast_time, warning_time;
      15:      int refcnt;
      16:   
      17:      linkwatch_forget_dev(dev);
      18:   
      19:      rebroadcast_time = warning_time = jiffies;
      20:      refcnt = netdev_refcnt_read(dev);
      21:   
      22:      while (refcnt != 0) {
      23:          if (time_after(jiffies, rebroadcast_time + 1 * HZ)) {
      24:              rtnl_lock();
      25:   
      26:              /* Rebroadcast unregister notification */
      27:              call_netdevice_notifiers(NETDEV_UNREGISTER, dev);
      28:              /* don't resend NETDEV_UNREGISTER_BATCH, _BATCH users
      29:               * should have already handle it the first time */
      30:   
      31:              if (test_bit(__LINK_STATE_LINKWATCH_PENDING,
      32:                       &dev->state)) {
      33:                  /* We must not have linkwatch events
      34:                   * pending on unregister. If this
      35:                   * happens, we simply run the queue
      36:                   * unscheduled, resulting in a noop
      37:                   * for this device.
      38:                   */
      39:                  linkwatch_run_queue();
      40:              }
      41:   
      42:              __rtnl_unlock();
      43:   
      44:              rebroadcast_time = jiffies;
      45:          }
      46:   
      47:          msleep(250);
      48:   
      49:          refcnt = netdev_refcnt_read(dev);
      50:   
      51:          if (time_after(jiffies, warning_time + 10 * HZ)) {
      52:              printk(KERN_EMERG "unregister_netdevice: "
      53:                     "waiting for %s to become free. Usage "
      54:                     "count = %d
    "
    ,
      55:                     dev->name, refcnt);
      56:              warning_time = jiffies;
      57:          }
      58:      }
      59:  }

     
    네트워크 장 치 를 켜 고 닫 습 니 다.
    장 치 는 일단 등록 하면 사용 할 수 있 지만 사용자 가 명확 하 게 켜 지지 않 으 면 데이터 흐름 을 전송 하고 받 을 수 없습니다.시작 장치 함 수 는 devopen
  • 정의 가 있 으 면 dev - > open 을 호출 합 니 다.모든 장치 드라이버 가 이 함 수 를 초기 화 하 는 것 은 아 닙 니 다
  • dev - > state 의 설정LINK_STATE_START 표 지 는 장치 표 지 를 켜 고 실행 하 는 중 입 니 다.
  • dev - > flags 의 IFF 설정UP 표 지 는 장치 표 지 를 열 어 줍 니 다.
  • dev 호출activate 는 데이터 제어 에 사용 되 는 출구 대기 열 규칙 을 초기 화하 고 문 지 키 는 개 타 이 머 를 시작 합 니 다.데이터 제어 에 사용자 설정 이 없 으 면 기본 FIFO
  • 를 지정 합 니 다.
  • NETDEV 전송UP 알림 정보 netdevchain 알림 체인, 관심 있 는 커 널 구성 요 소 를 알려 줍 니 다. 이 장 치 는 현재 열 렸 습 니 다.

  • 장치 종료
  • NETDEV 전송GOING_DOWN 알림 메 시 지 는 netdevchain 알림 체인, 관심 있 는 커 널 구성 요소 가 곧 닫 힐 것 임 을 알 립 니 다
  • dev 호출deactivate 는 출구 대기 열 규칙 을 닫 아서 이 장 치 를 더 이상 전송 할 수 없 게 합 니 다. 그리고 필요 하지 않 기 때문에 문 지 키 는 개 타이머
  • 를 중단 합 니 다.
  • dev - > state 의 제거LINK_STATE_START 표지, 장치 표 지 를 닫 기
  • 장치 의 입구 패 키 지 를 읽 기 위해 폴 링 동작 이 배 치 될 경우 이 동작 이 완 료 될 때 까지 기 다 려 야 합 니 다.왜냐하면LINK_STATE_START 표 지 는 제거 되 었 습 니 다. 이 장치 에 서 는 더 이상 받 은 폴 링 동작 을 조정 할 수 없습니다. 그러나 이 표지 가 제거 되 기 전에 폴 링 동작 이 해결 되 지 않 았 을 수도 있 습 니 다.
  • 정의 가 있 으 면 dev - > stop 을 호출 합 니 다.
  • dev - > flags 의 IFF 제거UP 표지, 장치 표 지 를 닫 기
  • NETDEV 전송DOWN 알림 체인
  • 링크 상태 변경 수사
    링크 상태 가 변 경 될 수 있 는 상황:
    1. 케이블 이 NIC 에 삽입 되 거나 NIC 에서 뽑 힌 다.
    2. 케이블 의 다른 한 끝 에 있 는 설비 의 전원 이 꺼 지 거나 꺼 졌 다.이런 설 비 는 HUB, 브리지, 공유 기 및 PC NIC 등 이 있다.

    좋은 웹페이지 즐겨찾기