Date: Thu, 05 Feb 1998 00:23:20 +0100 (CET) From: Jaroslav Klaus <J.Klaus@sh.cvut.cz> To: freebsd-questions@FreeBSD.ORG Subject: IPX RAW socket Message-ID: <XFMail.980205002320.J.Klaus@sh.cvut.cz>
next in thread | raw e-mail | index | archive | help
This message is in MIME format --_=XFMail.1.2.p0.FreeBSD:980205002316:9663=_ Content-Type: text/plain; charset=iso-8859-2 Content-Transfer-Encoding: quoted-printable Hello, I'd like to send IPX type20 packet. I've writen a small prg but sendto returns errno=3D56. Is IPX RAW socket implemented in FBSD2.2? Can anybody h= elp me with it? I attached my program in this mail. I started it by this way: %./ipx 0x337130.0x00:00:b4:72:aa:83.0x5500 0.0:00:12:34:56:78.0x5520 couldn't send packet 0.12345678H.5520H : 337130H.b472aa83.5500H -> 0.12345678H.5520H 56: unknown error And another Q. In ports is there any tool for sending data to network iface= ? I need resend some ethernet packet captured by 'tcpdump -w <file>'. Thank you, -- Jarda --_=XFMail.1.2.p0.FreeBSD:980205002316:9663=_ Content-Disposition: attachment; filename="ipx.c" Content-Transfer-Encoding: 7bit Content-Description: ipx.c Content-Type: text/plain; charset=us-ascii; name=ipx.c; SizeOnDisk=3841 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/errno.h> #include <netdb.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netipx/ipx.h> #define IPX_DATA_LEN 20 #define IPXPROTO_NETBIOS 20 u_short checksum(u_short * data,u_short length) { register long value; u_short i; for(i=0;i<(length>>1);i++) value+=data[i]; if((length&1)==1) value+=(data[i]<<8); value=(value&65535)+(value>>16); return(~value); } int main(int argc, char ** argv) { struct sockaddr_ipx sipx; int sock,err; char buffer[sizeof(struct ipx)+IPX_DATA_LEN]; struct ipx * ipxheader=(struct ipx *)buffer; struct ipx_addr addr; char src_addr[30]; char dst_addr[30]; char sck_addr[30]; if (argc<3) { fprintf(stderr,"usage: %s src_ipx_addr dst_ipx_addr\n",argv[0]); return (-1); } bzero(&sipx,sizeof(struct sockaddr_ipx)); sipx.sipx_family=AF_IPX; bzero(&buffer, sizeof(struct ipx)+IPX_DATA_LEN); ipxheader->ipx_len=sizeof(struct ipx)+IPX_DATA_LEN; ipxheader->ipx_tc =0; ipxheader->ipx_pt =IPXPROTO_NETBIOS; addr=ipx_addr(argv[2]); bcopy(&addr, &sipx.sipx_addr, sizeof(struct ipx_addr)); bcopy(&addr,&ipxheader->ipx_dna, sizeof(struct ipx_addr)); addr=ipx_addr(argv[1]); bcopy(&addr,&ipxheader->ipx_sna, sizeof(struct ipx_addr)); ipxheader->ipx_sum=0;//checksum((u_short *)ipxheader, sizeof(struct ipx) ); if ((sock=socket(PF_IPX,SOCK_RAW,IPXPROTO_RAW))==-1) { fprintf(stderr,"couldn't allocate raw socket\n"); return (-1); } sprintf(sck_addr,"%s",ipx_ntoa(sipx.sipx_addr)); sprintf(src_addr,"%s",ipx_ntoa(ipxheader->ipx_sna)); sprintf(dst_addr,"%s",ipx_ntoa(ipxheader->ipx_dna)); if((err=sendto(sock, buffer, sizeof(struct ipx)+IPX_DATA_LEN, 0, (struct sockad dr *) &sipx, sizeof(struct sockaddr_ipx)))==-1) { fprintf(stderr,"couldn't send packet\n"); fprintf(stderr,"%s : %s -> %s\n",sck_addr,src_addr,dst_addr); switch(errno) { case EBADF: { fprintf(stderr,"EBADF\n"); break; } case EACCES: { fprintf(stderr,"EACCES\n"); break;} case ENOTSOCK: { fprintf(stderr,"ENOTSOCK\n");break;} case EFAULT: { fprintf(stderr,"EFAULT\n"); break;} case EMSGSIZE: { fprintf(stderr,"EMSGSIZE\n"); break;} case EAGAIN: { fprintf(stderr,"EAGAIN\n"); break;} case ENOBUFS: { fprintf(stderr,"ENOBUFS\n"); break;} case EHOSTUNREACH: { fprintf(stderr,"EHOSTUNREACH\n"); break;} default: { fprintf(stderr,"%d: unknown error\n",errno); break;} } return (-1); } fprintf(stderr,"IPX packet was sent:\n%s : %s -> %s\n",sck_addr,src_addr,dst_ad dr); return (0); } --_=XFMail.1.2.p0.FreeBSD:980205002316:9663=_-- End of MIME message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?XFMail.980205002320.J.Klaus>