⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tunif.c

📁 lwIP-Softools-11Jul2002-alpha
💻 C
字号:
/* * Copyright (c) 2001, Swedish Institute of Computer Science. * All rights reserved.  * * Redistribution and use in source and binary forms, with or without  * modification, are permitted provided that the following conditions  * are met:  * 1. Redistributions of source code must retain the above copyright  *    notice, this list of conditions and the following disclaimer.  * 2. Redistributions in binary form must reproduce the above copyright  *    notice, this list of conditions and the following disclaimer in the  *    documentation and/or other materials provided with the distribution.  * 3. Neither the name of the Institute nor the names of its contributors  *    may be used to endorse or promote products derived from this software  *    without specific prior written permission.  * * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF  * SUCH DAMAGE.  * * This file is part of the lwIP TCP/IP stack. *  * Author: Adam Dunkels <adam@sics.se> * * $Id: tunif.c,v 1.3 2002/04/11 20:44:29 jctoman Exp $ */#include "lwip/debug.h"#include <fcntl.h>#include <stdlib.h>#include <stdio.h>#include <unistd.h>#include <sys/ioctl.h>#include <sys/socket.h>#include <sys/types.h>#include <sys/uio.h>#include <sys/socket.h>#ifndef linux#include <net/if_tun.h>#endif /* linux */#include "lwip/opt.h"#include "lwip/def.h"#include "lwip/mem.h"/*#include "lwip/ip.h"*/#include "lwip/pbuf.h"#include "netif/tunif.h"#include "lwip/sys.h"#include "lwip/err.h"/*efine TUNIF_DROP*/struct tunif {  int fd;};static char buf[4096];/*-----------------------------------------------------------------------------------*/static voidtunif_irq_handler(int fd, void *data){  struct netif *netif;  struct tunif *tun;  char *bufp;  int len;  struct pbuf *p, *q;  netif = data;  tun = netif->state;  len = sizeof(buf);  len = read(tun->fd, buf, len);  #ifdef TUNIF_DROP    if(((double)rand()/(double)RAND_MAX) < 0.10) {    DEBUGF(TUNIF_DEBUG, ("+++tunif_irq_handler: Packet dropped\n"));    return;  }#endif /* TUNIF_DROP */      p = pbuf_alloc(PBUF_LINK, len, PBUF_POOL);  bufp = &buf[0];  for(q = p; q != NULL; q = q->next) {    bcopy(bufp, q->payload, q->len);    bufp += q->len;  }  if(p != NULL) {#ifdef IPv6            pbuf_header(p, -4);#endif /* IPv6 */    netif->input(p, netif);  }  }/*-----------------------------------------------------------------------------------*/static err_ttunif_output(struct netif *netif, struct pbuf *p, struct ip_addr *ipaddr){  struct tunif *tunif;  char *data;  struct pbuf *q;  int i, j, ret;  #ifdef TUNIF_DROP  if(((double)rand()/(double)RAND_MAX) < 0.1) {    DEBUGF(TUNIF_DEBUG, ("+++tunif_output: Packet dropped\n"));    return 1;  }#endif /* TUNIF_DROP */  tunif = netif->state;  data = malloc(p->tot_len);  i = 0;  for(q = p; q != NULL; q = q->next) {    for(j = 0; j < q->len; j++) {      data[i] = ((char *)q->payload)[j];      i++;    }  }  DEBUGF(TUNIF_DEBUG, ("tunif: Sending len %d\n", p->tot_len));#ifdef IPv4  ret = write(tunif->fd, data, p->tot_len);#else  {    struct iovec iov[2];    int af;    printf("hahaha\n");    af = AF_INET6;    iov[0].iov_base = (char *)&af;    iov[0].iov_len  = sizeof(af);    iov[1].iov_base = data;    iov[1].iov_len  = p->tot_len;        ret = writev(tunif->fd, iov, 2);  }#endif /* IPv4 */    if(ret == -1) {    perror("tunif_output: write");  }  free(data);  return 1;}/*-----------------------------------------------------------------------------------*/static void tunif_thread(void *arg){  struct netif *netif;  struct tunif *tunif;  fd_set fdset;  int ret;    netif = arg;  tunif = netif->state;    while(1) {    FD_ZERO(&fdset);    FD_SET(tunif->fd, &fdset);    /* Wait for a packet to arrive. */    ret = select(tunif->fd + 1, &fdset, NULL, NULL, NULL);    if(ret == 1) {      /* Handle incoming packet. */      tunif_input(netif);    } else if(ret == -1) {      perror("tunif_thread: select");    }  }}/*-----------------------------------------------------------------------------------*//* * tunif_output(): * * This function is called by the TCP/IP stack when an IP packet * should be sent. It calls the function called low_level_output() to * do the actuall transmission of the packet. * *//*-----------------------------------------------------------------------------------*/static err_ttunif_output(struct netif *netif, struct pbuf *p,		  struct ip_addr *ipaddr){  struct tunif *tunif;  tunif = netif->state;  return low_level_output(tunif, p);}/*-----------------------------------------------------------------------------------*//* * tunif_input(): * * This function should be called when a packet is ready to be read * from the interface. It uses the function low_level_input() that * should handle the actual reception of bytes from the network * interface. * *//*-----------------------------------------------------------------------------------*/static voidtunif_input(struct netif *netif){  struct tunif *tunif;  struct pbuf *p;  tunif = netif->state;    p = low_level_input(tunif);  if(p == NULL) {    DEBUGF(TUNIF_DEBUG, ("tunif_input: low_level_input returned NULL\n"));    return;  }  if(ip_lookup(p->payload, netif)) {    netif->input(p, netif);  }}/*-----------------------------------------------------------------------------------*//* * tunif_init(): * * Should be called at the beginning of the program to set up the * network interface. It calls the function low_level_init() to do the * actual setup of the hardware. * *//*-----------------------------------------------------------------------------------*/voidtunif_init(struct netif *netif){  struct tunif *tunif;      tunif = mem_malloc(sizeof(struct tunif));  netif->state = tunif;  netif->name[0] = IFNAME0;  netif->name[1] = IFNAME1;  netif->output = tunif_output;      low_level_init(netif);}/*-----------------------------------------------------------------------------------*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -