147 lines
2.7 KiB
C
147 lines
2.7 KiB
C
/*
|
|
* INET An implementation of the TCP/IP protocol suite for the LINUX
|
|
* operating system. INET is implemented using the BSD Socket
|
|
* interface as the means of communication with the user level.
|
|
*
|
|
* Various kernel-resident INET utility functions; mainly
|
|
* for format conversion and debugging output.
|
|
*
|
|
* Version: @(#)utils.c 1.0.7 05/18/93
|
|
*
|
|
* Author: Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
|
|
*
|
|
* Fixes:
|
|
* Alan Cox : verify_area check.
|
|
*
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version
|
|
* 2 of the License, or (at your option) any later version.
|
|
*/
|
|
#include <asm/segment.h>
|
|
#include <asm/system.h>
|
|
#include <linux/types.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/sched.h>
|
|
#include <linux/string.h>
|
|
#include <linux/mm.h>
|
|
#include <linux/socket.h>
|
|
#include <linux/in.h>
|
|
#include <linux/errno.h>
|
|
#include <linux/stat.h>
|
|
#include <stdarg.h>
|
|
#include "inet.h"
|
|
#include "dev.h"
|
|
#include "eth.h"
|
|
#include "ip.h"
|
|
#include "protocol.h"
|
|
#include "tcp.h"
|
|
#include "skbuff.h"
|
|
#include "arp.h"
|
|
|
|
|
|
/* Display an IP address in readable format. */
|
|
char *in_ntoa(unsigned long in)
|
|
{
|
|
static char buff[18];
|
|
register char *p;
|
|
|
|
p = (char *) ∈
|
|
sprintf(buff, "%d.%d.%d.%d",
|
|
(p[0] & 255), (p[1] & 255), (p[2] & 255), (p[3] & 255));
|
|
return(buff);
|
|
}
|
|
|
|
|
|
/* Convert an ASCII string to binary IP. */
|
|
unsigned long
|
|
in_aton(char *str)
|
|
{
|
|
unsigned long l;
|
|
unsigned int val;
|
|
int i;
|
|
|
|
l = 0;
|
|
for (i = 0; i < 4; i++) {
|
|
l <<= 8;
|
|
if (*str != '\0') {
|
|
val = 0;
|
|
while (*str != '\0' && *str != '.') {
|
|
val *= 10;
|
|
val += *str - '0';
|
|
str++;
|
|
}
|
|
l |= val;
|
|
if (*str != '\0') str++;
|
|
}
|
|
}
|
|
return(htonl(l));
|
|
}
|
|
|
|
|
|
void
|
|
dprintf(int level, char *fmt, ...)
|
|
{
|
|
va_list args;
|
|
char *buff;
|
|
extern int vsprintf(char * buf, const char * fmt, va_list args);
|
|
|
|
if (level != inet_debug) return;
|
|
|
|
buff = (char *) kmalloc(256, GFP_ATOMIC);
|
|
if (buff != NULL) {
|
|
va_start(args, fmt);
|
|
vsprintf(buff, fmt, args);
|
|
va_end(args);
|
|
printk(buff);
|
|
kfree(buff);
|
|
}
|
|
}
|
|
|
|
|
|
int
|
|
dbg_ioctl(void *arg, int level)
|
|
{
|
|
int val;
|
|
int err;
|
|
|
|
if (!suser()) return(-EPERM);
|
|
err=verify_area(VERIFY_READ, (void *)arg, sizeof(int));
|
|
if(err)
|
|
return err;
|
|
val = get_fs_long((int *)arg);
|
|
switch(val) {
|
|
case 0: /* OFF */
|
|
inet_debug = DBG_OFF;
|
|
break;
|
|
case 1: /* ON, INET */
|
|
inet_debug = level;
|
|
break;
|
|
|
|
case DBG_RT: /* modules */
|
|
case DBG_DEV:
|
|
case DBG_ETH:
|
|
case DBG_PROTO:
|
|
case DBG_TMR:
|
|
case DBG_PKT:
|
|
case DBG_RAW:
|
|
|
|
case DBG_LOOPB: /* drivers */
|
|
case DBG_SLIP:
|
|
|
|
case DBG_ARP: /* protocols */
|
|
case DBG_IP:
|
|
case DBG_ICMP:
|
|
case DBG_TCP:
|
|
case DBG_UDP:
|
|
|
|
inet_debug = val;
|
|
break;
|
|
|
|
default:
|
|
return(-EINVAL);
|
|
}
|
|
|
|
return(0);
|
|
}
|