jueves, 28 de agosto de 2025

Linux - iperf desde una interface a otra en la misma PC.

 Primero identificar las interfaces

$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute
       valid_lft forever preferred_lft forever
2: enp2s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether dc:0e:a1:b0:e6:e2 brd ff:ff:ff:ff:ff:ff
    inet 169.254.85.18/16 brd 169.254.255.255 scope link noprefixroute enp2s0f0
       valid_lft forever preferred_lft forever
    inet 192.168.34.1/24 scope global enp2s0f0
       valid_lft forever preferred_lft forever
    inet6 fe80::269:2be0:6245:9faa/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
3: wlp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 44:6d:57:57:4d:e1 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.73/24 brd 192.168.0.255 scope global dynamic noprefixroute wlp3s0
       valid_lft 42230sec preferred_lft 42230sec
    inet6 fe80::cc69:a48c:a959:dbfd/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
4: enxd0c0bf2f7343: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether d0:c0:bf:2f:73:43 brd ff:ff:ff:ff:ff:ff
    inet 192.168.35.1/24 scope global enxd0c0bf2f7343
       valid_lft forever preferred_lft forever

Para el ejemplo utilizaremos:

    enp2s0f0 (interface onboard)

    enxd0c0bf2f7343 (interface usb->ethernet)

Crear un namespace para cada adaptador:

    # ip netns add ns_eth0

    # ip netns add ns_eth1

Mover los adaptadores a cada namespace:

    # ip link set enp2s0f0 netns ns_eth0

    # ip link set enxd0c0bf2f7343 netns ns_eth1

Asignar una dirección IP a cada adaptador:

    # ip netns exec ns_eth0 ip addr add dev enp2s0f0 192.168.34.1/24

    # ip netns exec ns_eth1 ip addr add dev enxd0c0bf2f7343 192.168.34.2/24

Levantar los adaptadores:

    # ip netns exec ns_eth0 ip link set enp2s0f0 up

    # ip netns exec ns_eth1 ip link set enxd0c0bf2f7343 up

Iniciamos el servidor iperf en una interfaz específica:

    # ip netns exec ns_eth0 iperf -s

Conectamos al servidor por medio de la otra interfaz:

    # ip netns exec ns_eth1 iperf -c 192.168.34.1

Volver a estado inicial:

    # ip netns del ns_eth0

    # ip netns del ns_eth1


Extra.

Todo junto por interfaz...:

Interfaz 0

# ip netns add ns_eth0

# ip link set enp2s0f0 netns ns_eth0

# ip netns exec ns_eth0 ip addr add dev enp2s0f0 192.168.34.1/24

# ip netns exec ns_eth0 ip link set enp2s0f0 up

Interfaz 1

# ip netns add ns_eth1

# ip link set enxd0c0bf2f7343 netns ns_eth1

# ip netns exec ns_eth1 ip addr add dev enxd0c0bf2f7343 192.168.34.2/24

# ip netns exec ns_eth1 ip link set enxd0c0bf2f7343 up

 

 

...O Ctrl+c, Ctrl+v friendly :) :

Interfaz 0

# ip netns add ns_eth0 && ip link set enp2s0f0 netns ns_eth0 && ip netns exec ns_eth0 ip addr add dev enp2s0f0 192.168.34.1/24 && ip netns exec ns_eth0 ip link set enp2s0f0 up

Interfaz 1

# ip netns add ns_eth1 && ip link set enxd0c0bf2f7343 netns ns_eth1 && ip netns exec ns_eth1 ip addr add dev enxd0c0bf2f7343 192.168.34.2/24 && ip netns exec ns_eth1 ip link set enxd0c0bf2f7343 up

   T.R.

 

Fuente 1

Fuente 2

 

miércoles, 9 de abril de 2025

Verilog en Linux

Si bien existen herramientas específicas, de fabricantes como Xilinx o Intel, que funcionan en Linux, es interesante tener un herramienta liviana y gratuita para realizar pruebas.

Comenzar instalando iverilog, el cual es un compilador que traduce código fuente Verilog en un programa ejecutable para simulaciones.

# apt install iverilog

Luego instalar gtkwave, la cual es una herramienta de visualización de archivos VCD (entre otros). 

