RAW Packets are getting dropped at linux bridge connected to VM tap interface

asked 2015-11-20 07:47:15 -0500

vasubabu gravatar image

updated 2015-11-20 07:49:46 -0500

Hello,

I am trying to send raw udp packet from one instance to another instance in OpenStack. Even though TCP/UDP communication enabled in security groups, still packets are getting dropped at the linux bridge connected to VM tap interface

I am able to send and recieve the udp packets using udp_server & udp_client socket communication which inturn uses AF_INET as socket domain, but in my case i am using AF_PACKET as socket domain.

I am successfully able to send packets between two VMs managed by VMware vsphere using the same program. Even in the case where OpenDaylight integrated with OpenStack, I am able send packets because there won't be any linux bridge present in environment.

This issue is occurring only with VMs running in pure OpenStack setup.

Below is the program that i am running.

define MY_DEST_MAC0 0xFA

define MY_DEST_MAC1 0x16

define MY_DEST_MAC2 0x3E

define MY_DEST_MAC3 0xE0

define MY_DEST_MAC4 0x40

define MY_DEST_MAC5 0x94

define DEFAULT_IF "eth0"

define BUF_SIZ 1024

unsigned short csum(unsigned short *buf, int nwords) { unsigned long sum; for(sum=0; nwords>0; nwords--) sum += *buf++; sum = (sum >> 16) + (sum &0xffff); sum += (sum >> 16); return (unsigned short)(~sum); }

int main(int argc, char *argv[]) { int sockfd; struct ifreq if_idx; struct ifreq if_mac; int tx_len = 0; char sendbuf[BUF_SIZ]; struct ether_header *eh = (struct ether_header *) sendbuf; //struct iphdr *iph = (struct iphdr *) (sendbuf + sizeof(struct ether_header)); struct sockaddr_ll socket_address; char ifName[IFNAMSIZ];

    /* Get interface name */
    if (argc > 1)
            strcpy(ifName, argv[1]);
    else
            strcpy(ifName, DEFAULT_IF);

    /* Open RAW socket to send on */
    if ((sockfd = socket(AF_PACKET, SOCK_RAW, IPPROTO_RAW)) == -1) {
        perror("socket");
    }
    /* Get the index of the interface to send on */
    memset(&if_idx, 0, sizeof(struct ifreq));
    strncpy(if_idx.ifr_name, ifName, IFNAMSIZ-1);
    if (ioctl(sockfd, SIOCGIFINDEX, &if_idx) < 0)
        perror("SIOCGIFINDEX");
    /* Get the MAC address of the interface to send on */
    memset(&if_mac, 0, sizeof(struct ifreq));
    strncpy(if_mac.ifr_name, ifName, IFNAMSIZ-1);
    if (ioctl(sockfd, SIOCGIFHWADDR, &if_mac) < 0)
        perror("SIOCGIFHWADDR");
    /* Construct the Ethernet header */
    memset(sendbuf, 0, BUF_SIZ);
    /* Ethernet header */
    eh->ether_shost[0] = ((uint8_t *)&if_mac.ifr_hwaddr.sa_data)[0];
    eh->ether_shost[1] = ((uint8_t *)&if_mac.ifr_hwaddr.sa_data)[1];
    eh->ether_shost[2] = ((uint8_t *)&if_mac.ifr_hwaddr.sa_data)[2];
    eh->ether_shost[3] = ((uint8_t *)&if_mac.ifr_hwaddr.sa_data)[3];
    eh->ether_shost[4] = ((uint8_t *)&if_mac.ifr_hwaddr.sa_data)[4];
    eh->ether_shost[5] = ((uint8_t *)&if_mac.ifr_hwaddr.sa_data)[5];
    eh->ether_dhost[0] = MY_DEST_MAC0;
    eh->ether_dhost[1] = MY_DEST_MAC1;
    eh->ether_dhost[2] = MY_DEST_MAC2;
    eh->ether_dhost[3] = MY_DEST_MAC3;
    eh->ether_dhost[4] = MY_DEST_MAC4;
    eh->ether_dhost[5] = MY_DEST_MAC5;
    /* Ethertype field */
    printf("%x\n",eh->ether_shost[0]);
    eh->ether_type = htons(ETH_P_IP);
    tx_len += sizeof(struct ether_header);

    struct iphdr *iph = (struct iphdr *) (sendbuf + sizeof(struct ether_header));
    /* IP Header */
    iph->ihl = 5;
    iph->version = 4;
    iph->tos = 16; // Low delay
    iph->id = htons(54321);
    iph->ttl = 64; // hops
    iph->protocol = 17; // UDP
    /* Source IP address, can be spoofed */
    //iph->saddr = inet_addr(inet_ntoa(((struct sockaddr_in *)&if_ip.ifr_addr)->sin_addr));
    iph->saddr = inet_addr("20.0.0.3");
    /* Destination IP address */
    iph->daddr = inet_addr("20.0.0.4");
    tx_len += sizeof(struct iphdr);
    /* Calculate IP checksum on completed header */
    iph->check = csum((unsigned short *)(sendbuf+sizeof(struct ...
(more)
edit retag flag offensive close merge delete