[prev in list] [next in list] [prev in thread] [next in thread]
List: hurd-bug
Subject: Re: oskit-mach & oskit-20010214: network
From: Daniel Wagner <wagi () gmx ! ch>
Date: 2001-08-28 22:46:06
[Download RAW message or body]
On Mon, 27 Aug 2001, Daniel Wagner wrote:
> I will write such a small test program and post here when I think I got
> it right.
Alright here is my first attempt. After reading some other small
programs it was almost easy to figure out how mach works. I hope it is
not a total mess.
wagi
----------------------- xmit-test.c -----------------------
#include <mach/kern_return.h>
#include <mach/port.h>
#include <assert.h>
#include <hurd.h>
/*
Ethernet (a.k.a. Ethernet II)
+---------+---------+---------+----------
| Dst | Src | Type | Data...
+---------+---------+---------+----------
<-- 6 --> <-- 6 --> <-- 2 --> <-46-1500->
Type 0x80 0x00 = TCP/IP
Type 0x06 0x00 = XNS
Type 0x81 0x37 = Novell NetWare
*/
/* Ethernet Version II Frame Format */
struct _ethernet_packet {
unsigned char da[6];
unsigned char sa[6];
unsigned char ethertype[2];
unsigned char data[46];
unsigned long fcs;
} ethernet_packet;
int
main (int argc, char **argv)
{
kern_return_t err;
device_t master_device,ether_port;
u_int count, len;
char *name = "eth0";
int i;
/* get the port rights */
err = get_privileged_ports (0, &master_device);
if (err)
return 1;
err = device_open (master_device, D_WRITE, name, ðer_port);
mach_port_deallocate (mach_task_self (), master_device);
if (err)
return 1;
/* construct one ethernet packet */
/* destination mac adress */
ethernet_packet.da[0] = 0x00;
ethernet_packet.da[1] = 0x00;
ethernet_packet.da[2] = 0xB4;
ethernet_packet.da[3] = 0x55;
ethernet_packet.da[4] = 0x49;
ethernet_packet.da[5] = 0xCC;
/* source mac adress */
ethernet_packet.sa[0] = 0x00;
ethernet_packet.sa[1] = 0x00;
ethernet_packet.sa[2] = 0xB4;
ethernet_packet.sa[3] = 0xA4;
ethernet_packet.sa[4] = 0x64;
ethernet_packet.sa[5] = 0xF4;
/* type of service, a faked one */
ethernet_packet.ethertype[0] = 0x12;
ethernet_packet.ethertype[1] = 0x34;
/* init the payload */
for (i=0; i<46; i++) {
ethernet_packet.data[i] = 0x0;
}
len = sizeof (struct _ethernet_packet);
ethernet_packet.fcs = 0x0;
for (i=0; i<10; i++)
{
err = device_write (ether_port, D_NOWAIT, 0, ðernet_packet, len, &count);
assert_perror (err);
assert (count == len);
}
mach_port_deallocate (mach_task_self (), ether_port);
return 0;
}
--
Daniel Wagner
email: wagi@gmx.ch
GnuPG: 1024D/DCDE890A (public key available on any keyserver)
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic