LinuxQuestions.org

LinuxQuestions.org (/questions/)
-   Programming (http://www.linuxquestions.org/questions/programming-9/)
-   -   sendto function does not use MAC address provided in struct sockaddr_ll when sending (http://www.linuxquestions.org/questions/programming-9/sendto-function-does-not-use-mac-address-provided-in-struct-sockaddr_ll-when-sending-4175459653/)

sreeyeshns 04-26-2013 06:55 AM

sendto function does not use MAC address provided in struct sockaddr_ll when sending
 
I am trying to send an OAM ethernet frame using raw socket. I was successful in doing so.

The send function I have written is:

Code:

int send_frame(sock_info *info,char *buf,int length)
        {
              struct sockaddr_ll dest_addr;
              memset(&dest_addr,0,sizeof(struct sockaddr_ll));
              dest_addr.sll_family = PF_PACKET;
              dest_addr.sll_protocol = htons(8902);
              dest_addr.sll_ifindex = info->if_index;
              dest_addr.sll_halen = ETH_MAC_ADDR_LEN;
              dest_addr.sll_pkttype = PACKET_OTHERHOST;
              dest_addr.sll_hatype  = ARPHRD_ETHER;
              memset(dest_addr.sll_addr,0,8);
       
              dest_addr.sll_addr[0] = 0x00;
              dest_addr.sll_addr[1] = 0xE0;
              dest_addr.sll_addr[2] = 0x0C;
              dest_addr.sll_addr[3] = 0x00;
              dest_addr.sll_addr[4] = 0x95;
              dest_addr.sll_addr[5] = 0x02;

              return sendto(info->sock_fd, buf, length, 0, (struct sockaddr*) &dest_addr, sizeof(struct sockaddr_ll));
        }

I was unable to capture the packet using wireshark. After tryiing too many things, I found out that buffer used to send should have all ethernet frame fields (starting from destination address). When I added the destination and source address and other ethernet fields into the buffer, I was able to capture the packet using wireshark. So the send function doesn't use the MAC address stored in `dest_addr.sll_addr`.

My question is, Then what's the need of `sll_addr` field in the `struct sockaddr_ll`? Manuals say that it is the destination MAC address.

smallpond 04-29-2013 04:45 PM

Normally you open an AF_INET socket and the system builds the header information. If you open a raw socket, you bypass the normal packet mechanism and build your own.


All times are GMT -5. The time now is 07:24 PM.