#1884: Raw socket code not working with madwifi drivers
-------------------------------------------------+--------------------------
      Reporter:  [EMAIL PROTECTED]  |       Owner:        
          Type:  defect                          |      Status:  closed
      Priority:  trivial                         |   Milestone:        
     Component:  madwifi: other                  |     Version:        
    Resolution:  invalid                         |    Keywords:        
Patch_attached:  0                               |  
-------------------------------------------------+--------------------------
Changes (by mrenzmann):

  * priority:  critical => trivial
  * status:  new => closed
  * resolution:  => invalid

Old description:

> I have a raw socket code which works fine with the gateworks 2348
> ethernet interfaces. But the code doesnt respond to the atheros radio
> working with madwifi drivers. The data at the receiving end does  not
> appear when it says send. Whereas I can receive
> Test case 1
> Machine1----- Gateworks 1eth0____Gateworks1 ath0        ---> Gateworks2
> ath0____Gateworks 2eth0----- Machine2
> 1)Ping 1 to 2 not working
> 2) ping Gateworks 1 ath0 to Machine 2 working  eg: ping -I ath0
> 192.168.1.10.
> 3)ping Gateworks 2 ath0 to Machine 1 working  eg: ping -I ath0
> 192.168.1.11.
>
> Test case 2
> Machine1----- Gateworks 1eth0_____Gateworks 1eth1----- Machine2
> change in code change all ath0 to eth1
> 1)Ping 1 to 2 not working
>
> Thanks in advance
> Sivakumar Mohan
>
> #include<stdio.h>
> #include<stdlib.h>
> #include<sys/socket.h>
> #include<features.h>
> #include<linux/if_packet.h>
> #include<linux/if_ether.h>
> #include<errno.h>
> #include<sys/ioctl.h>
> #include<net/if.h>
> #include<linux/ip.h>
> #include<string.h>
>
> struct sockaddr_ll packet_info;
> struct ifreq ifr;        // This guy helps ioctls to do conversions to
> interface name and index,both ways !
> int raw;
> struct packet_mreq pr;
>

>
> int CreateRawSocket(int protocol_to_sniff)
> {
>     int rawsock;
>
>     if((rawsock = socket(PF_PACKET, SOCK_RAW,
> htons(protocol_to_sniff)))== -1)
>     {
>         perror("Error creating raw socket: ");
>         exit(-1);
>     }
>     strncpy((char *)ifr.ifr_name, "eth0", IFNAMSIZ);
>     if((ioctl(rawsock, SIOCGIFINDEX, &ifr)) == -1)
>     {
>         printf("Error getting Interface index !\n");
>         exit(-1);
>     }
>

>
>     pr.mr_ifindex = ifr.ifr_ifindex;
>     pr.mr_type = PACKET_MR_PROMISC;
>
>     setsockopt(rawsock, SOL_PACKET, PACKET_ADD_MEMBERSHIP,
>            &pr, sizeof(struct packet_mreq));
>
>     strncpy((char *)ifr.ifr_name, "ath0", IFNAMSIZ);
>     if((ioctl(rawsock, SIOCGIFINDEX, &ifr)) == -1)
>     {
>         printf("Error getting Interface index !\n");
>         exit(-1);
>     }
>
>     pr.mr_ifindex = ifr.ifr_ifindex;
>     pr.mr_type = PACKET_MR_PROMISC;
>

>     setsockopt(rawsock, SOL_PACKET, PACKET_ADD_MEMBERSHIP,
>            &pr, sizeof(struct packet_mreq));
>     return rawsock;
> }
>
> int BindRawSocketToInterface(char *device, int rawsock, int protocol)
> {
>

>     /* First Get the Interface Index  */
>     strncpy((char *)ifr.ifr_name, device, IFNAMSIZ);
>     if((ioctl(rawsock, SIOCGIFINDEX, &ifr)) == -1)
>     {
>         printf("Error getting Interface index !\n");
>         exit(-1);
>     }
>

>
>     /* Bind our raw socket to this interface */
>
>     packet_info.sll_family = AF_PACKET;
>     packet_info.sll_ifindex = ifr.ifr_ifindex;
>     packet_info.sll_protocol = htons(protocol);
>

>     //if((bind(rawsock, (struct sockaddr *)&sll, sizeof(sll)))== -1)
>     //{
>     //    perror("Error binding raw socket to interface\n");
>     //    exit(-1);
>     //}
>
>     return 1;
>
> }
>
> void PrintPacketInHex(unsigned char *packet, int len)
> {
>     unsigned char *p = packet;
>
>     printf("\n\n---------Packet---Starts----\n\n");
>
>     while(len--)
>     {
>         printf("%.2x ", *p);
>         p++;
>     }
>
>     printf("\n\n--------Packet---Ends-----\n\n");
>
> }
>

