void check_eth_addr(const struct ether_addr& a, const struct ether_addr& b, CppUnit::SourceLine sourceLine){ for ( int i = 0; i < ETH_ALEN; i++ ){ if ( a.ether_addr_octet[i] != b.ether_addr_octet[i] ){ char expected[24], actual[24]; CppUnit::Asserter::failNotEqual(hexdump_address_r(&a, expected), hexdump_address_r(&b, actual), sourceLine); } } }
long stream_ethernet_add(struct stream* stt, const struct ether_addr* addr){ struct stream_ethernet* st= (struct stream_ethernet*)stt; if ( st->base.num_addresses == MAX_ADDRESS ){ return EBUSY; } /* parse hwaddr from user */ if ( (addr->ether_addr_octet[0] & 0x01) == 0 ){ return ERROR_INVALID_MULTICAST; } /* store parsed address */ memcpy(&st->address[st->base.num_addresses], addr, ETH_ALEN); /* setup multicast address */ struct packet_mreq mcast = {0,}; mcast.mr_ifindex = st->if_index; mcast.mr_type = PACKET_MR_MULTICAST; mcast.mr_alen = ETH_ALEN; memcpy(mcast.mr_address, &st->address[st->base.num_addresses], ETH_ALEN); #ifdef DEBUG char name[IF_NAMESIZE+1]; char eth_src[IFHWADDRLEN*3]; char eth_dst[IFHWADDRLEN*3]; fprintf(stderr, "Adding membership to ethernet multicast group:\n" "\tEthernet.type=%04X\n" "\tEthernet.src=%s\n" "\tEthernet.dst=%s\n" "\tInterface=%s (%d)\n", ETHERTYPE_MP, hexdump_address_r(&st->sll.sll_addr, eth_src), hexdump_address_r(&mcast.mr_address, eth_dst), if_indextoname(st->if_index, name), mcast.mr_ifindex); #endif /* setup ethernet multicast */ if ( setsockopt(st->socket, SOL_PACKET, PACKET_ADD_MEMBERSHIP, (void*)&mcast, sizeof(mcast)) == -1 ){ perror("Adding multicast address failed"); return errno; } st->base.num_addresses++; return 0; }
const char* hexdump_address(const struct ether_addr* address){ static char buf[IFHWADDRLEN*3]; return hexdump_address_r(address, buf); }