home *** CD-ROM | disk | FTP | other *** search
/ Il CD di internet / CD.iso / SOURCE / KERNEL-S / V1.2 / LINUX-1.2 / LINUX-1 / linux / net / inet / proc.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-03-06  |  8.8 KB  |  252 lines

  1. /*
  2.  * INET        An implementation of the TCP/IP protocol suite for the LINUX
  3.  *        operating system.  INET is implemented using the  BSD Socket
  4.  *        interface as the means of communication with the user level.
  5.  *
  6.  *        This file implements the various access functions for the
  7.  *        PROC file system.  It is mainly used for debugging and
  8.  *        statistics.
  9.  *
  10.  * Version:    @(#)proc.c    1.0.5    05/27/93
  11.  *
  12.  * Authors:    Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
  13.  *        Gerald J. Heim, <heim@peanuts.informatik.uni-tuebingen.de>
  14.  *        Fred Baumgarten, <dc6iq@insu1.etec.uni-karlsruhe.de>
  15.  *        Erik Schoenfelder, <schoenfr@ibr.cs.tu-bs.de>
  16.  *
  17.  * Fixes:
  18.  *        Alan Cox    :    UDP sockets show the rxqueue/txqueue
  19.  *                    using hint flag for the netinfo.
  20.  *    Pauline Middelink    :    identd support
  21.  *        Alan Cox    :    Make /proc safer.
  22.  *    Erik Schoenfelder    :    /proc/net/snmp
  23.  *        Alan Cox    :    Handle dead sockets properly.
  24.  *
  25.  *        This program is free software; you can redistribute it and/or
  26.  *        modify it under the terms of the GNU General Public License
  27.  *        as published by the Free Software Foundation; either version
  28.  *        2 of the License, or (at your option) any later version.
  29.  */
  30. #include <asm/system.h>
  31. #include <linux/autoconf.h>
  32. #include <linux/sched.h>
  33. #include <linux/socket.h>
  34. #include <linux/net.h>
  35. #include <linux/un.h>
  36. #include <linux/in.h>
  37. #include <linux/param.h>
  38. #include <linux/inet.h>
  39. #include <linux/netdevice.h>
  40. #include "ip.h"
  41. #include "icmp.h"
  42. #include "protocol.h"
  43. #include "tcp.h"
  44. #include "udp.h"
  45. #include <linux/skbuff.h>
  46. #include "sock.h"
  47. #include "raw.h"
  48.  
  49. /*
  50.  * Get__netinfo returns the length of that string.
  51.  *
  52.  * KNOWN BUGS
  53.  *  As in get_unix_netinfo, the buffer might be too small. If this
  54.  *  happens, get__netinfo returns only part of the available infos.
  55.  */
  56. static int
  57. get__netinfo(struct proto *pro, char *buffer, int format, char **start, off_t offset, int length)
  58. {
  59.     struct sock **s_array;
  60.     struct sock *sp;
  61.     int i;
  62.     int timer_active;
  63.     unsigned long  dest, src;
  64.     unsigned short destp, srcp;
  65.     int len=0;
  66.     off_t pos=0;
  67.     off_t begin=0;
  68.   
  69.     s_array = pro->sock_array;
  70.     len+=sprintf(buffer, "sl  local_address rem_address   st tx_queue rx_queue tr tm->when uid\n");
  71. /*
  72.  *    This was very pretty but didn't work when a socket is destroyed at the wrong moment
  73.  *    (eg a syn recv socket getting a reset), or a memory timer destroy. Instead of playing
  74.  *    with timers we just concede defeat and cli().
  75.  */
  76.     for(i = 0; i < SOCK_ARRAY_SIZE; i++) 
  77.     {
  78.           cli();
  79.         sp = s_array[i];
  80.         while(sp != NULL) 
  81.         {
  82.             dest  = sp->daddr;
  83.             src   = sp->saddr;
  84.             destp = sp->dummy_th.dest;
  85.             srcp  = sp->dummy_th.source;
  86.  
  87.             /* Since we are Little Endian we need to swap the bytes :-( */
  88.             destp = ntohs(destp);
  89.             srcp  = ntohs(srcp);
  90.             timer_active = del_timer(&sp->timer);
  91.             if (!timer_active)
  92.                 sp->timer.expires = 0;
  93.             len+=sprintf(buffer+len, "%2d: %08lX:%04X %08lX:%04X %02X %08lX:%08lX %02X:%08lX %08X %d %d\n",
  94.                 i, src, srcp, dest, destp, sp->state, 
  95.                 format==0?sp->write_seq-sp->rcv_ack_seq:sp->rmem_alloc, 
  96.                 format==0?sp->acked_seq-sp->copied_seq:sp->wmem_alloc,
  97.                 timer_active, sp->timer.expires, (unsigned) sp->retransmits,
  98.                 sp->socket?SOCK_INODE(sp->socket)->i_uid:0,
  99.                 timer_active?sp->timeout:0);
  100.             if (timer_active)
  101.                 add_timer(&sp->timer);
  102.             /*
  103.              * All sockets with (port mod SOCK_ARRAY_SIZE) = i
  104.              * are kept in sock_array[i], so we must follow the
  105.              * 'next' link to get them all.
  106.              */
  107.             sp = sp->next;
  108.             pos=begin+len;
  109.             if(pos<offset)
  110.             {
  111.                 len=0;
  112.                 begin=pos;
  113.             }
  114.             if(pos>offset+length)
  115.                 break;
  116.         }
  117.         sti();    /* We only turn interrupts back on for a moment, but because the interrupt queues anything built up
  118.                before this will clear before we jump back and cli, so it's not as bad as it looks */
  119.         if(pos>offset+length)
  120.             break;
  121.     }
  122.     *start=buffer+(offset-begin);
  123.     len-=(offset-begin);
  124.     if(len>length)
  125.           len=length;
  126.     return len;
  127.  
  128.  
  129. int tcp_get_info(char *buffer, char **start, off_t offset, int length)
  130. {
  131.     return get__netinfo(&tcp_prot, buffer,0, start, offset, length);
  132. }
  133.  
  134.  
  135. int udp_get_info(char *buffer, char **start, off_t offset, int length)
  136. {
  137.     return get__netinfo(&udp_prot, buffer,1, start, offset, length);
  138. }
  139.  
  140.  
  141. int raw_get_info(char *buffer, char **start, off_t offset, int length)
  142. {
  143.     return get__netinfo(&raw_prot, buffer,1, start, offset, length);
  144. }
  145.  
  146.  
  147. /*
  148.  *    Report socket allocation statistics [mea@utu.fi]
  149.  */
  150. int afinet_get_info(char *buffer, char **start, off_t offset, int length)
  151. {
  152.     /* From  net/socket.c  */
  153.     extern int socket_get_info(char *, char **, off_t, int);
  154.     extern struct proto packet_prot;
  155.  
  156.     int len  = socket_get_info(buffer,start,offset,length);
  157.  
  158.     len += sprintf(buffer+len,"SOCK_ARRAY_SIZE=%d\n",SOCK_ARRAY_SIZE);
  159.     len += sprintf(buffer+len,"TCP: inuse %d highest %d\n",
  160.                tcp_prot.inuse, tcp_prot.highestinuse);
  161.     len += sprintf(buffer+len,"UDP: inuse %d highest %d\n",
  162.                udp_prot.inuse, udp_prot.highestinuse);
  163.     len += sprintf(buffer+len,"RAW: inuse %d highest %d\n",
  164.                raw_prot.inuse, raw_prot.highestinuse);
  165.     len += sprintf(buffer+len,"PAC: inuse %d highest %d\n",
  166.                packet_prot.inuse, packet_prot.highestinuse);
  167.     *start = buffer + offset;
  168.     len -= offset;
  169.     if (len > length)
  170.         len = length;
  171.     return len;
  172. }
  173.  
  174.  
  175. /* 
  176.  *    Called from the PROCfs module. This outputs /proc/net/snmp.
  177.  */
  178.  
  179. int snmp_get_info(char *buffer, char **start, off_t offset, int length)
  180. {
  181.     extern struct tcp_mib tcp_statistics;
  182.     extern struct udp_mib udp_statistics;
  183.     int len;
  184. /*
  185.   extern unsigned long tcp_rx_miss, tcp_rx_hit1,tcp_rx_hit2;
  186. */
  187.  
  188.     len = sprintf (buffer,
  189.         "Ip: Forwarding DefaultTTL InReceives InHdrErrors InAddrErrors ForwDatagrams InUnknownProtos InDiscards InDelivers OutRequests OutDiscards OutNoRoutes ReasmTimeout ReasmReqds ReasmOKs ReasmFails FragOKs FragFails FragCreates\n"
  190.         "Ip: %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu\n",
  191.             ip_statistics.IpForwarding, ip_statistics.IpDefaultTTL, 
  192.             ip_statistics.IpInReceives, ip_statistics.IpInHdrErrors, 
  193.             ip_statistics.IpInAddrErrors, ip_statistics.IpForwDatagrams, 
  194.             ip_statistics.IpInUnknownProtos, ip_statistics.IpInDiscards, 
  195.             ip_statistics.IpInDelivers, ip_statistics.IpOutRequests, 
  196.             ip_statistics.IpOutDiscards, ip_statistics.IpOutNoRoutes, 
  197.             ip_statistics.IpReasmTimeout, ip_statistics.IpReasmReqds, 
  198.             ip_statistics.IpReasmOKs, ip_statistics.IpReasmFails, 
  199.             ip_statistics.IpFragOKs, ip_statistics.IpFragFails, 
  200.             ip_statistics.IpFragCreates);
  201.                     
  202.     len += sprintf (buffer + len,
  203.         "Icmp: InMsgs InErrors InDestUnreachs InTimeExcds InParmProbs InSrcQuenchs InRedirects InEchos InEchoReps InTimestamps InTimestampReps InAddrMasks InAddrMaskReps OutMsgs OutErrors OutDestUnreachs OutTimeExcds OutParmProbs OutSrcQuenchs OutRedirects OutEchos OutEchoReps OutTimestamps OutTimestampReps OutAddrMasks OutAddrMaskReps\n"
  204.         "Icmp: %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu\n",
  205.             icmp_statistics.IcmpInMsgs, icmp_statistics.IcmpInErrors,
  206.             icmp_statistics.IcmpInDestUnreachs, icmp_statistics.IcmpInTimeExcds,
  207.             icmp_statistics.IcmpInParmProbs, icmp_statistics.IcmpInSrcQuenchs,
  208.             icmp_statistics.IcmpInRedirects, icmp_statistics.IcmpInEchos,
  209.             icmp_statistics.IcmpInEchoReps, icmp_statistics.IcmpInTimestamps,
  210.             icmp_statistics.IcmpInTimestampReps, icmp_statistics.IcmpInAddrMasks,
  211.             icmp_statistics.IcmpInAddrMaskReps, icmp_statistics.IcmpOutMsgs,
  212.             icmp_statistics.IcmpOutErrors, icmp_statistics.IcmpOutDestUnreachs,
  213.             icmp_statistics.IcmpOutTimeExcds, icmp_statistics.IcmpOutParmProbs,
  214.             icmp_statistics.IcmpOutSrcQuenchs, icmp_statistics.IcmpOutRedirects,
  215.             icmp_statistics.IcmpOutEchos, icmp_statistics.IcmpOutEchoReps,
  216.             icmp_statistics.IcmpOutTimestamps, icmp_statistics.IcmpOutTimestampReps,
  217.             icmp_statistics.IcmpOutAddrMasks, icmp_statistics.IcmpOutAddrMaskReps);
  218.     
  219.     len += sprintf (buffer + len,
  220.         "Tcp: RtoAlgorithm RtoMin RtoMax MaxConn ActiveOpens PassiveOpens AttemptFails EstabResets CurrEstab InSegs OutSegs RetransSegs\n"
  221.         "Tcp: %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu\n",
  222.             tcp_statistics.TcpRtoAlgorithm, tcp_statistics.TcpRtoMin,
  223.             tcp_statistics.TcpRtoMax, tcp_statistics.TcpMaxConn,
  224.             tcp_statistics.TcpActiveOpens, tcp_statistics.TcpPassiveOpens,
  225.             tcp_statistics.TcpAttemptFails, tcp_statistics.TcpEstabResets,
  226.             tcp_statistics.TcpCurrEstab, tcp_statistics.TcpInSegs,
  227.             tcp_statistics.TcpOutSegs, tcp_statistics.TcpRetransSegs);
  228.         
  229.     len += sprintf (buffer + len,
  230.         "Udp: InDatagrams NoPorts InErrors OutDatagrams\nUdp: %lu %lu %lu %lu\n",
  231.             udp_statistics.UdpInDatagrams, udp_statistics.UdpNoPorts,
  232.             udp_statistics.UdpInErrors, udp_statistics.UdpOutDatagrams);        
  233. /*    
  234.       len += sprintf( buffer + len,
  235.           "TCP fast path RX:  H2: %ul H1: %ul L: %ul\n",
  236.               tcp_rx_hit2,tcp_rx_hit1,tcp_rx_miss);
  237. */
  238.     
  239.     if (offset >= len)
  240.     {
  241.         *start = buffer;
  242.         return 0;
  243.     }
  244.     *start = buffer + offset;
  245.     len -= offset;
  246.     if (len > length)
  247.         len = length;
  248.     return len;
  249. }
  250.  
  251.