> PrintInHex(char *mesg, unsigned char *p, int len)
> {
>     printf(mesg);
>
>     while(len--)
>     {
>         printf("%.2X ", *p);
>         p++;
>     }
>
> }
>

> ParseEthernetHeader(unsigned char *packet, int len)
> {
>     struct ethhdr *ethernet_header;
>
>     if(len > sizeof(struct ethhdr))
>     {
>         ethernet_header = (struct ethhdr *)packet;
>
>         /* First set of 6 bytes are Destination MAC */
>
>         PrintInHex("Destination MAC: ", ethernet_header->h_dest, 6);
>         printf("\n");
>
>         /* Second set of 6 bytes are Source MAC */
>
>         PrintInHex("Source MAC: ", ethernet_header->h_source, 6);
>         printf("\n");
>
>         /* Last 2 bytes in the Ethernet header are the protocol it
> carries */
>
>         PrintInHex("Protocol: ",(void *)&ethernet_header->h_proto, 2);
>         printf("\n");
>

>     }
>     else
>     {
>         printf("Packet size too small !\n");
>     }
> }
> char * Load_MyMAC( void )
> {
>     int i=0,j;
>     char c;
>     FILE* ptr;
>     static char MAC [20], MyMAC[20];
>     char * MCMPMyMAC = ( char *) malloc ( sizeof( char ) * 19 );
>     system("ifconfig |grep eth0  |cut -c39-55 >MACADDR.txt");
>     ptr=fopen("MACADDR.txt","r");
>     if((fgets(MAC,18, ptr)) == (void *)-1){
>         printf( " That was an error ");
>         exit(0);
>     }
>     //printf(" \n MAC: %s \n",MAC);
>     for( i = 1, j = 0; i < 18 ; i++ )
>     {
>         if(( i % 3 ) != 0 ){
>             if( MAC[i-1] < 0x40   ){
>
>                 MyMAC[j++] = MAC[i-1] - 0x30;
>             }
>             else{
>                 MyMAC[j++] = MAC[i-1] - 0x37;
>             }
>         }
>     }
>     for( i = 0, j = 0; i < 12 ; i+=2 )
>     {
>
>             MCMPMyMAC[j++] =  (MyMAC[i] << 4) | MyMAC[ i+ 1 ];
>     }
>     printf(" \n My MAC: %s \n",MAC);
>  return ( MCMPMyMAC );
> }
> int sendthepacket(char *device, int rawsock, int protocol, char
> *MCMPFrame_TX,int  MCMPFrameSize_TX)
> {
>     int send_result;
>     struct sockaddr_ll sll;
>     struct ifreq ifr;
>
>     bzero(&sll, sizeof(sll));
>     bzero(&ifr, sizeof(ifr));
>
>     /* First Get the Interface Index  */
>

>     strncpy((char *)ifr.ifr_name, device, IFNAMSIZ);
>     if((ioctl(rawsock, SIOCGIFINDEX, &ifr)) == -1)
>     {
>         printf("Error getting Interface index !\n");
>         exit(-1);
>     }
>
>     /* Bind our raw socket to this interface */
>
>     sll.sll_family = AF_PACKET;
>     sll.sll_ifindex = ifr.ifr_ifindex;
>     sll.sll_protocol = htons(protocol);
>     printf("\n The sending device is: %s\n", device );
>
>     send_result = sendto(raw, MCMPFrame_TX,MCMPFrameSize_TX, 0,(struct
> sockaddr*)&sll, sizeof(sll) );//len+14 //ETH_DATA_LEN1+14
>
>     if ( (send_result == -1) || ( send_result != MCMPFrameSize_TX) ){
>         perror( " Sending: " );
>         printf("\n MCMP TRANSMIT ERROR 2 \n");
>
>     }
>     else
>         printf(" \npacket send \n");
>
> }
>
> ParseIpHeader(unsigned char *packet, int len)
> {
>     struct ethhdr *ethernet_header;
>     struct iphdr *ip_header;
>     char *    destip ;
>     /* First Check if the packet contains an IP header using
>        the Ethernet header                                */
>
>     ethernet_header = (struct ethhdr *)packet;
>     //bzero(ethernet_header, sizeof(struct ethhdr));
>     printf("Header: %x\n", ntohs(ethernet_header->h_proto));
>

>

>             //bzero(ip_header, sizeof(struct iphdr));
>             /* print the Source and Destination IP address */
>
>             if(ntohs(ethernet_header->h_proto) == ETH_P_IP){
>                 if(len >= (sizeof(struct ethhdr) + sizeof(struct
> iphdr))){
>
>                 ip_header = (struct iphdr*)(packet + sizeof(struct
> ethhdr));
>                 printf("Source IP address: %s\n",
> inet_ntoa(ip_header->saddr));
>                 printf("TTL = %d\n", ip_header->ttl);
>                 destip = (char *) inet_ntoa(ip_header->daddr);
>                 printf("Dest IP address: %s\n",destip  );
>                 }
>
>                 else{    /* Not an IP packet */
>                     printf("IP packet too small");
>                 }
>             }
>
>                 //"eth0"
>

>
> }
>

