From mboxrd@z Thu Jan 1 00:00:00 1970 From: Mateus Interciso Subject: Re: Creating a routing program - the basics Date: Tue, 23 Oct 2007 14:13:22 +0000 (UTC) Message-ID: References: <6a00c8d50710230415o3a3b0e47x3cb85b14f2128b90@mail.gmail.com> <6a00c8d50710230656t45faf16cg9c732eee13063a47@mail.gmail.com> Mime-Version: 1.0 Content-Transfer-Encoding: QUOTED-PRINTABLE Return-path: Sender: linux-c-programming-owner@vger.kernel.org List-Id: Content-Type: text/plain; charset="utf-8" To: linux-c-programming@vger.kernel.org On Tue, 23 Oct 2007 15:56:22 +0200, Steve Graegert wrote: > On 10/23/07, Mateus Interciso wrote: >> On Tue, 23 Oct 2007 13:15:11 +0200, Steve Graegert wrote: >> >> > On 10/23/07, Mateus Interciso wrote: >> >> Hello, I'm currently on university, and for my graduation paper, >> >> I'll be implementing a routing algorythm, by hand, in C. The rout= ing >> >> algorythm itself is not easy, but one of the starting parts of it= , >> >> is to find a way of discovering the MAC that it is currently >> >> connected to, maybe is bether if I draw, since I'm not really tha= t >> >> good in english: >> >> >> >> [PC with n NICs]-----(n cables)---->[n PCs] >> >> >> >> I have full control of the first PC, of course, since is the one = I'm >> >> implementing the router, so I do know the MAC of it, but how to >> >> discover the MAC on the other end of the n lines, so I can start >> >> sending packets? >> > >> > Probably this is a starting point: (not tested) >> > >> > ___ BEGIN SOURCE ___ >> > >> > #include >> > #include >> > #include >> > #include >> > >> > int read_mac(void) { >> > int sock, sockfd, n, cnt; >> > char buffer[2048]; >> > unsigned char *iphead, *ethhead; >> > struct ether_addr ether; >> > >> > if ((sock =3D socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP))) = < 0) >> > { >> > perror("socket"); >> > exit(1); >> > } >> > >> > while (1) { >> > if ((n =3D recvfrom(sock, buffer, 2048, 0, NULL, NUL= L)) >> > =3D=3D >> -1) { >> > perror("recvfrom"); >> > close(sock); >> > exit(1); >> > } >> > >> > ethhead =3D (unsigned char *)buffer; >> > >> > if (ethhead !=3D NULL) { >> > iphead =3D (unsigned char *)(buffer + 14); /= / >> > Skip >> Ethernet header >> > printf("Peer MAC: " >> > "%02x:%02x:%02x:%02x:%02x:%02x\n", >> > ethhead[0], ethhead[1], ethhead[2], >> > ethhead[3], ethhead[4], ethhead[5]); >> > printf("Source MAC: " >> > "%02x:%02x:%02x:%02x:%02x:%02x\n", >> > ethhead[6], ethhead[7], ethhead[8], >> > ethhead[9], ethhead[10], ethhead[11]= ); >> > >> > if (*iphead =3D=3D 0x45) { // Check for IPv4= , no >> options present >> > printf("Peer IP: %d.%d.%d.%d\n", >> > iphead[12], iphead[13], >> > iphead[14], iphead[15]); >> > printf("Source IP: %d.%d.%d.%d\n", >> > iphead[16], iphead[17], >> > iphead[18], iphead[19]); >> > printf("Protocol (UDP =3D 11): %02x >> > Hex\n", >> iphead[9]); >> > } >> > } >> > } >> > >> > return 0; >> > } >> > >> > >> > int main(int argc, char **argv) { >> > read_mac(); >> > return EXIT_SUCCESS; >> > } >> > >> > ___ END SOURCE ___ >> > >> > Honestly, you should make yourself acquainted with low-level netwo= rk >> > programming. Otherwise you'll be asking a lot of theses questions= in >> > the future. Anyway, hope this helps. >> > >> > \Steve >> > >> > -- >> > >> > Steve Gr=C3=A4gert >> > DigitalEther.de >> > - >> > To unsubscribe from this list: send the line "unsubscribe >> > linux-c-programming" in the body of a message to >> > majordomo@vger.kernel.org More majordomo info at >> > http://vger.kernel.org/majordomo-info.html >> >> Thank you, this will help. >> Do you have any book/site where I can take a deep look into how to d= o >> that stuff? >=20 > I can't make any recommendations beyond the well-known programming bo= oks > like Steven's UNP and O'Reilly's "Understanding the Linux Kernel".=20 > Additionally, you may find Sams Publishing 's "Linux(R) Socket > Programming" (0672319357) useful. >=20 > \Steve >=20 > -- >=20 > Steve Gr=C3=A4gert > DigitalEther.de > - > To unsubscribe from this list: send the line "unsubscribe > linux-c-programming" in the body of a message to > majordomo@vger.kernel.org More majordomo info at=20 > http://vger.kernel.org/majordomo-info.html Thank you, I'll take a look at those books :D Mateus - To unsubscribe from this list: send the line "unsubscribe linux-c-progr= amming" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html