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!