> main(int argc, char **argv)
> {
>
>     unsigned char packet_buffer[2048];
>     int len;
>     int packets_to_sniff;
>     char * device;
>     int packet_info_size = sizeof(packet_info);
>
>     bzero(&packet_info, sizeof(packet_info));
>     bzero(&ifr, sizeof(ifr));
>

>     /* create the raw socket */
>
>     raw = CreateRawSocket(ETH_P_ALL);
>
>     /* Bind socket to interface */
>

>
>     /* Get number of packets to sniff from user */
>
>     packets_to_sniff = atoi(argv[2]);
>
>     /* Start Sniffing and print Hex of every packet */
>
>     while(packets_to_sniff--)
>     {
>         packet_info_size = sizeof(packet_info);
>         if((len = recvfrom(raw, packet_buffer, 2048, 0, (struct
> sockaddr*)&packet_info, &packet_info_size)) == -1)
>         {
>             perror("Recv from returned -1: ");
>             exit(-1);
>         }
>         else
>         {
>
>             ifr.ifr_ifindex = packet_info.sll_ifindex;
>         if((ioctl(raw, SIOCGIFNAME, &ifr)) == -1)
>         {
>             perror(" Ioctl ");
>             exit(-1);
>         }
>
>         printf("\n This interface is: %s \n",ifr.ifr_name);    // And
> hereis your interface name
>
>             /* Packet has been received successfully !! */
>             //printf("\n Test \n");
>             PrintPacketInHex(packet_buffer, len);
>
>             /* Parse Ethernet Header */
>
>             ParseEthernetHeader(packet_buffer, len);
>             ParseIpHeader(packet_buffer, len );
>         if( ( strcmp(ifr.ifr_name,"eth0") == 0 ) ){
>             /* Parse IP Header */
>             device = "ath0";
>         }
>         else if( ( strcmp(ifr.ifr_name,"ath0") == 0 ) ){
>
>             device = "eth0";
>
>             }
>
>         sendthepacket(device,raw, ETH_P_ALL,  packet_buffer,len);
>         }
>     }
>

>     return 0;
> }

New description:

 I have a raw socket code which works fine with the gateworks 2348 ethernet
 interfaces. But the code doesnt respond to the atheros radio working with
 madwifi drivers. The data at the receiving end does  not appear when it
 says send. Whereas I can receive

 Test case 1
 {{{
 Machine1----- Gateworks 1eth0____Gateworks1 ath0        ---> Gateworks2
 ath0____Gateworks 2eth0----- Machine2
  1. Ping 1 to 2 not working
  2. ping Gateworks 1 ath0 to Machine 2 working  eg: ping -I ath0
 192.168.1.10.
  3. ping Gateworks 2 ath0 to Machine 1 working  eg: ping -I ath0
 192.168.1.11.
 }}}

 Test case 2
 {{{
 Machine1----- Gateworks 1eth0_____Gateworks 1eth1----- Machine2
 change in code change all ath0 to eth1
  1. Ping 1 to 2 not working
 }}}

 Thanks in advance
 Sivakumar Mohan

Comment:

 Please, where is the point in asking on madwifi-devel and immediately
 reporting it here as a bug? In addition, all relevant information (MadWifi
 version you use, details about the actual configuration of your WLAN
 interface(s), and so on) is missing.

 I close this ticket as invalid for now. If the outcome is that your issue
 is caused by a bug in the driver, feel free to reopen this ticket,
 providing relevant details that help to identify the cause of the bug.

-- 
Ticket URL: <https://madwifi.org/ticket/1884#comment:1>
madwifi.org <http://madwifi.org/>
Multiband Atheros Driver for Wireless Fidelity
-------------------------------------------------------------------------
This SF.net email is sponsored by the 2008 JavaOne(SM) Conference 
Don't miss this year's exciting event. There's still time to save $100. 
Use priority code J8TL2D2. 
http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone
_______________________________________________
Madwifi-tickets mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/madwifi-tickets

Reply via email to