#include "netlink.h"
#include <stdio.h>
#include <string.h>
+#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
static void tun_deliver_to_kernel(void *sst, struct buffer_if *buf)
{
struct tun *st=sst;
+ ssize_t rc;
BUF_ASSERT_USED(buf);
- /* No error checking, because we'd just throw the packet away
- anyway if it didn't work. */
- write(st->fd,buf->start,buf->size);
+
+ /* Log errors, so we can tell what's going on, but only once a
+ minute, so we don't flood the logs. Short writes count as
+ errors. */
+ rc = write(st->fd,buf->start,buf->size);
+ if(rc != buf->size) {
+ static struct timeval last_report;
+ if(tv_now_global.tv_sec >= last_report.tv_sec + 60) {
+ if(rc < 0)
+ Message(M_WARNING,
+ "failed to deliver packet to tun device: %s\n",
+ strerror(errno));
+ else
+ Message(M_WARNING,
+ "truncated packet delivered to tun device\n");
+ last_report = tv_now_global;
+ }
+ }
BUF_FREE(buf);
}
struct sockaddr_in *sa;
int action;
- memset(&rt,0,sizeof(rt));
+ FILLZERO(rt);
sa=(struct sockaddr_in *)&rt.rt_dst;
sa->sin_family=AF_INET;
sa->sin_addr.s_addr=htonl(nets->list[i].prefix);
fatal_perror("%s: can't open device file %s",st->nl.name,
st->device_path);
}
- memset(&ifr,0,sizeof(ifr));
+ FILLZERO(ifr);
ifr.ifr_flags = IFF_TUN | IFF_NO_PI; /* Just send/receive IP packets,
no extra headers */
if (st->interface_name)
/* Interface address */
strncpy(ifr.ifr_name,st->interface_name,IFNAMSIZ);
sa=(struct sockaddr_in *)&ifr.ifr_addr;
- memset(sa,0,sizeof(*sa));
+ FILLZERO(*sa);
sa->sin_family=AF_INET;
sa->sin_addr.s_addr=htonl(st->local_address);
if (ioctl(fd,SIOCSIFADDR, &ifr)!=0) {
/* Netmask */
strncpy(ifr.ifr_name,st->interface_name,IFNAMSIZ);
sa=(struct sockaddr_in *)&ifr.ifr_netmask;
- memset(sa,0,sizeof(*sa));
+ FILLZERO(*sa);
sa->sin_family=AF_INET;
sa->sin_addr.s_addr=htonl(0xffffffff);
if (ioctl(fd,SIOCSIFNETMASK, &ifr)!=0) {
/* Destination address (point-to-point) */
strncpy(ifr.ifr_name,st->interface_name,IFNAMSIZ);
sa=(struct sockaddr_in *)&ifr.ifr_dstaddr;
- memset(sa,0,sizeof(*sa));
+ FILLZERO(*sa);
sa->sin_family=AF_INET;
sa->sin_addr.s_addr=htonl(st->nl.secnet_address);
if (ioctl(fd,SIOCSIFDSTADDR, &ifr)!=0) {