Procházet zdrojové kódy

system: BDatagram_unix: recognize packet socket addresses for received packets

ambrop7 před 14 roky
rodič
revize
1a05802144
1 změnil soubory, kde provedl 36 přidání a 0 odebrání
  1. 36 0
      system/BDatagram_unix.c

+ 36 - 0
system/BDatagram_unix.c

@@ -24,6 +24,7 @@
 #define _GNU_SOURCE
 #endif
 
+#include <stddef.h>
 #include <string.h>
 #include <unistd.h>
 #include <errno.h>
@@ -154,6 +155,41 @@ static void addr_sys_to_socket (BAddr *out, struct sys_addr addr)
             BAddr_InitIPv6(out, addr.addr.ipv6.sin6_addr.s6_addr, addr.addr.ipv6.sin6_port);
         } break;
         
+        case AF_PACKET: {
+            if (addr.len < offsetof(struct sockaddr_ll, sll_addr) + 6) {
+                goto fail;
+            }
+            if (addr.addr.packet.sll_hatype != 1) { // linux/if_arp.h: #define ARPHRD_ETHER 1
+                goto fail;
+            }
+            int packet_type;
+            switch (addr.addr.packet.sll_pkttype) {
+                case PACKET_HOST:
+                    packet_type = BADDR_PACKET_PACKET_TYPE_HOST;
+                    break;
+                case PACKET_BROADCAST:
+                    packet_type = BADDR_PACKET_PACKET_TYPE_BROADCAST;
+                    break;
+                case PACKET_MULTICAST:
+                    packet_type = BADDR_PACKET_PACKET_TYPE_MULTICAST;
+                    break;
+                case PACKET_OTHERHOST:
+                    packet_type = BADDR_PACKET_PACKET_TYPE_OTHERHOST;
+                    break;
+                case PACKET_OUTGOING:
+                    packet_type = BADDR_PACKET_PACKET_TYPE_OUTGOING;
+                    break;
+                default:
+                    goto fail;
+            }
+            if (addr.addr.packet.sll_halen != 6) {
+                goto fail;
+            }
+            uint8_t *mac = addr.addr.packet.sll_addr;
+            BAddr_InitPacket(out, addr.addr.packet.sll_protocol, addr.addr.packet.sll_ifindex, BADDR_PACKET_HEADER_TYPE_ETHERNET, packet_type, addr.addr.packet.sll_addr);
+        } break;
+        
+        fail:
         default: {
             BAddr_InitNone(out);
         } break;