Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <unistd.h>
  5. #include <inttypes.h>
  6. #include <errno.h>
  7. #include "umka.h"
  8. #include "trace.h"
  9. #include "vnet.h"
  10.  
  11. typedef struct {
  12.     int fd;
  13. } vnet_userdata_t;
  14.  
  15. net_device_t *vnet_init(int fd) {
  16. //    printf("vnet_init\n");
  17.     vnet_userdata_t *u = (vnet_userdata_t*)malloc(sizeof(vnet_userdata_t));
  18.     u->fd = fd;
  19.  
  20.     net_device_t *vnet = (net_device_t*)malloc(sizeof(net_device_t));
  21.     *vnet = (net_device_t){
  22.              .device_type = NET_TYPE_ETH,
  23.              .mtu = 1514,
  24.              .name = "UMK0770",
  25.  
  26.              .unload = vnet_unload,
  27.              .reset = vnet_reset,
  28.              .transmit = vnet_transmit,
  29.  
  30.              .bytes_tx = 0,
  31.              .bytes_rx = 0,
  32.              .packets_tx = 0,
  33.              .packets_rx = 0,
  34.  
  35.              .link_state = ETH_LINK_FD + ETH_LINK_10M,
  36.              .hwacc = 0,
  37.              .mac = {0x80, 0x2b, 0xf9, 0x3b, 0x6c, 0xca},
  38.  
  39.              .userdata = u,
  40.     };
  41.  
  42.     return vnet;
  43. }
  44.  
  45. STDCALL void
  46. vnet_unload() {
  47.     printf("vnet_unload\n");
  48.     COVERAGE_OFF();
  49.     COVERAGE_ON();
  50. }
  51.  
  52. STDCALL void
  53. vnet_reset() {
  54.     printf("vnet_reset\n");
  55.     COVERAGE_OFF();
  56.     COVERAGE_ON();
  57. }
  58.  
  59. static void dump_net_buff(net_buff_t *buf) {
  60.     for (size_t i = 0; i < buf->length; i++) {
  61.         printf("%2.2x ", buf->data[i]);
  62.     }
  63.     putchar('\n');
  64. }
  65.  
  66. STDCALL int
  67. vnet_transmit(net_buff_t *buf) {
  68.     net_device_t *vnet;
  69.     __asm__ __inline__ __volatile__ (
  70.         "nop"
  71.         : "=b"(vnet)
  72.         :
  73.         : "memory");
  74.  
  75.     vnet_userdata_t *u = vnet->userdata;
  76.     printf("vnet_transmit: %d bytes\n", buf->length);
  77.     dump_net_buff(buf);
  78.     write(u->fd, buf->data, buf->length);
  79.     buf->length = 0;
  80.     COVERAGE_OFF();
  81.     COVERAGE_ON();
  82.     printf("vnet_transmit: done\n");
  83.     return 0;
  84. }
  85.  
  86. void vnet_receive_frame(net_device_t *dev, void *data, size_t size) {
  87.     net_buff_t *buf = kos_net_buff_alloc(size + offsetof(net_buff_t, data));
  88.     if (!buf) {
  89.         fprintf(stderr, "[vnet] Can't allocate network buffer!\n");
  90.         return;
  91.     }
  92.     buf->length = size;
  93.     buf->device = dev;
  94.     buf->offset = offsetof(net_buff_t, data);
  95.     memcpy(buf->data, data, size);
  96.     __asm__ __inline__ __volatile__ (
  97.         "pushad;"
  98.         "lea    ecx, 1f;"
  99.         "push   ecx;"
  100.         "push   eax;"
  101.         "jmp    kos_eth_input;"
  102.         "1:"
  103.         "popad"
  104.         :
  105.         : "a"(buf)
  106.         : "memory", "ecx");
  107. }
  108.