Nota: VCD son las iniciales de "Value Change Dump" , y es un formato de archivos industrial estándar para el volcado de simulaciones.

# apt install gtkwave

Ahora en un editor de texto, creamos un sencillo ejemplo en verilog de una compuerta and de 2 entradas, llamado and_2_in.v :


module and_2_in(
input a,
input b,
output x
);

assign x = (a & b);
endmodule

Luego, en la misma carpeta, creamos un testbench de ejemplo, and_2_in_tb.v


  
`timescale 10ns/100ps

module and_2_in_tb;

reg i,j;
wire z;

and_2_in u0_DUT(
.a(i),
.b(j),
.x(z)
);

initial begin

$dumpfile("wave_tb_and_2_in.vcd");
$dumpvars(0,and_2_in_tb);
i=1'b0;
j=1'b0;
#5 i=1'b1;
#5 i=1'b0;
#5 j=1'b1;
#5 i=1'b0;
#5 i=1'b1;
#5 j=1'b1;
#5 $finish;
end
endmodule

Compilamos el programa and_2_in.v, y además pasamos como argumento el testbench and_2_in_tb.v, con el comando:

$ iverilog -o out_and_2_in and_2_in.v and_2_in_tb.v

 Iverilog generará el archivo ejecutable out_and_2_in . Este archivo no es ejecutable por cualquier plataforma, por lo que se invoca a vvp.

 Lanzamos vvp, el cual es el "run time engine", que ejecuta la salida compilada de iverilog:

$ vvp out_and_2_in

El comando anterior genera un archivo  vcd con el nombre asignado en el apartado $dumpfile("wave_tb_and_2_in.vcd") del testbench.

Finalmente, lanzamos gtkwave pasando como argumento el archivo vcd generado.

$ gtkwave wave_tb_and_2_in.vcd


 

Seleccionamos la señales que nos interesa visualizar :


 

Ajustamos el zoom:



T.R.

 

 


viernes, 14 de marzo de 2025

IP Estático temporal en Debian

 En ocasiones necesito de probar conectividad Ethernet de equipamiento industrial.

 Para ello utilizo una configuración temporal de IP estático sin engorrosas configuraciones.

 En un terminal como root:

    # ip addr


    # ip addr add 192.168.1.2/24 dev enp2s0f0

    # ip addr 

 Listo.

 Una vez finalizadas las verificaciones, borramos la IP Estática temporal con:

    # ip addr del 192.168.1.2/24 dev enp2s0f0

 Extra.

 *- Ping con interfaz específica:

    $  ping -I enp2s0f0 192.168.1.14

 *- Escaneo con nmap:

    Puerto específico: 

        # nmap -p 80 192.168.1.14

    Puerto comunes (populares):

        # nmap -F 192.168.1.14

    Rango de puertos:

        # nmap -p 500-510 192.168.1.14 

     Dispositivos conectados, especificando interfaz:

        # nmap -e enp2s0f0 -sn 192.168.1.0/24

T.R.


 


viernes, 7 de marzo de 2025

GDB con OpenOCD en Debian

Esta entrada no es más que un ayuda memoria sobre uso inicial de GBD y OpenOCD por medio de terminal en Debian.

1 - Verificar o instalar gdb-multiarch

    # apt install gdb-multiarch

2 - Conectar OpenOCD a la placa bajo depuración. En este ejemplo el target es una raspberry pi pico w, por medio de otra raspberrypi-pico con firmware debugprobe 

    $ openocd -f interface/cmsis-dap.cfg -f target/rp2040.cfg -c "adapter speed 5000"   

3 - En otro terminal lanzamos GDB, en este ejemplo depuraremos NUTTX; naturalmente, dentro de la carpeta que se encuentra el binario:

    $ gdb-multiarch nuttx 

El prompt debería devolver y esperar comandos:

    (gdb)

4 - Nos conectamos al target:

   (gdb) target extended-remote :3333 

5 - Finalmente, a modo de ejemplo, cargamos el firmware:

    (gdb) load nuttx

    o simplemente

    (gdb) load

    y aplicamos reset al target:

    (gdb) mon reset 

T.R.