[ovs-discuss] Tap interface in the OVS

Avi Cohen (A) avi.cohen at huawei.com
Sun Sep 3 11:57:14 UTC 2017


Add the tap in linux to be recognized by linux:   ip tuntap add dev int0  mode tap
Then add it to the ovs

From: ovs-discuss-bounces at openvswitch.org [mailto:ovs-discuss-bounces at openvswitch.org] On Behalf Of sougol gheissi
Sent: Sunday, 03 September, 2017 2:25 PM
To: ovs-discuss at openvswitch.org
Subject: [ovs-discuss] Tap interface in the OVS

Hello all,
I want to capture the packets in the userspace, so I decided to use tap interface in the OVS. I added a tap interface using the command below:

#ovs-vsctl add-port br0 int0 -- set Interface int0 type=internal

then I tried to send the packets to that port by this OVS command:

#ovs-ofctl add-flow br0 table=0,priority=100,udp,tp_dst=5060,actions=output:5

(5 is the int0 port number)
then I write a piece of code to capture the packets,


#include <unistd.h>

#include <fcntl.h>

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

#include <syslog.h>

#include <errno.h>

#include <stdlib.h>

#include <unistd.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <netinet/tcp.h>

#include <netinet/ip.h>

#include <netpacket/packet.h>

#include <stdio.h>

#include <stdlib.h>

#include <errno.h>

#include <getopt.h>

#include <string.h>

#include <arpa/inet.h>

#include <stdio.h>

#include <sys/socket.h>

#include <arpa/inet.h>

#include <malloc.h>

#include <net/ethernet.h>

#include <sys/ioctl.h>

#include <net/if.h>

#include <string.h>

#include <sys/types.h>

#include <time.h>

#include <sys/ioctl.h>

#include <sys/socket.h>

#include <linux/if.h>

#include <linux/if_tun.h>

#include <signal.h>





static int tap_open(char *dev)

{   struct ifreq ifr;

    int fd;



    if ((fd = open("/dev/net/tun", O_RDWR)) < 0) { return -1; }



    memset(&ifr, 0, sizeof(ifr));

    ifr.ifr_flags = IFF_TAP | IFF_NO_PI;

    if (*dev) strncpy(ifr.ifr_name, dev, IFNAMSIZ);

    if (ioctl(fd, TUNSETIFF, (void *) &ifr) < 0) { goto failed; }



    strcpy(dev, ifr.ifr_name); return fd;



failed:

    close(fd); return -1;

}





int tapfd;

void signal_handler(int sig) { close(tapfd); exit(1); }



int main()

{      unsigned char buf[2000];

       unsigned char name[20];

       int i;

       int numbytes=0;





       strcpy(name,"inet0"); tapfd=tap_open(name);

       if(tapfd<0) { printf("port open error!\n"); return 0; }



signal(SIGHUP,signal_handler);

signal(SIGTERM,signal_handler);

signal(SIGKILL,signal_handler);

signal(SIGSTOP,signal_handler);

signal(SIGINT,signal_handler);



repeat:

       numbytes=read(tapfd, buf, 2000);

       if(numbytes<=0) { usleep(100); goto repeat;}



       printf("\tTAP Data:");

       for (i=0; i<numbytes; i++) printf("%02x:", buf[i]);

       printf("\n\n");



       goto repeat;



       close(tapfd);

       return 0;

}
But I get "port open error!" which shows I can not open the fd. Can anyone help me how to add a tap interface with OVS?
Thanks in advance
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openvswitch.org/pipermail/ovs-discuss/attachments/20170903/cbefe054/attachment-0001.html>


More information about the discuss mailing list