linux-l: icmp address mask request

JSC schlegel at tfh-berlin.de
Sa Apr 14 18:36:44 CEST 2001


On Fri, Apr 13, 2001 at 02:39:19PM +0200, Jan-Benedict Glaw wrote:
> 
> Oh, oh, oh... Graue Vorzeit:-) Das Ger]t(TM) kann soch bestimmt bootp
> oder dhcp? Dann solltest Du ihm die Infos damit 'runterblasen. 'nen
> Server daf at r hab' ich ewige Zeiten nicht mehr gesehen (wurde fr at her
> sowohl In-Kernel als auf als Userspace-Programm benutzt). Heutzutage
> k[nnte man sowas mit den AF_PACKET sockets realisieren. Wenn so eine
> Anfrage 'reinkommt, dann iene Antwort generieren. Aber ic w@\te
> nicht, da\ der Linux-Kernel sowas selbst]ndig supported...
> 
das geraet kann sicherlich bootp/dhcp nur mit dieser software nicht. 
diese icmp funktionalitaet sollte lt. rfc jeder router haben, und
lt. boot mechanismus der sun eben jede sun. 

leider ist mein rechner netz hier massiv heterogen. nicht eine architektur
doppelt. daher die idee, die sun vom linux laptop aus zu installieren.

bisher gibt es da nur 2 probleme:
1.) wenn der kernel per tftp beosrgt und gebootet wurde, setzt der 
    knallkopp die netzmaske klassenspezifisch. bei mir: 10.0.1.4
    netmask 255.0.0.0
    linux (10.0.1.1/255.255.255.0) regiert nun auf den broadcast 
    10.255.255.255 nicht. bisher hab ich bei linux auch die 255.0.0.0
    netmaske gesetzt. kennt jemand was cleveres ?
2.) die bloede sun bleibt bei "Configuring devices..." nach absenden
    des "icmp address mask request" einfach stehen. nach dauerhaftem
    anpingen des rechners, macht er irgendwann weiter. dieses phaenomen
    wollte ich durch diesen icmp daemon beheben ...

hab mir jetzt einen daemon gebaut (aus hacktools rausgebastelt), der 
irgendwie nicht funktioniert. der daemon bekommt das packet und
schickt auch die antwort raus. leider zeigt ethereal das antwortpacket
nicht.

output: ./main 1>1.txt 
raised.
src now: 10.0.1.1
dst now: 10.0.1.4
sendto(10.0.1.4) 32 bytes

ethereal:
[4 minuten intensive netzaktivitaet]
10.0.1.4 -> 10.0.1.1 icmp address mask request
10.0.1.1 -> 10.0.1.4 arp  who has 10.0.1.4? tell 10.0.1.1
10.0.1.4 -> 10.0.1.1 arp  10.0.1.4 is at 08:00:20:..:..:..

mein rechner versucht also zu senden, holt sich sogar die mac-adresse.

und hier der code:
#include <sys/socket.h>
#include <netinet/ip.h>
#include <stdio.h>
#include <errno.h>

#ifdef SOLARIS         /* Maximum packet size */
#define SIZE_BIG 65535
#else
#define SIZE_BIG 75000
#endif

int main(){
  int sock;
  int on = 1;
   sock = socket(AF_INET, SOCK_RAW, 1 /* getprotobyname("icmp") */ );
   if( sock < 0 ){
      fprintf(stderr,"socket() error\n");
      exit(2);
   }
   if( setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char *)&on,sizeof(on)) == -1 )
      fprintf(stderr,"setsockopt(sock,IPPROTO_IP,IP_HDRINCL,..) failed.\n");

   while(1){
     char buf_rcv[SIZE_BIG];
     struct sockaddr_in origen;
     int addrlen = sizeof(struct sockaddr_in);

      /* read icmp */
      { int len;
         memset( buf_rcv, 0, SIZE_BIG );
         len = recvfrom(sock,buf_rcv,sizeof(buf_rcv),0,&origen,&addrlen);
         if( len < 0 ){
            fprintf(stderr,"recvfrom error\n");
            exit(2);
         }
         write(1,buf_rcv,len);
         write(1,"\n",1);
      }
      /* write icmp */
      if( buf_rcv[20] == 17 /* address mask request */ ){
        char buf_snd[SIZE_BIG];
        int icmp_msg_len = 12;
        struct ip *iph = (struct ip *)&buf_snd;
        int n;
fprintf(stderr,"raised.\n");
         /* ip header */
         iph->ip_hl  = 20 >> 2;          /* 20 bytes header [x * 32 bit] */
         iph->ip_v   = 4;                        /* ip version: 4 */
         iph->ip_tos = 0;                        /* type of service */
         iph->ip_len = htons(20 + icmp_msg_len); /* total length */
         iph->ip_id  = htons(0x3372);            /* id */
         iph->ip_off = IP_DF | 0;                /* don't fragment,
                                                    no more fragments,
                                                    fragm. offset: 0 */
         iph->ip_ttl = 2;                        /* ttl */
         iph->ip_p   = IPPROTO_ICMP;             /* protocol */
         iph->ip_sum = 0;             /* checksum: linux kernel fills autom. */
         memcpy(&iph->ip_src,&buf_rcv[16],4);     /* dst -> now: src */
fprintf(stderr,"src now: %d.%d.%d.%d\n",buf_snd[12],buf_snd[13],buf_snd[14],buf_snd[15]);
         memcpy(&iph->ip_dst,&buf_rcv[12],4);     /* src -> now: dst */
fprintf(stderr,"dst now: %d.%d.%d.%d\n",buf_snd[16],buf_snd[17],buf_snd[18],buf_snd[19]);
         /* icmp message */
         buf_snd[20] = 18;           /* address mask reply */
         buf_snd[21] = 0;            /* code: 0 */
         (short)buf_snd[22] = 0;     /* checksum */
         (short)buf_snd[24] = 0;     /* id */
         (short)buf_snd[26] = 0;     /* sequence number */
         buf_snd[28] = 0xff;         /* netmask */
         buf_snd[29] = 0xff;
         buf_snd[30] = 0xff;
         buf_snd[31] = 0x00;
         n = sendto(sock,buf_snd,20+icmp_msg_len,0,&origen,addrlen);
         if( n < 0 ){
            fprintf(stderr,"sendto() failed: %s (%d)\n",strerror(errno),errno);
         }else{
            fprintf(stderr,"sendto(%s) %d bytes\n",inet_ntoa(origen.sin_addr),n);
         }
      }
   }
   exit(0);
}

gruss
Jens
-- 
 --------------------------------------------------------------
| Jens Schlegel                                                |
| TFH Berlin         email: schlegel at tfh-berlin.de             |
 --------------------------------------------------------------



Mehr Informationen über die Mailingliste linux-l