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);
    }
  }
}
Beispiel #2
0
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;
}
Beispiel #3
0
const char* hexdump_address(const struct ether_addr* address){
  static char buf[IFHWADDRLEN*3];
  return hexdump_address_r(address, buf);
}