|
@@ -34,6 +34,8 @@
|
|
|
* Modifications for 2.3.99-pre5 kernel.
|
|
|
*/
|
|
|
|
|
|
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
|
|
+
|
|
|
#define DRV_NAME "tun"
|
|
|
#define DRV_VERSION "1.6"
|
|
|
#define DRV_DESCRIPTION "Universal TUN/TAP device driver"
|
|
@@ -76,11 +78,27 @@
|
|
|
#ifdef TUN_DEBUG
|
|
|
static int debug;
|
|
|
|
|
|
-#define DBG if(tun->debug)printk
|
|
|
-#define DBG1 if(debug==2)printk
|
|
|
+#define tun_debug(level, tun, fmt, args...) \
|
|
|
+do { \
|
|
|
+ if (tun->debug) \
|
|
|
+ netdev_printk(level, tun->dev, fmt, ##args); \
|
|
|
+} while (0)
|
|
|
+#define DBG1(level, fmt, args...) \
|
|
|
+do { \
|
|
|
+ if (debug == 2) \
|
|
|
+ printk(level fmt, ##args); \
|
|
|
+} while (0)
|
|
|
#else
|
|
|
-#define DBG( a... )
|
|
|
-#define DBG1( a... )
|
|
|
+#define tun_debug(level, tun, fmt, args...) \
|
|
|
+do { \
|
|
|
+ if (0) \
|
|
|
+ netdev_printk(level, tun->dev, fmt, ##args); \
|
|
|
+} while (0)
|
|
|
+#define DBG1(level, fmt, args...) \
|
|
|
+do { \
|
|
|
+ if (0) \
|
|
|
+ printk(level fmt, ##args); \
|
|
|
+} while (0)
|
|
|
#endif
|
|
|
|
|
|
#define FLT_EXACT_COUNT 8
|
|
@@ -205,7 +223,7 @@ static void tun_put(struct tun_struct *tun)
|
|
|
tun_detach(tfile->tun);
|
|
|
}
|
|
|
|
|
|
-/* TAP filterting */
|
|
|
+/* TAP filtering */
|
|
|
static void addr_hash_set(u32 *mask, const u8 *addr)
|
|
|
{
|
|
|
int n = ether_crc(ETH_ALEN, addr) >> 26;
|
|
@@ -360,7 +378,7 @@ static netdev_tx_t tun_net_xmit(struct sk_buff *skb, struct net_device *dev)
|
|
|
{
|
|
|
struct tun_struct *tun = netdev_priv(dev);
|
|
|
|
|
|
- DBG(KERN_INFO "%s: tun_net_xmit %d\n", tun->dev->name, skb->len);
|
|
|
+ tun_debug(KERN_INFO, tun, "tun_net_xmit %d\n", skb->len);
|
|
|
|
|
|
/* Drop packet if interface is not attached */
|
|
|
if (!tun->tfile)
|
|
@@ -499,7 +517,7 @@ static unsigned int tun_chr_poll(struct file *file, poll_table * wait)
|
|
|
|
|
|
sk = tun->socket.sk;
|
|
|
|
|
|
- DBG(KERN_INFO "%s: tun_chr_poll\n", tun->dev->name);
|
|
|
+ tun_debug(KERN_INFO, tun, "tun_chr_poll\n");
|
|
|
|
|
|
poll_wait(file, &tun->wq.wait, wait);
|
|
|
|
|
@@ -690,7 +708,7 @@ static ssize_t tun_chr_aio_write(struct kiocb *iocb, const struct iovec *iv,
|
|
|
if (!tun)
|
|
|
return -EBADFD;
|
|
|
|
|
|
- DBG(KERN_INFO "%s: tun_chr_write %ld\n", tun->dev->name, count);
|
|
|
+ tun_debug(KERN_INFO, tun, "tun_chr_write %ld\n", count);
|
|
|
|
|
|
result = tun_get_user(tun, iv, iov_length(iv, count),
|
|
|
file->f_flags & O_NONBLOCK);
|
|
@@ -739,7 +757,7 @@ static __inline__ ssize_t tun_put_user(struct tun_struct *tun,
|
|
|
else if (sinfo->gso_type & SKB_GSO_UDP)
|
|
|
gso.gso_type = VIRTIO_NET_HDR_GSO_UDP;
|
|
|
else {
|
|
|
- printk(KERN_ERR "tun: unexpected GSO type: "
|
|
|
+ pr_err("unexpected GSO type: "
|
|
|
"0x%x, gso_size %d, hdr_len %d\n",
|
|
|
sinfo->gso_type, gso.gso_size,
|
|
|
gso.hdr_len);
|
|
@@ -786,7 +804,7 @@ static ssize_t tun_do_read(struct tun_struct *tun,
|
|
|
struct sk_buff *skb;
|
|
|
ssize_t ret = 0;
|
|
|
|
|
|
- DBG(KERN_INFO "%s: tun_chr_read\n", tun->dev->name);
|
|
|
+ tun_debug(KERN_INFO, tun, "tun_chr_read\n");
|
|
|
|
|
|
add_wait_queue(&tun->wq.wait, &wait);
|
|
|
while (len) {
|
|
@@ -1083,7 +1101,7 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr)
|
|
|
if (device_create_file(&tun->dev->dev, &dev_attr_tun_flags) ||
|
|
|
device_create_file(&tun->dev->dev, &dev_attr_owner) ||
|
|
|
device_create_file(&tun->dev->dev, &dev_attr_group))
|
|
|
- printk(KERN_ERR "Failed to create tun sysfs files\n");
|
|
|
+ pr_err("Failed to create tun sysfs files\n");
|
|
|
|
|
|
sk->sk_destruct = tun_sock_destruct;
|
|
|
|
|
@@ -1092,7 +1110,7 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr)
|
|
|
goto failed;
|
|
|
}
|
|
|
|
|
|
- DBG(KERN_INFO "%s: tun_set_iff\n", tun->dev->name);
|
|
|
+ tun_debug(KERN_INFO, tun, "tun_set_iff\n");
|
|
|
|
|
|
if (ifr->ifr_flags & IFF_NO_PI)
|
|
|
tun->flags |= TUN_NO_PI;
|
|
@@ -1129,7 +1147,7 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr)
|
|
|
static int tun_get_iff(struct net *net, struct tun_struct *tun,
|
|
|
struct ifreq *ifr)
|
|
|
{
|
|
|
- DBG(KERN_INFO "%s: tun_get_iff\n", tun->dev->name);
|
|
|
+ tun_debug(KERN_INFO, tun, "tun_get_iff\n");
|
|
|
|
|
|
strcpy(ifr->ifr_name, tun->dev->name);
|
|
|
|
|
@@ -1229,7 +1247,7 @@ static long __tun_chr_ioctl(struct file *file, unsigned int cmd,
|
|
|
if (!tun)
|
|
|
goto unlock;
|
|
|
|
|
|
- DBG(KERN_INFO "%s: tun_chr_ioctl cmd %d\n", tun->dev->name, cmd);
|
|
|
+ tun_debug(KERN_INFO, tun, "tun_chr_ioctl cmd %d\n", cmd);
|
|
|
|
|
|
ret = 0;
|
|
|
switch (cmd) {
|
|
@@ -1249,8 +1267,8 @@ static long __tun_chr_ioctl(struct file *file, unsigned int cmd,
|
|
|
else
|
|
|
tun->flags &= ~TUN_NOCHECKSUM;
|
|
|
|
|
|
- DBG(KERN_INFO "%s: checksum %s\n",
|
|
|
- tun->dev->name, arg ? "disabled" : "enabled");
|
|
|
+ tun_debug(KERN_INFO, tun, "checksum %s\n",
|
|
|
+ arg ? "disabled" : "enabled");
|
|
|
break;
|
|
|
|
|
|
case TUNSETPERSIST:
|
|
@@ -1260,33 +1278,34 @@ static long __tun_chr_ioctl(struct file *file, unsigned int cmd,
|
|
|
else
|
|
|
tun->flags &= ~TUN_PERSIST;
|
|
|
|
|
|
- DBG(KERN_INFO "%s: persist %s\n",
|
|
|
- tun->dev->name, arg ? "enabled" : "disabled");
|
|
|
+ tun_debug(KERN_INFO, tun, "persist %s\n",
|
|
|
+ arg ? "enabled" : "disabled");
|
|
|
break;
|
|
|
|
|
|
case TUNSETOWNER:
|
|
|
/* Set owner of the device */
|
|
|
tun->owner = (uid_t) arg;
|
|
|
|
|
|
- DBG(KERN_INFO "%s: owner set to %d\n", tun->dev->name, tun->owner);
|
|
|
+ tun_debug(KERN_INFO, tun, "owner set to %d\n", tun->owner);
|
|
|
break;
|
|
|
|
|
|
case TUNSETGROUP:
|
|
|
/* Set group of the device */
|
|
|
tun->group= (gid_t) arg;
|
|
|
|
|
|
- DBG(KERN_INFO "%s: group set to %d\n", tun->dev->name, tun->group);
|
|
|
+ tun_debug(KERN_INFO, tun, "group set to %d\n", tun->group);
|
|
|
break;
|
|
|
|
|
|
case TUNSETLINK:
|
|
|
/* Only allow setting the type when the interface is down */
|
|
|
if (tun->dev->flags & IFF_UP) {
|
|
|
- DBG(KERN_INFO "%s: Linktype set failed because interface is up\n",
|
|
|
- tun->dev->name);
|
|
|
+ tun_debug(KERN_INFO, tun,
|
|
|
+ "Linktype set failed because interface is up\n");
|
|
|
ret = -EBUSY;
|
|
|
} else {
|
|
|
tun->dev->type = (int) arg;
|
|
|
- DBG(KERN_INFO "%s: linktype set to %d\n", tun->dev->name, tun->dev->type);
|
|
|
+ tun_debug(KERN_INFO, tun, "linktype set to %d\n",
|
|
|
+ tun->dev->type);
|
|
|
ret = 0;
|
|
|
}
|
|
|
break;
|
|
@@ -1318,8 +1337,8 @@ static long __tun_chr_ioctl(struct file *file, unsigned int cmd,
|
|
|
|
|
|
case SIOCSIFHWADDR:
|
|
|
/* Set hw address */
|
|
|
- DBG(KERN_DEBUG "%s: set hw address: %pM\n",
|
|
|
- tun->dev->name, ifr.ifr_hwaddr.sa_data);
|
|
|
+ tun_debug(KERN_DEBUG, tun, "set hw address: %pM\n",
|
|
|
+ ifr.ifr_hwaddr.sa_data);
|
|
|
|
|
|
ret = dev_set_mac_address(tun->dev, &ifr.ifr_hwaddr);
|
|
|
break;
|
|
@@ -1433,7 +1452,7 @@ static int tun_chr_fasync(int fd, struct file *file, int on)
|
|
|
if (!tun)
|
|
|
return -EBADFD;
|
|
|
|
|
|
- DBG(KERN_INFO "%s: tun_chr_fasync %d\n", tun->dev->name, on);
|
|
|
+ tun_debug(KERN_INFO, tun, "tun_chr_fasync %d\n", on);
|
|
|
|
|
|
if ((ret = fasync_helper(fd, file, on, &tun->fasync)) < 0)
|
|
|
goto out;
|
|
@@ -1455,7 +1474,7 @@ static int tun_chr_open(struct inode *inode, struct file * file)
|
|
|
{
|
|
|
struct tun_file *tfile;
|
|
|
|
|
|
- DBG1(KERN_INFO "tunX: tun_chr_open\n");
|
|
|
+ DBG1(KERN_INFO, "tunX: tun_chr_open\n");
|
|
|
|
|
|
tfile = kmalloc(sizeof(*tfile), GFP_KERNEL);
|
|
|
if (!tfile)
|
|
@@ -1476,7 +1495,7 @@ static int tun_chr_close(struct inode *inode, struct file *file)
|
|
|
if (tun) {
|
|
|
struct net_device *dev = tun->dev;
|
|
|
|
|
|
- DBG(KERN_INFO "%s: tun_chr_close\n", dev->name);
|
|
|
+ tun_debug(KERN_INFO, tun, "tun_chr_close\n");
|
|
|
|
|
|
__tun_detach(tun);
|
|
|
|
|
@@ -1607,18 +1626,18 @@ static int __init tun_init(void)
|
|
|
{
|
|
|
int ret = 0;
|
|
|
|
|
|
- printk(KERN_INFO "tun: %s, %s\n", DRV_DESCRIPTION, DRV_VERSION);
|
|
|
- printk(KERN_INFO "tun: %s\n", DRV_COPYRIGHT);
|
|
|
+ pr_info("%s, %s\n", DRV_DESCRIPTION, DRV_VERSION);
|
|
|
+ pr_info("%s\n", DRV_COPYRIGHT);
|
|
|
|
|
|
ret = rtnl_link_register(&tun_link_ops);
|
|
|
if (ret) {
|
|
|
- printk(KERN_ERR "tun: Can't register link_ops\n");
|
|
|
+ pr_err("Can't register link_ops\n");
|
|
|
goto err_linkops;
|
|
|
}
|
|
|
|
|
|
ret = misc_register(&tun_miscdev);
|
|
|
if (ret) {
|
|
|
- printk(KERN_ERR "tun: Can't register misc device %d\n", TUN_MINOR);
|
|
|
+ pr_err("Can't register misc device %d\n", TUN_MINOR);
|
|
|
goto err_misc;
|
|
|
}
|
|
|
return 0;
|