Mercurial > archived > louis > epitech > mq > rathaxes
view e1000_implement_the_frame_transmission_chunk.patch @ 84:6432998a8245
Finish the patches on the rx/tx init and wip on the actual tx
author | Louis Opter <louis@lse.epitech.net> |
---|---|
date | Mon, 09 Jul 2012 06:44:51 +0200 |
parents | 27f0e70df342 |
children | 5dda73e7d728 |
line wrap: on
line source
# HG changeset patch # Parent 72f11dd4265bb367278f34b23ecb5afa0f7f6fb7 rathaxes: start to queue up packets in the TX ring on the e1000 sample diff --git a/maintainers/CMakeScripts/Templates/MakefileLKM.in b/maintainers/CMakeScripts/Templates/MakefileLKM.in --- a/maintainers/CMakeScripts/Templates/MakefileLKM.in +++ b/maintainers/CMakeScripts/Templates/MakefileLKM.in @@ -1,6 +1,6 @@ # Disable this "coding-style" warning (seriously, you have to compile with # -pedantic to get it...) -EXTRA_CFLAGS = -Wno-declaration-after-statement +EXTRA_CFLAGS = -Wno-declaration-after-statement -std=gnu99 KDIR = /lib/modules/$(shell uname -r)/build obj-m := @LKM_OBJECTS@ diff --git a/rathaxes/samples/e1000/e1000.blt b/rathaxes/samples/e1000/e1000.blt --- a/rathaxes/samples/e1000/e1000.blt +++ b/rathaxes/samples/e1000/e1000.blt @@ -964,4 +964,20 @@ } } } + + template sequence e1000::xmit(Ethernet::Device ctx, Socket::SKBuff skb) + { + chunk ::CALL() + { + (void)1; // Issue 10 + /* + * Put packets on the TX ring, must return NETDEV_TX_OK or + * NETDEV_TX_BUSY. + */ + { + ${Log::info("xmit: skbuff details:")}; + ${skb.dump_infos()}; + } + } + } } diff --git a/rathaxes/samples/e1000/e1000.rti b/rathaxes/samples/e1000/e1000.rti --- a/rathaxes/samples/e1000/e1000.rti +++ b/rathaxes/samples/e1000/e1000.rti @@ -109,6 +109,11 @@ provided chunk ::CALL(); } + provided sequence xmit(Ethernet::Device, Socket::SKBuff) + { + provided chunk ::CALL(); + } + provided sequence register_read32(e1000::Context, e1000::Register) { provided chunk LKM::prototypes(); diff --git a/rathaxes/samples/e1000/ethernet.blt b/rathaxes/samples/e1000/ethernet.blt --- a/rathaxes/samples/e1000/ethernet.blt +++ b/rathaxes/samples/e1000/ethernet.blt @@ -1,6 +1,51 @@ with Ethernet, PCI, LKM, Log { - template type Ethernet::Net() + template type Ethernet::ProtocolId() + { + chunk LKM::prototypes() + { + static const char *rtx_ethernet_protocol_id_to_str(unsigned short); + } + + chunk LKM::data() + { + static const struct + { + const unsigned short id; + const char *name; + } rtx_ethernet_proto_table[] = + { + { ETH_P_IP, "IPv4" }, + { ETH_P_IPV6, "IPv6" }, + { ETH_P_ARP, "ARP" }, + }; + } + + chunk LKM::code() + { + static const char *rtx_ethernet_protocol_id_to_str(unsigned short proto_id) + { + for (int i = 0; + i != sizeof(rtx_ethernet_proto_table[0]) / sizeof(rtx_ethernet_proto_table); + i++) + if (proto_id == rtx_ethernet_proto_table[i].id) + return rtx_ethernet_proto_table[i].name; + + return "Other"; + } + } + + chunk to_str() + { + rtx_ethernet_protocol_id_to_str(${self}); + } + + map + { + } + } + + template type Ethernet::AbstractDevice() { chunk LKM::includes() { @@ -17,11 +62,6 @@ } } - /* - * Unlike PCI::Device, Ethernet::Device doesn't match the struct net_device - * from Linux. Ethernet::Device is the type that we use in the private - * field of the struct net_device. - */ template type Ethernet::Device() { chunk LKM::includes() @@ -52,7 +92,7 @@ } *rtx_ethernet_dev_p; } - chunk ::init(Ethernet::Net net_dev, PCI::Device pci_dev) + chunk ::init(Ethernet::AbstractDevice net_dev, PCI::Device pci_dev) { ${self} = netdev_priv(${net_dev}); /* diff --git a/rathaxes/samples/e1000/ethernet.rti b/rathaxes/samples/e1000/ethernet.rti --- a/rathaxes/samples/e1000/ethernet.rti +++ b/rathaxes/samples/e1000/ethernet.rti @@ -1,11 +1,28 @@ interface Ethernet : Socket, PCI, LKM { - provided type Net + provided type ProtocolId + { + chunk LKM::prototypes(); + chunk LKM::data(); + chunk LKM::code(); + method ::to_str(); + } + + /* + * This is the abstract type used by the Kernel to represent an ethernet + * device. + */ + provided type AbstractDevice { chunk LKM::includes(); chunk ::decl(); } + /* + * Unlike PCI::Device, Ethernet::Device doesn't match the struct net_device + * from Linux. Ethernet::Device is the type that we use in the private + * field of the struct net_device. + */ provided type Device { chunk LKM::includes(); diff --git a/rathaxes/samples/e1000/lkm.rtx b/rathaxes/samples/e1000/lkm.rtx --- a/rathaxes/samples/e1000/lkm.rtx +++ b/rathaxes/samples/e1000/lkm.rtx @@ -46,6 +46,7 @@ Ethernet::send(Ethernet::Device dev, Socket::SKBuff skb) { Log::info("we have one packet to transmit!"); + e1000::xmit(dev, skb); } LKM::init() diff --git a/rathaxes/samples/e1000/socket.blt b/rathaxes/samples/e1000/socket.blt --- a/rathaxes/samples/e1000/socket.blt +++ b/rathaxes/samples/e1000/socket.blt @@ -1,4 +1,4 @@ -with Socket, LKM +with Socket, LKM, Ethernet { template type Socket::SKBuff() { @@ -17,6 +17,32 @@ { } + chunk ::dump_infos() + { + /* + * We should use a Rathaxes log abstraction instead of pr_info here, + * but Rathaxes doesn't support functions with a variable number of + * arguments yet. + */ + unsigned short ethernet_proto = be16_to_cpu(${self}->protocol); + ${cast local.ethernet_proto as Ethernet::ProtocolId}; + + pr_info( + "\tprotocol = %#-5x (%s)\n" + "\t len = %-5u data_len = %-5u head_len = %-5u\n" + "\tnr_frags = %u\n" + "\tgso_size = %-5u gso_segs = %-5u gso_type = %-5u\n", + ethernet_proto, "", // XXX: ${local.ethernet_proto.to_str()}, + ${self}->len, + ${self}->data_len, + skb_headlen(${self}), + skb_shinfo(${self})->nr_frags, + skb_shinfo(${self})->gso_size, + skb_shinfo(${self})->gso_segs, + skb_shinfo(${self})->gso_type + ); + } + map { // some work may have to be done here in order diff --git a/rathaxes/samples/e1000/socket.rti b/rathaxes/samples/e1000/socket.rti --- a/rathaxes/samples/e1000/socket.rti +++ b/rathaxes/samples/e1000/socket.rti @@ -1,8 +1,10 @@ interface Socket : LKM { - provided type Socket::SKBuff { - chunk LKM::includes(); - chunk ::decl(); - method ::init(); + provided type Socket::SKBuff + { + chunk LKM::includes(); + chunk ::decl(); + method ::init(); + method ::dump_infos(); } }