Anciliary data ignorado em sendmsg

0 views
Skip to first unread message

Ivo Calado

unread,
Nov 24, 2009, 9:03:29 AM11/24/09
to ccppb...@googlegroups.com
Pessoal, estou com problemas em utilizar a syscall sendmsg. Por alguma
razão o [i]anciliary data[/i] não está sendo passado para o kernel,
embora a mensagem consiga ser enviada.

Criei um exemplo que faz a chamada diretamente e a mensagem de
controle chega ao kernel
http://pastebin.com/m1c5a96fd
e consigo recuperar essa informação em net/dccp/proto.c

static int dccp_msghdr_parse(struct msghdr *msg, struct sk_buff *skb)
{
...
struct cmsghdr *cmsg = CMSG_FIRSTHDR(msg);

}


O valor retornado para cmsg não é nulo.
No entanto, tentei fazer a mesma coisa utilizando uma versão do
[link=http://www.gnu.org/software/commoncpp/]commoncpp[/link] alterado
por mim, e quando a mensagem chega no kernel a [i]anciliary data[/i]
vem nulo.

Em tentei ver a estrutura [b]msghdr[/b] passada à sendmsg e a saida é
igual tanto no codigo puro quanto utilizando o commoncpp (imprimi a
estrutura, na funçao debugMsg). O que me leva a creer que isso poderia
tersido desabilitado em alguma sockopt no commoncpp.

Em resumo, gostaria de saber se é possível desabilitar a passagem de
[i]anciliary data[/i] via alguma sockopt.
Caso contrário, alguém teria idéia do que está acontecendo?

Vlw
[]'s

--
Ivo Augusto Andrade Rocha Calado
MSc. Candidate
Embedded Systems and Pervasive Computing Lab - http://embedded.ufcg.edu.br
Systems and Computing Department - http://www.dsc.ufcg.edu.br
Electrical Engineering and Informatics Center - http://www.ceei.ufcg.edu.br
Federal University of Campina Grande - http://www.ufcg.edu.br

PGP: 0x03422935
Putt's Law:
      Technology is dominated by two types of people:
              Those who understand what they do not manage.
              Those who manage what they do not understand.

P.

unread,
Nov 24, 2009, 10:32:54 AM11/24/09
to ccppbrasil
On 24 nov, 12:03, Ivo Calado <txithihau...@gmail.com> wrote:

> Em resumo, gostaria de saber se é possível desabilitar a passagem de
> [i]anciliary data[/i] via alguma sockopt.

Sempre há uma maneira de fazer certas coisas bizarras; como por
exemplo usar um sysctl pra definir o tamanho máximo dos dados
ancillary como 0.
Se essa biblioteca commoncpp está fazendo isso pelas costas do
programdor, ela é de qualidade duvidosa.
Você deve procurar o fórum de usuários da biblioteca pra conseguir
suporte sobre ela.

--
P.

Ivo Calado

unread,
Nov 24, 2009, 11:21:41 AM11/24/09
to ccppb...@googlegroups.com
2009/11/24 P. <pedro....@member.fsf.org>:
Olá Pedro,
obrigado pela resposta...
você saberia +/- qual deveria ser a chamada para que eu possa fuçar no
código e verificar isso?!

Ivo Calado

unread,
Nov 24, 2009, 11:57:29 AM11/24/09
to ccppb...@googlegroups.com
2009/11/24 Ivo Calado <txithi...@gmail.com>:
Eu dei uma fuçada e a únicas chamada sockopt realizadas entre o
momento que eu crio o socket até o sendmsg é a seguinte

setsockopt(so, SOL_SOCKET, SO_NOSIGPIPE, (char *)&opt, sizeof(opt))

Fora isso não há nada de anormal...
Dei uma pesquisada sobre essa chamada SO_NOSIGPIPE e pelo que vi ela
não faria nada parecido...

Alguem teria ideia?

vlw!

Ivo Calado

unread,
Nov 30, 2009, 1:11:50 PM11/30/09
to ccppb...@googlegroups.com
Pessoal,
ainda brigando com o problema de trabalhar com a syscall sendmsg,
encontrei o seguinte texto:

"The maximum control buffer length the kernel can process is limited
per socket by the net.core.optmem_max sysctl"

A principio isso poderia ser a causa do meu problema, mas fui dar uma
olhada na manpage de socket (http://linux.die.net/man/7/socket) e não
vi como, em código, alterar isso para um socket específico.
Isso poderia ser a causa?

[]'s
Reply all
Reply to author
Forward
0 new messages