<div dir="ltr"><div><div><div>Hello all,<br></div>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:<br></div><pre><code>#ovs-vsctl add-port br0 int0 -- set Interface int0 type=internal<br><br></code></pre><pre><code>then I tried to send the packets to that port by this OVS command:<br></code></pre><pre><code>#ovs-ofctl add-flow br0 table=0,priority=100,udp,tp_dst=5060,actions=output:5<br></code></pre><pre><code>(5 is the int0 port number)<br>then I write a piece of code to capture the packets,<br></code><code>
#include &lt;unistd.h&gt;
#include &lt;fcntl.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;stdio.h&gt;
#include &lt;string.h&gt;
#include &lt;syslog.h&gt;
#include &lt;errno.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;unistd.h&gt;
#include &lt;sys/socket.h&gt;
#include &lt;netinet/in.h&gt;
#include &lt;netinet/tcp.h&gt;
#include &lt;netinet/ip.h&gt;
#include &lt;netpacket/packet.h&gt;
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;errno.h&gt;
#include &lt;getopt.h&gt;
#include &lt;string.h&gt;
#include &lt;arpa/inet.h&gt;
#include &lt;stdio.h&gt;
#include &lt;sys/socket.h&gt;
#include &lt;arpa/inet.h&gt;
#include &lt;malloc.h&gt;
#include &lt;net/ethernet.h&gt;
#include &lt;sys/ioctl.h&gt;
#include &lt;net/if.h&gt;
#include &lt;string.h&gt;
#include &lt;sys/types.h&gt;
#include &lt;time.h&gt;
#include &lt;sys/ioctl.h&gt;
#include &lt;sys/socket.h&gt;
#include &lt;linux/if.h&gt;
#include &lt;linux/if_tun.h&gt;
#include &lt;signal.h&gt;


static int tap_open(char *dev)
{   struct ifreq ifr;
    int fd;

    if ((fd = open(&quot;/dev/net/tun&quot;, O_RDWR)) &lt; 0) { return -1; }

    memset(&amp;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 *) &amp;ifr) &lt; 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,&quot;inet0&quot;); tapfd=tap_open(name); 
        if(tapfd&lt;0) { printf(&quot;port open error!\n&quot;); 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&lt;=0) { usleep(100); goto repeat;}
        
        printf(&quot;\tTAP Data:&quot;);
        for (i=0; i&lt;numbytes; i++) printf(&quot;%02x:&quot;, buf[i]);
        printf(&quot;\n\n&quot;);
   
        goto repeat;        

        close(tapfd);
        return 0;
}</code></pre>But I get &quot;<code>port open error!&quot; which shows I can not open the fd. Can anyone help me how to add a tap interface with OVS?<br></code></div><code>Thanks in advance<br></code></div>