Re: Creating a routing program - the basics

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 10/23/07, Mateus Interciso <p.zarnick@xxxxxxxxx> 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@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Assembler]     [Git]     [Kernel List]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [C Programming]     [Yosemite Campsites]     [Yosemite News]     [GCC Help]

  Powered by Linux