2010-06-15 11 views
1

J'essaie d'implémenter mon propre protocole de couche de transport sous Linux pour une expérience. Je vais utiliser l'interface socket et ajouter mon protocole en utilisant sock_register. Pour les proto_ops, je peux voir que les paramètres pour sendmsg et recvmsg sont (struct kiocb * iocb, struct socket * sock, struct msghdr * msg, taille_t len, int flags). Mais il y a trois types de send, sendto, sendmsg. De ces trois seuls sendmsg contient un paramètre pour msghdr. Je trouve que les deux autres api sont incompatibles avec les paramètres fournis par le noyau à ma fonction sendmsg kernel-space. Alors, que se passe-t-il lorsque nous utilisons des API d'envoi et d'envoi d'espace utilisateur? Espère que je suis clair ..Vous avez besoin d'aide pour comprendre le mappage de l'espace utilisateur send, sendto, sendmsg à kernel-space sendmsg

Merci, Bala

Répondre

1

send() est mis en œuvre en termes de sendto(): send(s, buf, len, flags); est équivalent à sendto(s, buf, len, flags, NULL, 0);

sendto() est à son tour mis en œuvre en termes de sendmsg(). send(s, buf, len, flags, addr, addr_len); est mis en œuvre avec (en termes de l'interface userspace):

struct iovec iov = { 
    .iov_base = buf, 
    .iov_len = len 
}; 
struct msghdr msg = { 
    .msg_name = addr, 
    .msg_namelen = addr_len, 
    .msg_iov = &iov, 
    .msg_iovlen = 1, 
    .msg_control = NULL, 
    .msg_controllen = 0 
}; 

return sendmsg(s, &msg, flags); 

L'interface est légèrement différente dans l'espace noyau - par exemple. vous obtenez le paramètre kiocb - mais l'idée de base est la même. Un send() ou sendto() est converti en sendmsg() avec un msghdr qui pointe sur un seul iovec qui fait référence au tampon.

0

En supposant que vous êtes à l'aise avec le mécanisme d'appel système - démarre à partir net/socket.c et suivez les chaînes d'appel - il est plus ou moins claire.