user2429124
user2429124

Reputation: 11

linux raw socket - receive custom packets

I'm trying to receive IEEE1722 packet via a raw Ethernet socket on ubuntu linux. The socket itself works fine, I receive any single packet (ARP,TCP,SSDP,....) flowing around on the network, with exception of the IEEE1722 packets. They are somehow ignored on my read calls and don't understand why - maybe someone of you has an idea. The packets are 802.1 frames with VLAN tag and EtherType 0x22f0 Neither switching from ETH_P_ALL to ETH_P_8021Q or to htons(0x22f0) does help. If I change it I don't receive anything anymore.

That's my code - someone with an idea what's wrong?

Creating the socket:

m_socket = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
if (m_socket < 0) 
{ 
    LOGERROR("EthRawSock", "Start(): SOCK_RAW creation failed! error: %d",errno);
    m_socket = NULL;
    return ErrorFileOpen;
}

struct ifreq ifr;
memset(&ifr, 0, sizeof(ifr));
strcpy(ifr.ifr_name, m_sznic.ptrz());
if (ioctl(m_socket, SIOCGIFINDEX, &ifr) < 0) {
    LOGERROR("EthRawSock", "Start(): ioctl() SIOCGIFINDEX failed! error: %d (NIC: %s)",errno,ifr.ifr_name);
    return ErrorFileOpen;
}

struct sockaddr_ll sll;
memset(&sll, 0, sizeof(sll));
sll.sll_family = AF_PACKET;
sll.sll_ifindex = ifr.ifr_ifindex;
sll.sll_protocol = htons(0x22f0);

if (bind((int)m_socket, (struct sockaddr *) &sll, sizeof(sll)) < 0) {
    LOGERROR("EthRawSock", "Start(): bind() failed! error: %d",errno);
    return ErrorFileOpen;
}

if (ioctl(m_socket, SIOCGIFHWADDR, &ifr) < 0)
{
    LOGERROR("EthRawSock", "Start(): SIOCGIFHWADDR failed! error: %d",errno);
    return ErrorFileOpen;
}

struct packet_mreq mr;
memset(&mr, 0, sizeof(mr));
mr.mr_ifindex = sll.sll_ifindex;
mr.mr_type = PACKET_MR_PROMISC;

if (setsockopt(m_socket, SOL_PACKET, PACKET_ADD_MEMBERSHIP, &mr, sizeof(mr)) < 0) {
    LOGERROR("EthRawSock", "Start(): setsockopt() PACKET_ADD_MEMBERSHIP failed! error: %d",errno);
    return ErrorFileOpen;
}

Reading via:

nsize = read(m_socket,m_recv_buffer,ETH_FRAME_LEN);

Upvotes: 0

Views: 2320

Answers (2)

P.Fraviga
P.Fraviga

Reputation: 11

My two cents contribution: AVTP streams run in a tagged frame, this means that you won't find the ethertype 0x22f0 at the expected offset (12 octets from start of packet, just after destination and source MAC addresses) - it will be 4 octets after that. The ethertype for VLAN tagged frames is normally 0x8100.

Upvotes: 1

Chris
Chris

Reputation: 1440

Have you tried wireshark - or tshark - on this interface? Wireshark should be able to get those packets fine - nots sure if you need to enable it though. If I'm not mistaken all network ports must support 802.1AS. IEEE 1722 requires hardware support and I think that it would be impossible to help you out without knowing what's how this was set up.

Upvotes: 0

Related Questions