All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mateus Interciso <p.zarnick@gmail.com>
To: linux-c-programming@vger.kernel.org
Subject: Re: Creating a routing program - the basics
Date: Tue, 23 Oct 2007 14:13:22 +0000 (UTC)	[thread overview]
Message-ID: <ffkvi1$io8$8@ger.gmane.org> (raw)
In-Reply-To: 6a00c8d50710230656t45faf16cg9c732eee13063a47@mail.gmail.com

On Tue, 23 Oct 2007 15:56:22 +0200, Steve Graegert wrote:

> On 10/23/07, Mateus Interciso <p.zarnick@gmail.com> wrote:
>> On Tue, 23 Oct 2007 13:15:11 +0200, Steve Graegert wrote:
>>
>> > On 10/23/07, Mateus Interciso <p.zarnick@gmail.com> wrote:
>> >> Hello, I'm currently on university, and for my graduation paper,
>> >> I'll be implementing a routing algorythm, by hand, in C. The routing
>> >> 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 that
>> >> 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 <iostream>
>> > #include <stdio.h>
>> > #include <netdb.h>
>> > #include <netinet/if_ether.h>
>> >
>> > int read_mac(void) {
>> >       int sock, sockfd, n, cnt;
>> >       char buffer[2048];
>> >       unsigned char *iphead, *ethhead;
>> >       struct ether_addr ether;
>> >
>> >       if ((sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP))) < 0)
>> >       {
>> >               perror("socket");
>> >               exit(1);
>> >       }
>> >
>> >       while (1) {
>> >               if ((n = recvfrom(sock, buffer, 2048, 0, NULL, NULL))
>> >               ==
>> -1) {
>> >                       perror("recvfrom");
>> >                       close(sock);
>> >                       exit(1);
>> >               }
>> >
>> >               ethhead = (unsigned char *)buffer;
>> >
>> >               if (ethhead != NULL) {
>> >                       iphead = (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 == 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 = 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 network
>> > programming.  Otherwise you'll be asking a lot of theses questions in
>> > the future.  Anyway, hope this helps.
>> >
>> >       \Steve
>> >
>> > --
>> >
>> > Steve Grägert
>> > 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 do
>> that stuff?
> 
> I can't make any recommendations beyond the well-known programming books
> like Steven's UNP and O'Reilly's "Understanding the Linux Kernel". 
> Additionally, you may find Sams Publishing 's "Linux(R) Socket
> Programming" (0672319357) useful.
> 
> 	\Steve
> 
> --
> 
> Steve Grägert
> 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, I'll take a look at those books :D

Mateus

-
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

  reply	other threads:[~2007-10-23 14:13 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-10-23 10:44 Creating a routing program - the basics Mateus Interciso
2007-10-23 11:15 ` Steve Graegert
2007-10-23 12:11   ` Mateus Interciso
2007-10-23 13:56     ` Steve Graegert
2007-10-23 14:13       ` Mateus Interciso [this message]
2007-11-02 18:28         ` J.

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='ffkvi1$io8$8@ger.gmane.org' \
    --to=p.zarnick@gmail.com \
    --cc=linux-c-programming@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.