[linux-f10] linux_socketcall... ERR#43 'Protocol not supported'

Alexander Leidinger Alexander at Leidinger.net
Tue May 5 14:08:41 UTC 2009


Quoting Boris Samorodov <bsam at ipt.ru> (from Tue, 05 May 2009 17:44:54 +0400):

> On Tue, 05 May 2009 14:49:55 +0200 Alexander Leidinger wrote:
>> Quoting Boris Samorodov <bsam at ipt.ru> (from Tue, 05 May 2009  
>> 09:51:21 +0400):
>
>> > I'm working on Fedora 10 ports and almost all is fine (even
>> > google-earth seems to work)... But there is no resolving.
>> > I managed to find the culprit. Here it is:
>
>> > Ktrace/linux_kdump gives this:
>> > -----
>> >  48833 ping     CALL  linux_socketcall(0x1,0xbfbfd218)
>> >  48833 ping     RET   linux_socketcall -1 errno 93 Unknown error: 93
>> >  48833 ping     CALL  gettimeofday(0xbfbfd2e0,0)
>> >  48833 ping     RET   gettimeofday 0
>> >  48833 ping     CALL  linux_socketcall(0x1,0xbfbfd218)
>> >  48833 ping     RET   linux_socketcall -1 errno 93 Unknown error: 93
>> >  48833 ping     CALL  write(0x2,0xbfbfbf48,0x1a)
>> >  48833 ping     GIO   fd 2 wrote 26 bytes
>> >        "ping: unknown host www.ru
>> >        "
>> >  48833 ping     RET   write 26/0x1a
>> >  48833 ping     CALL  linux_exit_group(0x2)
>> > ----
>
>> There was a commit after April 30 about linux socket stuff. I don't
>> know if it is related or not. You can either update and test, or
>
> Thanks for the info, I'm updating now.
>
>> instrument the current code to print out the parameters to
>> linux_socketcall in a human readable way.
>
> Can you give a tiny example?

orig:
---snip---
         switch (args->what) {
         case LINUX_SOCKET:
                 return (linux_socket(td, arg));
         case LINUX_BIND:
                 return (linux_bind(td, arg));
---snip---

modified (ugly):
---snip---
         switch (args->what) {
         case LINUX_SOCKET:
                 int ret = linux_socket(td, arg);
                 printf("LINUX_SOCKET: %d\n", ret);
                 return (ret);
         case LINUX_BIND:
                 return (linux_bind(td, arg));
---snip---

After this you should see in ktrace which one it tries to call. Revert  
to the orig one and instrument the corresponding function, for  
linux_socket thish would be:
---snip---
linux_socket(struct thread *td, struct linux_socket_args *args)
{
#ifdef INET6
         INIT_VNET_INET6(curvnet);
#endif
         struct socket_args /* {
                 int domain;
                 int type;
                 int protocol;
         } */ bsd_args;
         int retval_socket;

/* debug for bsam */
printf("linux_socket (LINUX): domain: %d, type: %d, protocol: %d\n",  
args->domain, args->type, args->protocol);

         bsd_args.protocol = args->protocol;
         bsd_args.type = args->type;
         bsd_args.domain = linux_to_bsd_domain(args->domain);
/* debug for bsam */
printf("linux_socket (FreeBSD): domain: %d\n", bsd_args.domain);
         if (bsd_args.domain == -1)
                 return (EINVAL);
---snip---

Bye,
Alexander.

-- 
The six great gifts of an Irish girl are beauty, soft
voice, sweet speech, wisdom, needlework, and chastity.
		-- Theodore Roosevelt, 1907

http://www.Leidinger.net    Alexander @ Leidinger.net: PGP ID = B0063FE7
http://www.FreeBSD.org       netchild @ FreeBSD.org  : PGP ID = 72077137


More information about the freebsd-emulation mailing list