devif: udp queue simplified creation
authorRoni Häcki <roni.haecki@inf.ethz.ch>
Thu, 24 Aug 2017 13:54:45 +0000 (15:54 +0200)
committerRoni Häcki <roni.haecki@inf.ethz.ch>
Thu, 24 Aug 2017 13:54:45 +0000 (15:54 +0200)
- got src mac from hardware queue
- got src ip from dhcp service

Signed-off-by: Roni Häcki <roni.haecki@inf.ethz.ch>

include/devif/backends/net/ip.h
include/devif/backends/net/udp.h
lib/devif/backends/net/ip/devif_backend_ip.c
lib/devif/backends/net/udp/devif_backend_udp.c
usr/tests/devif/udp_queue.c

index 4849c6f..6c65ba2 100644 (file)
@@ -37,16 +37,13 @@ errval_t ip_destroy(struct ip_q* q);
  *                      the card_name will be initalized
  * @param qid          the id of the hardware queue (used for filters)
  * @param prot         The protocol that is running on top of IP
- * @param src_ip       Source IP
  * @param dst_ip       Destination IP
- * @param src_mac      Source MAC addressy              
  * @param dst_mac      Destination MAC address
  * @param interrupt    Interrupt handler
  * @param poll         If the queue is polled or should use interrupts             
  *
  */
 errval_t ip_create(struct ip_q** q, const char* card_name, uint64_t* qid,
-                   uint8_t prot, uint32_t src_ip, uint32_t dst_ip,
-                   struct eth_addr src_mac, struct eth_addr dst_mac,
+                   uint8_t prot, uint32_t dst_ip, struct eth_addr dst_mac, 
                    void(*interrupt)(void*), bool poll);
 #endif /* DEVIF_IP_H_ */
index 6380ef4..770cedb 100644 (file)
@@ -30,9 +30,7 @@ errval_t udp_destroy(struct udp_q* q);
  *                      the card_name will be initalized
  * @param src_port     UDP source port
  * @param dst_port     UPD destination port
- * @param src_ip       Source IP
  * @param dst_ip       Destination IP
- * @param src_mac      Source MAC addressy              
  * @param dst_mac      Destination MAC address
  * @param interrupt    Interrupt handler
  * @param poll         If the queue is polled or should use interrupts             
