La transmisión de datos en la capa de enlace de la pila de protocolos Linux (la adición de una interfaz para el puente (D))

  
 

ya se ha analizado, cuando se añade en la interfaz de puente, el espacio de usuario de la ioctl llamada (br_socket_fd, SIOCBRADDIF, &IFR) dev- y ya GT se señaló en el vacío br_dev_setup (net_device struct * dev); do_ioctl eran asignación, a saber: dev- > lleva a cabo cuando el acceso do_ioctl = br_dev_ioctl ioctl, el proceso pasa a br_dev_ioctl: (neto /brige /br_ioctl.c) int br_dev_ioctl (struct net_device * dev, struct ifreq * rq, int cmd) {net_bridge struct * br = netdev_priv (dev); conmutador (cmd) {case SIOCDEVPRIVATE: volver old_dev_ioctl (dev, rq, cmd); //añadir un SIOCBRADDIF caso interfaz: //eliminar un caso interfaz SIOCBRDELIF: add_del_if retorno (br, RQ- > ifr_ifindex, cmd == SIOCBRADDIF);} pr_debug (" puente no soporta ioctl 0x% x \\ n ", cmd); vuelven -EOPNOTSUPP;} signos que utilizamos en el espacio de usuario es SIOCBRADDIF. Por lo tanto, el flujo avanza add_del_if () static int add_del_if (struct net_bridge * ancho, int ifindex, int isadd)

{struct net_device * dev; int ret; si el retorno -EPERM (Capaz (CAP_NET_ADMIN)!); Dev = dev_get_by_index (ifindex), si (dev == NULL) de regreso -EINVAL; si (isadd) ret = br_add_if (br, dev); elseret = br_del_if (br, dev); dev_put (dev); ret retorno;} porque cmd = = SIOCBRADDIF es cierto, el br_add_if call (): int br_add_if (struct net_bridge * br, struct net_device * dev) (neto /brige /br_if.c)) {struct net_bridge_port * p; int err = 0; //bucle. O una interfaz de fuera de la red, y si (dev- > &banderas IFF_LOOPBACK

Copyright © Conocimiento de Windows All Rights Reserved