네트워크 장치 등록 및 초기 화
장치 등록 시
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, 그 중 일부 알림 정 보 는 다음 과 같 습 니 다.
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
장치 종료
링크 상태 가 변 경 될 수 있 는 상황:
1. 케이블 이 NIC 에 삽입 되 거나 NIC 에서 뽑 힌 다.
2. 케이블 의 다른 한 끝 에 있 는 설비 의 전원 이 꺼 지 거나 꺼 졌 다.이런 설 비 는 HUB, 브리지, 공유 기 및 PC NIC 등 이 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.