Re: Erlang: Create a netlink socket, bind to it, send a multicast message and receive a response

Ulf Wiger <[email protected]>
Newsgroups gmane.comp.lang.erlang.general
Message-ID <CADPRLo-5pKE=zk0+SsdsBfkQ5+c2h7zSoR-HzO1LgD0qGTA83A@mail.gmail.com>
Have you tried https://github.com/Feuerlabs/netlink ?
(I haven't used it in ages, but the last commit was in 2019, so it
seems to still be in use.)

BR,
Ulf W

Den tors 27 aug. 2020 kl 10:13 skrev Papa Tana <[email protected]>:
>
> Hi All,
>
> I'm still trying to speak netlink with the linux GTP Module using Erlang:
>
> Here is my scenario:
>
> %% load the gtp.ko module manually
> > modprobe gtp
>
> %% at userspace, create a netlink socket, and bind to it
>
> > {ok, Fd} = procket:open(0, [{family, netlink}, {protocol, 0}, {type, dgram}]).
> > Port = erlang:open_port({fd, Fd, Fd}, [binary]).
>
> %% Now, I assume that I need to send a multicast message and receive some response
> %% I assume it would be something like this:
>
> erlang:port_command(Port, <<some_binary_format>>).
> flush().
>
> %% Of course, I don't get any response because I'm sending bad message.
> I have debug some successful library written in C how he did it.
>
> Exemple of strace of libgtpnl to Linux GTP module:
>
> > strace -s 100 -f -o out -x ./gtp-link add gtp1
>
> > bind(5, {sa_family=AF_NETLINK, nl_pid=0, nl_groups=00000000}, 12) = 0
> > getsockname(5, {sa_family=AF_NETLINK, nl_pid=2966, nl_groups=00000000}, [12]) = 0
> > sendto(5, {{len=80, type=0x10 /* NLMSG_??? */, flags=NLM_F_REQUEST|NLM_F_ACK|0x600, seq=1598219164, pid=0}, "\x02\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x08\x00\x03\x00\x67\x74\x70\x31\x28\x00\x12\x80\x07\x00\x01\x00\x67\x74\x70\x00\x1c\x00\x02\x80\x08\x00\x01\x00\x03\x00\x00\x00\x08\x00\x02\x00\x04\x00\x00\x00\x08\x00\x03\x00\x00\x00\x02\x00"}, 80, 0, {sa_family=AF_NETLINK, nl_pid=0, nl_groups=00000000}, 12) = 80
> > recvmsg(5, {msg_name={sa_family=AF_NETLINK, nl_pid=0, nl_groups=00000000}, msg_namelen=12, msg_iov=[{iov_base=[{{len=36, type=NLMSG_SUCCESS, flags=0, seq=1598219164, pid=2966}, "\x00\x00\x00\x00\x50\x00\x00\x00\x10\x00\x05\x06\x9c\xe3\x42\x5f\x00\x00\x00\x00"}, {{len=0, type=0 /* NLMSG_??? */, flags=0, seq=0, pid=0}}], iov_len=4096}], msg_iovlen=1, msg_controllen=0, msg_flags=0}, 0) = 36
> > close(5)                                = 0
> > write(2, "WARNING: attaching dummy socket...
>
> As per my understanding:
>
>     - Header would be: Length=80, type=16, flags=1536, sequence number=1598219164, pid=0
>     - nl_pid = 0, nl_groups = 0
>
> Well, but I'm stuck:
>
>     1/ Do anyone know how to send such a message using Erlang?
>     2/ I have tried https://github.com/msantos/procket, my netlink socket seems ok as above, but the next step, I'm lagging
>     3/ I have take a look at https://github.com/travelping/gen_netlink as well, but first, when I tried to install tetrapak (make, make install), I got a lot of error so I cannot even install tetrapak on my machine.
>     And even if tetrapak would be installed, it will be the same as 2/, I don't find any working example even in https://learnyousomeerlang.com/ on how to successfully speak netlink using Erlang.
>
> Any hint?
> Best Regards,
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.