help with struct

Just starting out? Need help? Post your questions and find answers here.
AndyMK
Enthusiast
Enthusiast
Posts: 582
Joined: Wed Jul 12, 2006 4:38 pm
Location: UK

help with struct

Post by AndyMK »

Hi, can someone help with creating a structure from

Code: Select all

struct net;

struct sockaddr_nl
{
        sa_family_t        nl_family;        /* AF_NETLINK        */
        unsigned short        nl_pad;                /* zero                */
        __u32                nl_pid;                /* port ID        */
               __u32                nl_groups;        /* multicast groups mask */
};

struct nlmsghdr
{
        __u32                nlmsg_len;        /* Length of message including header */
        __u16                nlmsg_type;        /* Message content */
        __u16                nlmsg_flags;        /* Additional flags */
        __u32                nlmsg_seq;        /* Sequence number */
        __u32                nlmsg_pid;        /* Sending process port ID */
};
taken from https://sites.uclouvain.be/SystInfo/usr ... ink.h.html

Thanks
infratec
Always Here
Always Here
Posts: 7599
Joined: Sun Sep 07, 2008 12:45 pm
Location: Germany

Re: help with struct

Post by infratec »

Maybe this works:

Code: Select all

Structure sockaddr_nl Align #PB_Structure_AlignC
  nl_family.u   ; AF_NETLINK
  nl_pad.u      ; zero
  nl_pid.l      ; port ID
  nl_groups.l   ; multicast groups mask
EndStructure

Structure nlmsghdr Align #PB_Structure_AlignC
  nlmsg_len.l   ; Length of message including header
  nlmsg_type.u  ; Message content
  nlmsg_flags.u ; Additional flags
  nlmsg_seq.l   ; Sequence number
  nlmsg_pid.l   ; Sending process port ID
EndStructure
AndyMK
Enthusiast
Enthusiast
Posts: 582
Joined: Wed Jul 12, 2006 4:38 pm
Location: UK

Re: help with struct

Post by AndyMK »

Thanks, ill try it out
mchael
User
User
Posts: 15
Joined: Mon Oct 14, 2019 7:31 am

Re: help with struct

Post by mchael »

why a struct? Why not a multi col array? Be faster and easier if working with a database or file structure.
User avatar
Josh
Addict
Addict
Posts: 1183
Joined: Sat Feb 13, 2010 3:45 pm

Re: help with struct

Post by Josh »

mchael wrote:why a struct? Why not a multi col array? Be faster and easier if working with a database or file structure.
What does an array have to do with a structure? Do you know why Andy needs the requested structure? I'm sorry mchael but you have no idea what you're talking about.
sorry for my bad english
AndyMK
Enthusiast
Enthusiast
Posts: 582
Joined: Wed Jul 12, 2006 4:38 pm
Location: UK

Re: help with struct

Post by AndyMK »

Josh wrote:
mchael wrote:why a struct? Why not a multi col array? Be faster and easier if working with a database or file structure.
What does an array have to do with a structure? Do you know why Andy needs the requested structure? I'm sorry mchael but you have no idea what you're talking about.
Thanks for your support josh. I was trying to get netfilter queue working in linux to create a userland bridge where i could inspect packets passing between two ethernet interfaces. In the end i went with AF_PACKET raw sockets. It currently passes 1Gbit/sec at around 10% cpu usage on a quad core i5 machine. I think most of the usage is in the kernal. Code below if anyone wants to experiment. You need two spare ethernet adapters and you will have to enter the index number for each one. You must use ethtool to turn off offloading stuff on each ethernet adapter. You must also put each adapter in promiscuous mode.

Code: Select all

sudo ethtool --offload  enp1s0f0 gro off     <-- do for both interfaces
sudo ip link set enp1s0f0 promisc on         <-- do for both interfaces

Code: Select all

;run as root or start PB with sudo if you are using the debugger 

#AF_PACKET = 17
#SOCK_RAW = 3
#ETH_P_ALL = $0003

Structure sockaddr_ll
  sll_family.u    ;/* Always AF_PACKET */
  sll_protocol.u  ;/* Physical layer protocol */
  sll_ifindex.i   ;/* Interface number */
  sll_hatype.u    ;/* ARP hardware type */
  sll_pkttype.b   ;/* Packet type */
  sll_halen.b     ;/* Length of address */
  sll_addr.b[8]   ;/* Physical layer address */
EndStructure

Global socket1, socket2

;it's ugly but I used these 2 lines to get the index values for the two interfaces. Quick and dirty :)
;if_indextoname_(3, @iface)
;iface1.s = PeekS(@iface,-1,#PB_Ascii)

Procedure in(*val)
  Debug "Thread 1 Started"
  
  *sptr = socket_config.sockaddr_ll
    
  socket1 = socket_(#AF_PACKET, #SOCK_RAW, htons_(#ETH_P_ALL))
  If socket1 <> -1
            
    socket_config\sll_family = #AF_PACKET
    socket_config\sll_ifindex = 3
    socket_config\sll_protocol = htons_(#ETH_P_ALL)
        
    If bind_(socket1, *sptr, SizeOf(socket_config)) = 0
      *buffer = AllocateMemory(65536)
      
      Repeat
        recv = recv_(socket1, *buffer, 65536, 0);, info, SizeOf(info))
        If recv > 0
          send_(socket2, *buffer, recv, 0)
        Else
          Debug "in error"
        EndIf
      ForEver
    EndIf
    
  EndIf
    
EndProcedure

Procedure out(*val)
  Debug "Thread 2 Started"
  
  *sptr = socket_config.sockaddr_ll
    
  socket2 = socket_(#AF_PACKET, #SOCK_RAW, htons_(#ETH_P_ALL))
  If socket2 <> -1
    
    socket_config\sll_family = #AF_PACKET
    socket_config\sll_ifindex = 4
    socket_config\sll_protocol = htons_(#ETH_P_ALL)
    
    If bind_(socket2, *sptr, SizeOf(socket_config)) = 0
      *buffer = AllocateMemory(65536)
      
      Repeat
        recv = recv_(socket2, *buffer, 65536, 0);, info, SizeOf(info))
        If recv > 0
          send_(socket1, *buffer, recv, 0)
        Else
          Debug "in error"
        EndIf
      ForEver
    EndIf
    
  EndIf
  
EndProcedure

in = CreateThread(@in(), 0)
out = CreateThread(@out(), 0)
WaitThread(in)
Post Reply