Я пытаюсь подделать пакет запроса на членство IGMPv2 и отправить его через сокет RAW.
RFC 3376 заявляет:
Сообщения IGMP инкапсулированы в дейтаграммы IPv4,с номером протокола IP, равным 2. Каждое IGMP-сообщение, описанное в этом документе, отправляется с IP-адресом времени жизни 1, приоритетом IP-адреса межсетевого управления (например, тип услуги 0xc0) и содержит опцию предупреждения маршрутизатора IP [RFC-2113] в своем IP-заголовке
Поэтому необходимо установить флаг IP_ROUTER_ALERT.
Я пытаюсь подделать строго необходимый пакет (например, только IGMP-заголовок иполезной нагрузки), поэтому я использую setsockopt для редактирования параметров IP.
некоторые полезные переменные:
#define C_IP_MULTICAST_TTL 1
#define C_IP_ROUTER_ALERT 1
int sockfd = 0;
int ecsockopt = 0;
int bytes_num = 0;
int ip_multicast_ttl = C_IP_MULTICAST_TTL;
int ip_router_alert = C_IP_ROUTER_ALERT;
Вот как я открываю сокет RAW:
sock_domain = AF_INET;
sock_type = SOCK_RAW;
sock_proto = IPPROTO_IGMP;
if ((ecsockopt = socket(sock_domain,sock_type,sock_proto)) < 0) {
printf("Error %d: Can't open socket.\n", errno);
return 1;
} else {
printf("** Socket opened.\n");
}
sockfd = ecsockopt;
Затем я устанавливаю опцию TTL и Router Alert:
// Set the sent packets TTL
if((ecsockopt = setsockopt(sockfd, IPPROTO_IP, IP_MULTICAST_TTL, &ip_multicast_ttl, sizeof(ip_multicast_ttl))) < 0) {
printf("Error %d: Can't set TTL.\n", ecsockopt);
return 1;
} else {
printf("** TTL set.\n");
}
// Set the Router Alert
if((ecsockopt = setsockopt(sockfd, IPPROTO_IP, IP_ROUTER_ALERT, &ip_router_alert, sizeof(ip_router_alert))) < 0) {
printf("Error %d: Can't set Router Alert.\n", ecsockopt);
return 1;
} else {
printf("** Router Alert set.\n");
}
setsockopt IP_ROUTER_ALERT возвращает 0. После подделки пакета я отправляю его с sendto следующим образом:
// Send the packet
if((bytes_num = sendto(sockfd, packet, packet_size, 0, (struct sockaddr*) &mgroup1_addr, sizeof(mgroup1_addr))) < 0) {
printf("Error %d: Can't send Membership report message.\n", bytes_num);
return 1;
} else {
printf("** Membership report message sent. (bytes=%d)\n",bytes_num);
}
Пакет отправлен, но опция IP_ROUTER_ALERTион (проверено с wireshark) отсутствует.Я делаю что-то неправильно?Существуют ли другие методы для установки параметра IP_ROUTER_ALERT?
Заранее спасибо.