New Puente: puede ser conocido a partir del análisis anterior, llamada ioctl (br_socket_fd, SIOCBRADDBR, brname) en el espacio de usuario en br_ioctl_deviceless_stub , se puede ver su procesamiento asociado: int br_ioctl_deviceless_stub (unsigned int cmd, nula __user * uarg) {switch (cmd) {case SIOCGIFBR: caso SIOCSIFBR: volver old_deviceless (uarg); //Nueva SIOCBRADDBR caso puente: //eliminar;: caso SIOCBRDELBR puente {char buf [IFNAMSIZ] si el retorno -EPERM; //copy_from_user (capaz (CAP_NET_ADMIN)!): si los datos en un espacio del núcleo al espacio de usuario (copy_from_user (buf, uarg, IFNAMSIZ)) return - EFAULT; buf [IFNAMSIZ-1] = 0; si (cmd == SIOCBRADDBR) br_add_bridge retorno (buf); br_del_bridge retorno (buf);}} regreso -EOPNOTSUPP;} aquí nos cmd es pasado a SIOCBRADDBR. br_add_bridge (BUF) se lleva a cabo: int br_add_bridge (const char * nombre) {struct net_device * dev; int ret; //puente virtual un nuevo net_device //delante y " &" dispositivos de red gestión; después de esta estructura dev = new_b ridge_dev (nombre); (! dev) si
Vuelta -ENOMEM; rtnl_lock (); //el nombre de la interfaz se determina por el núcleo, por ejemplo eth0 eth1 como si (strchr (dev- > nombre, '%') ) {ret = dev_alloc_name (dev, dev- > nombre), y si (r < 0) Goto ERR1;} //Registrar este dispositivo de red ret = register_netdevice (dev) al núcleo; si (RET) Goto Err2; dev_hold ( dev); rtnl_unlock (); //crear información ret = br_sysfs_addbr (dev) en sysfs; dev_put (dev), si (r)
unregister_netdev (dev); salida: ret retorno; Err2: free_netdev (dev); err1: rtnl_unlock (); valla a cabo;} puente que hemos visto antes de registrarse en el registro del dispositivo de red física es la misma. Nos preocupa que la estructura del puente net_device qué, continúe siguiendo en new_bridge_dev correspondiente: net_device estructura estática * new_bridge_dev (const char * nombre) {struct net_bridge * sa; struct net_device * dev; //asigna net_devicedev = alloc_netdev (sizeof (net_bridge struct), nombre, br_dev_setup), si (dev) de retorno NULL;! zona privada de la estructura del puente net_bridgebr = netdev_priv (dev); //puntos de campo estructura dev área privada para sí BR > dev = dev; BR > de bloqueo = SPIN_LOCK_UNLOCKED; //inicializar cola. Port_list guardado en la lista de puertos en el INIT_LIST_HEAD puente (&BR > Port_list); BR > hash_lock = SPIN_LOCK_UNLOCKED; //código STP asociado con el acuerdo bajo esta parte, no se preocupan por BR > bridge_id.prio [0] = 0x80; BR > bridge_id.prio [1] = 0x00; memset (BR > bridge_id.addr, 0, ETH_ALEN); BR > stp_enabled = 0; BR > designated_root = BR > bridge_id; BR > root_path_cost = 0; BR > root_port = 0; BR > bridge_max_age = BR > max_age = 20 * HZ; BR > bridge_hello_time = BR > hello_time = 2 * HZ; BR > bridge_forward_delay = BR > forward_delay = 15 * HZ; BR > topology_change = 0; BR > topology_change_detected = 0; BR > ageing_time = 300 * HZ; INIT_LIST_HEAD (&BR > age_list); br_stp_timer_init (ancho); dev retorno;} br_dev_setup también hecho en alguna otra inicialización puntero de función: br_dev_setup vacío (struct net_device * dev) {//la dirección MAC del puente a cero memset (dev- > dev_addr, 0, ETH_ALEN); //inicializar ether_setup configuración Ethernet (dev); //inicializar serie puntero de función dev- > do_ioctl = Br_dev_ioctl; dev- > get_stats = br_dev_get_stats; dev- > hard_start_xmit = br_dev_xmit; dev- > abierto = br_dev_open; dev- > set_multicast_list = br_dev_set_multicast_list; dev- > change_mtu = br_change_mtu; dev- > destructor = free_netdev; SET_MODULE_OWNER (dev); dev- > stop = br_dev_stop; dev- > accept_fastpath = br_dev_accept_fastpath; dev- > tx_queue_len = 0; dev- > set_mac_address = NULL; dev- > priv_flags = IFF_EBRIDGE;} esta parte copias del dispositivo de puente área de espacio privado se inicializa. En este caso, es necesario tender un puente net_device estructura de dominio privada correspondiente:
Todo el mundo sabe que el script de shell es como un archivo por lotes (.bat) en la era temprana de
Cuando hicimos el experimento, grabamos el archivo bin en la tarjeta SD, como el experimento de la l
Para los sistemas Linux, ya sea el procesador central, la memoria, las unidades de disco, el teclado
Matthew Garrett, desarrollador principal de Red Hat, publicó un artículo en el que Fedora 18 present
Linux cómo ver el tamaño del sector
Explicación detallada del significado de ctime atime mtime para archivos y carpetas en Linux
Tres pasos para enseñarle cómo crear una unidad flash de Linux
Solución de error en el cuadro de diálogo chino de Linux
Cómo configurar el proxy transparente
sistema de restablecimiento de contraseña raíz de Linux que ilustra el método detallado tutorial
estibador acumulación depósito privado y empuje el espejo
Los usos y diferencias entre Linux bashrc y perfil
Linux principiantes --------- cinco errores más comunes
Implementación de proxy inverso Nginx de dos formas de retención de sesión
Solucionar archivo BOOT ilegal
Solución de pantalla negra juego de linaje oscuro pantalla de alta resolución
Cómo luchar, cómo golpear el número
¿Qué es el formato izquierdo y derecho?
Cómo borrar el antiguo kernel de Linux
¿Qué debo hacer si la configuración de la computadora del sistema Win10 es demasiado baja?
Sintaxis del comando para eliminar archivos arbitrarios utilizando CMD en el entorno Win7
Error en la sincronización del calendario y el correo del sistema Win10 0x80c8043e solución