Re: Creating a routing program - the basics

"Steve Graegert" <[email protected]>
Newsgroups org.kernel.vger.linux-c-programming
Message-ID <[email protected]>
On 10/23/07, Mateus Interciso <[email protected]> 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 [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.