@@ -40,8 +38,7 @@ errval_t udp_destroy(struct udp_q* q);
  */
 errval_t udp_create(struct udp_q** q, const char* card_name, 
                     uint16_t src_port, uint16_t dst_port,
-                    uint32_t src_ip, uint32_t dst_ip,
-                    struct eth_addr src_mac, struct eth_addr dst_mac,
+                    uint32_t dst_ip, struct eth_addr dst_mac,
                     void(*interrupt)(void*), bool poll);
 /*
  * @brief  Writes into a buffer so that we still have space to add the headers
index d180b07..9117f2c 100644 (file)
@@ -21,6 +21,7 @@
 #include <net/net.h>
 #include <net/net_queue.h>
 #include <net/net_filter.h>
+#include <net/dhcp.h>
 #include "../../../queue_interface_internal.h"
 #include "../headers.h"
 
@@ -224,9 +225,8 @@ static errval_t ip_dequeue(struct devq* q, regionid_t* rid, genoffset_t* offset,
  *
  */
 errval_t ip_create(struct ip_q** q, const char* card_name, uint64_t* qid,
-                   uint8_t prot, uint32_t src_ip, uint32_t dst_ip,
-                   struct eth_addr src_mac, struct eth_addr dst_mac,
-                   inthandler_t interrupt, bool poll)
+                   uint8_t prot, uint32_t dst_ip,
+                   struct eth_addr dst_mac, inthandler_t interrupt, bool poll)
 {
     errval_t err;
     struct ip_q* que;
@@ -245,6 +245,18 @@ errval_t ip_create(struct ip_q** q, const char* card_name, uint64_t* qid,
         return err;
     }   
 
+    uint64_t src_mac;
+    err = devq_control(que->q, 0, 0, &src_mac);
+    if (err_is_fail(err)) {
+        return err;
+    }
+   
+    uint32_t src_ip;
+    err = net_config_current_ip_query(NET_FLAGS_BLOCKING_INIT, &src_ip);
+    if (err_is_fail(err)) {
+        return err;
+    }
+
     // fill in header that is reused for each packet
     // Ethernet
     memcpy(&(que->header.eth.dest.addr), &dst_mac, ETH_HWADDR_LEN);
@@ -258,7 +270,7 @@ errval_t ip_create(struct ip_q** q, const char* card_name, uint64_t* qid,
     que->header.ip._offset = htons(IP_DF);
     que->header.ip._proto = 0x11; // IP
     que->header.ip._ttl = 0x40; // 64
-    que->header.ip.src = htonl(src_ip);
+    que->header.ip.src = src_ip;
     que->header.ip.dest = htonl(dst_ip);
 
     que->my_q.f.reg = ip_register;
index d4495ea..1cc8181 100644 (file)
@@ -19,6 +19,7 @@
 #include <net_interfaces/flags.h>
 #include <net/net.h>
 #include <net/net_filter.h>
+#include <net/dhcp.h>
 #include "../../../queue_interface_internal.h"
 #include "../headers.h"
 
@@ -209,8 +210,7 @@ static errval_t udp_dequeue(struct devq* q, regionid_t* rid, genoffset_t* offset
  */
 errval_t udp_create(struct udp_q** q, const char* card_name, 
                     uint16_t src_port, uint16_t dst_port,
-                    uint32_t src_ip, uint32_t dst_ip,
-                    struct eth_addr src_mac, struct eth_addr dst_mac,
+                    uint32_t dst_ip, struct eth_addr dst_mac,
                     void(*interrupt)(void*), bool poll)
 {
     errval_t err;
@@ -218,10 +218,16 @@ errval_t udp_create(struct udp_q** q, const char* card_name,
     que = calloc(1, sizeof(struct udp_q));
     assert(que);
 
+    uint32_t src_ip;
+    err = net_config_current_ip_query(NET_FLAGS_BLOCKING_INIT, &src_ip);
+    if (err_is_fail(err)) {
+        return err;
+    }
+
     // init other queue
     uint64_t qid;
-    err = ip_create((struct ip_q**) &que->q, card_name, &qid, UDP_PROT, src_ip, dst_ip, 
-                    src_mac, dst_mac, interrupt, poll);
+    err = ip_create((struct ip_q**) &que->q, card_name, &qid, UDP_PROT, dst_ip, 
+                    dst_mac, interrupt, poll);
     if (err_is_fail(err)) {
         return err;
     }
@@ -231,6 +237,7 @@ errval_t udp_create(struct udp_q** q, const char* card_name,
         return err;
     }  
     
+    src_ip = htonl(src_ip);
     struct net_filter_ip ip = {
         .qid = qid,
         .ip_src = dst_ip,
@@ -266,6 +273,7 @@ errval_t udp_create(struct udp_q** q, const char* card_name,
     que->my_q.f.enq = udp_enqueue;
     que->my_q.f.deq = udp_dequeue;
     *q = que;
+
     return SYS_ERR_OK;
 }
 
index a1978f1..f9ada2d 100644 (file)
 #define RX_BUF_SIZE 2048
 
 static uint32_t ip_dst;
-static uint32_t ip_src;
-static uint64_t mac_src;
 static uint64_t mac_dst;
 static uint16_t port_src;
 static uint16_t port_dst;
-static struct eth_addr src_mac;
 static struct eth_addr dst_mac;
 
 static struct capref memory_rx;
@@ -132,13 +129,12 @@ static void test_udp(void)
     errval_t err;
     struct devq* q;
 
-    convert_mac(mac_src, &src_mac);
     convert_mac(mac_dst, &dst_mac);
 
    
     // create queue with interrupts
     udp_create(&udp_q, cardname, port_src, port_dst, 
-               ip_src, ip_dst, src_mac, dst_mac, event_cb, !use_interrupts);
+               ip_dst, dst_mac, event_cb, !use_interrupts);
 
     q = (struct devq*) udp_q;
 
@@ -272,16 +268,13 @@ int main(int argc, char *argv[])
         USER_PANIC("Frame mapping failed \n");
     }
 
-    if (argc > 7) {
+    if (argc > 5) {
         char* end;
-        ip_src = atoi(argv[1]);
-        ip_dst = atoi(argv[2]);
-        mac_src = strtoull(argv[3], &end, 10);
-        mac_dst = strtoull(argv[4], &end, 10);
-
-        port_src = atoi(argv[5]);
-        port_dst = atoi(argv[6]);
-        cardname = argv[7];
+        ip_dst = atoi(argv[1]);
+        mac_dst = strtoull(argv[2], &end, 10);
+        port_src = atoi(argv[3]);
+        port_dst = atoi(argv[4]);
+        cardname = argv[5];
     } else {
         USER_PANIC("NO src or dst IP given \n");
     }