Linux: получение сырых многоадресных пакетов Ethernet - PullRequest
0 голосов
/ 23 сентября 2019

Я должен отправлять и получать необработанные кадры Ethernet с пользовательским типом ethernet.Протокол IP не используется.Отправка и получение одноадресных пакетов работает, но у меня проблемы с многоадресными пакетами.Многоадресные пакеты не были получены.Я попытался использовать параметр сокета PACKET_ADD_MEMBERSHIP с моим многоадресным MAC для получения этих пакетов, но безуспешно.

Я не хочу использовать режим promisc, потому что мне нужны только одноадресные и многоадресные сообщения.

Вот мой код инициализации:

static uint8_t macAddress[]   = { 0x00, 0x00, 0xC4, 0x00, 0x00, 0x01 };
static uint8_t mcastAddress[] = { 0x00, 0x00, 0xC4, 0x00, 0xFF, 0xFF };
int sockID;
struct ifreq ifr;
struct sockaddr_ll sll;
struct packet_mreq mreq;
int ethDevNr;

// Create socket
sockID = socket(AF_PACKET, SOCK_RAW, htons(0xAABB));
if (sockID < 0)
    syslog(LOG_ERR, "Socket creation failed!\n");

// Change MAC address
memset(&ifr, 0, sizeof(ifr));
memcpy(ifr.ifr_hwaddr.sa_data, macAddress, 6);
strncpy(ifr.ifr_name, "eth0", IFNAMSIZ);
ifr.ifr_hwaddr.sa_family = ARPHRD_ETHER;
if (ioctl(sockID, SIOCSIFHWADDR, &ifr) < 0)
    syslog(LOG_ERR, "Setting MAC failed!\n");

// Get device index
memset(&ifr, 0, sizeof(ifr));
strncpy(ifr.ifr_name, "eth0", IFNAMSIZ);
if (ioctl(sockID, SIOCGIFINDEX, &ifr) < 0)
    syslog(LOG_ERR, "SIOCGIFINDEX failed!\n");
ethDevNr = ifr.ifr_ifindex;

// Add multicast mac
memset(&mreq, 0, sizeof(mreq));
mreq.mr_ifindex = ethDevNr;
mreq.mr_type = PACKET_MR_MULTICAST;
mreq.mr_alen = ETH_ALEN;
memcpy(mreq.mr_address, mcastAddress, ETH_ALEN);
if (setsockopt(sockID, SOL_PACKET, PACKET_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0)
    syslog(LOG_ERR, "Adding MAC failed!\n");

// Open socket
sll.sll_family = PF_PACKET;
sll.sll_ifindex = ethDevNr;
sll.sll_protocol = htons(0xAABB);
sll.sll_pkttype = PACKET_HOST | PACKET_MULTICAST | PACKET_BROADCAST;
bind(sockID, (struct sockaddr*)&sll, sizeof(sll));

// Wait for packets
while (1) {
    static uint8_t buf[1000];
    int recvBytes;

    recvBytes = recvfrom(sockID, buf, 1000, 0, NULL, NULL);
    syslog(LOG_NOTICE, "Received %4d bytes\n", recvBytes);
}

Как я могу получать пакеты только для обоих MAC-адресов (мой индивидуальный одноадресный и мой индивидуальный многоадресный) без использования режима promisc, который получает все пакеты?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...