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
strncpy(iwr->ifr_name, ifname, IFNAMSIZ); if (len < IFNAMSIZ) { /* * Argument data fits inline; put it there. */ memcpy(iwr->u.name, data, len);댓글 달기