Discussione: Problemi con netlink
View Single Post
Old 17-06-2006, 13:41   #1
NA01
Senior Member
 
L'Avatar di NA01
 
Iscritto dal: Jun 2003
Città: Genova
Messaggi: 5676
Problemi con netlink

mentre cercavo di capire come usare connector ho trovato un articolo su netlink che mi sembrava molto chiaro.
ho provato a implementarlo per comunicare una piccola stringa in userspace, ma ci sono ENORMI problemi

al caricamento del modulo parte (tra le altre che però sono di certo corrette) questo:

Codice:
static void create_socket(){
  int err;
  nl_sk = netlink_kernel_create(NETLINK_MINOX, 1, nl_data_ready, THIS_MODULE);
  skb = skb_recv_datagram(nl_sk, 0, 0, &err);
  nlh = (struct nlmsghdr *)skb->data;
  pid = nlh->nlmsg_pid;
}
data ready viene direttamente dall'articolo, e sinceramente non capisco a che mi serva...
comuque è definita così:

Codice:
static void nl_data_ready (struct sock *sk, int len)
{
  wake_up_interruptible(sk->sk_sleep);
}
ogni qual volta venga creata una socket internet viene poi chiamata questa funzione:

Codice:
static int negotiate_auth(u32 app_pid, int auth_type){
  char buf[MAX_PAYLOAD];
  int err;
  snprintf(buf, MAX_PAYLOAD, "%d", app_pid/*, auth_type*/);
  if(nlh != NULL && skb != NULL){
  strcpy(NLMSG_DATA(nlh), buf);
  NETLINK_CB(skb).pid = 0;
  NETLINK_CB(skb).dst_pid = pid;
  NETLINK_CB(skb).dst_group = 0;
  netlink_unicast(nl_sk, skb, pid, MSG_DONTWAIT);
  skb = skb_recv_datagram(nl_sk, 0, 0, &err);
  if(skb != NULL){
    nlh = (struct nlmsghdr *)skb->data;
    if(strcmp(NLMSG_DATA(nlh), ACCESS_PERMITTED) == 0){
      return 0;
    }
  }
  }
  return -EPERM;
}
le variabili che non vedete qua probabilmente sono dei define o delle variabili globali.
il problema è che quando un processo apre una socket viene rilevato, e viene inviato il pid copiato due volte di seguito.
nel frattempo il programma che apre la socket va in segmentation fault, e dmesg si lamenta di aver trovaoto un puntatore nullo...
io ho cercato, ma nel mio codice non ne trovo...
qualcuno con più esperienza di me a usare netlink mi può dare una mano?
grazie, ciao!
NA01 è offline   Rispondi citando il messaggio o parte di esso