ioctl()에서 어떻게 디바이스를 찾는지요?
글쓴이: study / 작성시간: 수, 2022/01/26 - 5:54오후
Madwifi 소스를 보고 있습니다.
Ioctl()을 처리하는 부분이 아래 첨부한 코드처럼 되어 있더군요.
do80211priv()에서 ioctl()을 호출하는데, 네트워크 장치인경우에는 ioctl()의 첫번째 인자로 소켓디스크립터를 전달하네요.
여기서 질문이 있는데요,
아래의 getsocket()을 보면 AF_INET소켓을 열어서 사용하는데, 그러면 이 소켓은 아직 특정 장치랑 연관되어 있는 건 아니지 않나요?
한 시스템에 네트워크 장치가 여러개 있는경우에는, ioctl()을 받은 커널에서는 어떻게 해당 장치를 찾나요?
질문이 잘 설명되었나 모르겠네요.
만일 질문 내용이 모호하면 다시 알려주세요.
조언 주시면 감사하겠습니다!
do80211priv(struct iwreq *iwr, const char *ifname, int op, void *data, size_t len) { #define N(a) (sizeof(a)/sizeof(a[0])) memset(iwr, 0, sizeof(struct iwreq)); strncpy(iwr->ifr_name, ifname, IFNAMSIZ); if (len < IFNAMSIZ) { /* * Argument data fits inline; put it there. */ memcpy(iwr->u.name, data, len); } else { /* * Argument data too big for inline transfer; setup a * parameter block instead; the kernel will transfer * the data for the driver. */ iwr->u.data.pointer = data; iwr->u.data.length = len; } if (ioctl(getsocket(), op, iwr) < 0) { static const char *opnames[] = { IOCTL_ERR(IEEE80211_IOCTL_SETPARAM), IOCTL_ERR(IEEE80211_IOCTL_GETPARAM), IOCTL_ERR(IEEE80211_IOCTL_SETMODE), IOCTL_ERR(IEEE80211_IOCTL_GETMODE), IOCTL_ERR(IEEE80211_IOCTL_SETWMMPARAMS), IOCTL_ERR(IEEE80211_IOCTL_GETWMMPARAMS), IOCTL_ERR(IEEE80211_IOCTL_SETCHANLIST), IOCTL_ERR(IEEE80211_IOCTL_GETCHANLIST), IOCTL_ERR(IEEE80211_IOCTL_CHANSWITCH), IOCTL_ERR(IEEE80211_IOCTL_GETCHANINFO), IOCTL_ERR(IEEE80211_IOCTL_SETOPTIE), IOCTL_ERR(IEEE80211_IOCTL_GETOPTIE), IOCTL_ERR(IEEE80211_IOCTL_SETMLME), IOCTL_ERR(IEEE80211_IOCTL_SETKEY), IOCTL_ERR(IEEE80211_IOCTL_DELKEY), IOCTL_ERR(IEEE80211_IOCTL_ADDMAC), IOCTL_ERR(IEEE80211_IOCTL_DELMAC), IOCTL_ERR(IEEE80211_IOCTL_WDSADDMAC), IOCTL_ERR(IEEE80211_IOCTL_WDSDELMAC), }; op -= SIOCIWFIRSTPRIV; if (0 <= op && op < N(opnames)) perror(opnames[op]); else perror("ioctl[unknown???]"); return -1; } return 0; #undef N }
static int getsocket(void) { static int s = -1; if (s < 0) { s = socket(AF_INET, SOCK_DGRAM, 0); if (s < 0) err(1, "socket(SOCK_DGRAM)"); } return s; }
Forums:
strncpy(iwr->ifr_name, ifname
댓글 달기