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