La transmisión de datos en la capa de enlace de la pila de protocolos de Linux - la transmisión de datos

  
 

datos de transmisión antes de entrar en la función de transmisión, que primero se ven e100_up () - > e100_alloc_cbs función: static int e100_alloc_cbs (struct nic * nic) {cb struct * cb; unsigned int i, count = NIC- > params.cbs.count; NIC- > cuc_cmd = cuc_start; NIC- > cb_to_use = NIC- > cb_to_send = NIC- > cb_to_clean = NULL; NIC- > cbs_avail = 0;

//aplicaciones lineales DMA, donde el retorno es la dirección virtual, para su uso NIC-> CPU; cbs = pci_alloc_consistent (NIC-> pdev, sizeof (CB struct) * recuento, &NIC-> cbs_dma_addr); if (! NIC- > cbs) -ENOMEM regreso; //establecer una memoria intermedia de transmisión para un anular (cb = NIC- > cbs, i = 0; i < cuenta; cb ++, i ++) {CB > siguiente = (i + 1 < count) cb + 1: NIC- > cbs; CB > prev = (i == 0) NIC- > cbs + contar - 1: ?? CB - 1; CB > dma_addr = NIC- > cbs_dma_addr + i * sizeof (cb struct); CB > link = cpu_to_le32 (NIC- > cbs_dma_addr + ((i + 1)% count) * sizeof (cb struct)); CB > skb = NULL;} //inicialización de los punteros para apuntar a la posición inicial de memoria tampón NIC- > cb_to_use = NIC- > cb_to_send = ni c- > cb_to_clean = NIC- > cbs; NIC- > cbs_avail = recuento; return 0;} En esta sección de código, se completa la preparación de la transmisión, el establecimiento de una memoria intermedia de anillo de transmisión. Cuando el número de juego de transmisión, siempre que los datos en la memoria intermedia de datos a un llamadas finales DevS- > función hard_start_xmit. En el código e100, es decir e100_xmit_frame () mirar en el interior: static int e100_xmit_frame (struct sk_buff * skb, struct net_device * netdev) {struct nic * nic = netdev_priv (netdev); int err; si (NIC- > banderas &ich_10h_workaround) {e100_exec_cmd (nic, cuc_nop, 0); udelay (1);} err = e100_exec_cb (nic, SKB, e100_xmit_prepare); conmutador (err) {case -ENOSPC: /* Nos cola skb, pero ahora estamos fuera del espacio * /netif_stop_queue (netdev); break; caso -ENOMEM: .. /* Este es un error de hardware - log que * /DPRINTK (TX_ERR, depurar, " Fuera de recursos TX, volviendo skb \\ n "); netif_stop_queue (netdev); return 1;} netdev- > trans_start = jiffies; return 0;} seguir para realizar un seguimiento en e100_exec_cb (nic, SKB, e100_xmit_prepare); estática inline int e100_exec_cb (struct nic * nic, struct sk_buff * skb , nula (* cb_prepare) (struct nic *, estructura cb *, estructura sk_buff *)) {struct cb * cb; banderas sin firmar largos; int err = 0; spin_lock_irqsave (&NIC-> cb_lock, banderas), si ( improbable (NIC- >! cbs_avail)) {err = -ENOMEM; err_unlock Goto;}

//el skb En el búfer de transmisión anular //cb_to_use: transmitir la posición de uso búfer en cb = NIC- > cb_to_use; NIC- > cb_to_use = CB > siguiente; NIC- > cbs_avail -; CB > skb = skb; si (poco probable (NIC-> cbs_avail)!) err = -ENOSPC; cb_prepare (nic, CB, SKB); /* el orden es importante de lo contrario vamos a estar en una carrera con h /w: * Juego de S bits en actual en primer lugar, y luego despejado S bits en anteriores * /CB > comando

Copyright © Conocimiento de Windows All Rights Reserved