2017-10-13 3 views
0

Je suis en train d'écrire un pilote linux phy qui gère l'horodatage des paquets. La moitié inférieure effectue le calcul des horodatages et envoie ces informations à la pile réseau du noyau, puis à l'espace utilisateur. La moitié inférieure a besoin de quelques informations du skb (paquet) que l'appelant de la tasklet a. J'ai de la difficulté à passer ce skb au takslet. La fonction de gestionnaire de tâches ne prend aucune autre entrée que unsigned long. Je suis coincé ici. Ci-dessous est un extrait de code pour vous comprendre -partager des données avec la moitié inférieure de la tâche dans le pilote linux

static void tx_ts_task(unsigned long val) 
    { 
     struct phyts *phyts = container_of(&val, struct phyts, int_flags); 
     //skb_copy(skb); ///want to access skb in this tasklet but I am unable to do this. 
     . 
     . 
    } 

    int tx_timestamp(struct phyts *phyts, struct sk_buff *skb, int len) 
    { 
     . 
     . 
     tasklet_schedule(&tx_ts_tasklet); 

    } 

Appréciez vos entrées. Merci

+0

Non signé long est équivalent à void * sous Linux. – 0andriy

Répondre

0

La fonction Tasklet reçoit le même paramètre data spécifié dans DECLARE_TASKLET/tasklet_init. Habituellement, c'est un pointeur vers une structure de pilote (grande). Donc, fondamentalement, vous ne pouvez pas passer directement les données d'exécution entre ISR et tasklet et utiliser une sorte de variable partagée (peut être la structure mentionnée ci-dessus) avec un verrouillage approprié.