これはどうやって正しく行うのですか?Linux上でネットワークインタフェースをプロミスキャスモードに正しく設定する方法
私はsocketを作成し、ioctl( "howto check a network devices status in C?"などで説明されています)を使用してIFF_PROMISCフラグを設定する方法を知っていますが、これは少なくとも理論上は欠陥があります。
1)あなたはioctlの 2を介して旗を読む)あなたはフラグ 3を更新)他の誰かに変更フラグ 4)あなたはioctlの
を介して更新フラグを設定するより良い方法や、私は単純にはあまり気にしないはありますか?
後、私は1つが、このように(もレースを持たない)のsetsockoptを経由してPACKET_MR_PROMISCにインターフェイスを追加する必要があることが見つかりました:それは必要がありますが、私ならば
void set_promisc(const char *ifname, bool enable)
{
struct packet_mreq mreq = {0};
int sfd;
int action;
if ((sfd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) == -1) {
perror("unable to open socket");
return;
}
mreq.mr_ifindex = if_nametoindex(ifname);
mreq.mr_type = PACKET_MR_PROMISC;
if (mreq.mr_ifindex == 0) {
perror("unable to get interface index");
return;
}
if (enable)
action = PACKET_ADD_MEMBERSHIP;
else
action = PACKET_DROP_MEMBERSHIP;
if (setsockopt(sfd, SOL_PACKET, action, &mreq, sizeof(mreq)) != 0) {
perror("unable to enter promiscouous mode");
return;
}
close(sfd);
}
は、残念ながら、これは、インターフェイス上全く効果がありませんthe docを正しく修理してください。可能であればbroken since 2001 (tm)? pcapソースのコメントもこれについて文句を言う。
**は、なぜあなたは 'ioctl'が間違っていると思います**?そして、「もっと簡単な方法」は何でしょうか? – Olaf
読み取り/変更/書き込みフラグ操作はアトミックでなければなりません。 – dbrank0