OpenWrt support for Linksys MX4200

A while back, I got 4 refurbished MX4200s for my club, and loaded them with a firmware generator image at openwrt-24.10.0-rc5-76ad83a73047-qualcommax-ipq807x-linksys_mx4200v1-squashfs-factory.bin. After I did that I noticed that one of them was using MAC addresses that weren't the factory assigned ones. It seemed to work OK but I set it aside, I only need 3 right now.

Later, I realized that router was actually an MX4200v2; I'd received 3 v1 and 1 v2 router. So I attempted to reinstall it with openwrt-24.10.0-rc6-d860b660a1b7-qualcommax-ipq807x-linksys_mx4200v2-squashfs-sysupgrade.bin but that resulted in something that wasn't responding on Ethernet.

Putting a serial console on that revealed that OpenWRT was booting, and doing a failsafe boot and factory reset got it working again. At that point, it was booting/running the v1 image.

I tried flashing the v2 images again, both factory and sysupgrade. The upgrade from GUI logs:

Sat Jan  4 21:37:41 UTC 2025 upgrade: Sending TERM to remaining processes ...      
Sat Jan  4 21:37:41 UTC 2025 upgrade: Sending signal TERM to netifd (2016)         
Sat Jan  4 21:37:41 UTC 2025 upgrade: Sending signal TERM to ntpd (3121)                              
Sat Jan  4 21:37:41 UTC 2025 upgrade: Sending signal TERM to ntpd (3188)                                                
Sat Jan  4 21:37:45 UTC 2025 upgrade: Sending KILL to remaining processes ...                          
Sat Jan  4 21:37:45 UTC 2025 upgrade: Sending signal KILL to netifd (2016)                                                                                                                                                                      
[  138.707257] stage2 (3755): drop_caches: 3                                                                                                                                                                                                    
Sat Jan  4 21:37:53 UTC 2025 upgrade: Switching to ramdisk...
[  140.458268] UBIFS (ubi0:1): background thread "ubifs_bgt0_1" stops                                                   
[  140.468004] UBIFS (ubi0:1): un-mount UBI device 0                                                                    
Sat Jan  4 21:37:55 UTC 2025 upgrade: Performing system upgrade...
[  141.230363] ubi1: attaching mtd24                                                                                    
[  142.056460] ubi1: scanning is finished                   
[  142.064558] ubi1: attached mtd24 (name "alt_rootfs", size 144 MiB)                                                   
[  142.064604] ubi1: PEB size: 131072 bytes (128 KiB), LEB size: 126976 bytes                                           
[  142.069666] ubi1: min./max. I/O unit sizes: 2048/2048, sub-page size 2048                                            
[  142.076509] ubi1: VID header offset: 2048 (aligned 2048), data offset: 4096
[  142.083361] ubi1: good PEBs: 1152, bad PEBs: 0, corrupted PEBs: 0                                                    
[  142.090137] ubi1: user volume: 1, internal volumes: 1, max. volumes count: 128                                       
[  142.096396] ubi1: max/mean erase counter: 1/0, WL threshold: 4096, image sequence number: 1504320963                 
[  142.103503] ubi1: available PEBs: 0, total reserved PEBs: 1152, PEBs reserved for bad PEB handling: 80
[  142.112805] ubi1: background thread "ubi_bgt1d" started, PID 4569                                                    
UBI device number 1, total 1152 LEBs (146276352 bytes, 139.5 MiB), available 0 LEBs (0 bytes), LEB size 126976 bytes (124.0 KiB)
ubimkvol: error!: UBI device does not have free logical eraseblocks                                                     
cannot create kernel volume                                                                                             
sysupgrade failed                                                                                                       
umount: can't unmount /dev: Resource busy                                                                               
umount: can't unmount /tmp: Resource busy                                                                               
[  142.576458] remoteproc remoteproc0: stopped remote processor cd00000.q6v5_wcss                                       
[  143.084988] reboot: Restarting system                                                                                

and then u-boot seems to fail at

NAND read: device 0 offset 0xa680000, size 0x600000                                                                                                                                                                                             
 6291456 bytes read: OK                                                                                                 
Wrong Image Format for bootm command                                                                                    
ERROR: can't get kernel image!                                                                                          

3 resets then bring it back to booting from the v1 image.

  • Is there much harm in using the v1 image? Is there likely to be any other ill effect besides the unusual MAC addresses?
  • I'm using these in a fairly simple router + APs config with 1 SSID. The v1 image detects the 1GB RAM OK, I won't have anything on the flash aside from a few packages. Are there any strong reasons to prefer v2?
  • last, is there a not-too-painful way to install v2 in this situation?

Not sure many people are in your situation, so you're on your own on figuring out the quirks of using the wrong image.

Here's what I would suggest you try to painlessly get on v2:

  1. Sysupgrade a known working v1 image twice so you'll have something to fallback to.
  2. Install a v2 on one partition by following this procedure: [OpenWrt Wiki] Linksys MX4200
  3. If it works, install on the other partition the same way.

If it detects 1GB of RAM, you have version V2:

[    0.000000] Memory: 820364K/1048576K available (8256K kernel code, 894K rwdata, 2500K rodata, 1472K init, 290K bss, 228212K reserved, 0K cma-reserved)

The problem is probably that you are updating while having OEM firmware on the second partition.

Look at this comment: https://github.com/openwrt/openwrt/issues/17681#issuecomment-2678320239

These images should install if you have OEM firmware on the second partition: OpenWrt support for Linksys MX4200 - #2555 by lytr

I ended up using mtd write to get a v1 image onto the alt partition and verifying that both booted, and then mtd write with a v2 image and reboot on each partition. It seems to be OK except that I'm still having a minor problem with phy0-ap0 (low 5GHz radio) if I try and set the channel to, say, 48: in GUI it would show that channel number but a 6.5GHz+ frequency, and not actually function. Leaving the channel at default 36 seems to work. I haven't fully investigated this; I might have seen this on the v1 units too.

Thanks for the help @OpenWRT-fanboy @lytr !

Hey everyone

I'm looking to build a poor man's Eero Pro 6 mesh with these units for total control. I've got my head around how I will do batman-adv (lower 5 ghz for backhaul) but one thing the Eero has that other routers don't is SQM.

The raw processing power of the MX4200 is probably only good for 250 Mbps with fq_codel or Cake. The Eero Pro 6 can do approx 1 Gbps with SQM.

I stumbled upon this github which I think does what I would require. Being able to run SQM at possibly gigabit speeds on OpenWRT: https://github.com/rickkdotnet/sqm-scripts-nss

The problem is, it requires an NSS build and the github has not been actively maintained. Can anyone who makes NSS builds or is running an NSS build try this and see how it performs if you have a fast connection?

Thanks

Does your MX4300 use more memory than this screenshot? Since this is a beast of a router with tons of memory, I never saw it go above 30% usage and no matter what I do, it's NOT going up. lol

FWIW, I am using the latest snapshot build from arix00, r28897. Because of the devs here and OpenWRT support, MX4300 is one of the best routers out there and to think I paid ONLY $15 is, in a word, insane. :slight_smile:

2 Likes

Where are these settings located? I searched in radio0, radio1, and radio2 (mesh) and don't see it there.

I see similar memory usage. I think I've seen mid-400 MiB sometimes but no more than that. However, a similar memory usage for MX4200v1 means that it runs out of memory (the total memory of MX4200v1 visible to openwrt is about 364MiB).

Newly registered. Just wanted to share my experiences

I have a reasonable sized home network with about 120 IOT devices, a dozen cameras, few TV, streaming devices plus usual phones, tablets, laptops etc. Total over 150 connections. I have been using OpenWRT on a Dlink for IOT and netgear for home devices with separate networks
Got the 2 MX4200V1 (from woot) and installed OpenWRT 24.10 Memory usage was pretty high (only 10MB or so free, so it was just a matter of time before it crashed). Decided to go with this NSS build.
Here are my findings

  • The system has been running rock solid stable for 7 days now, with both the devices having over 120MB free
  • I have configured them in a mesh (using wolfssl instead of openssl, though both are compatible with each other). Setup of mesh was extremely easy. In fact, I also installed 24.10 in my r6260 and added it to the mesh (although I dont need mesh with 3 nodes). The Dlink is not compatible with mesh (since it is based on broadcom)
  • I have lower 5G for backhaul, 2.4G for IOT and higher 5G for home
  • Speed within 10ft is over 800Mbps (both ways)
  • Speed within 10ft of satellite is over 500Mbps (both ways)
  • Wired speed is 1Gbps on main and over 700Mbps on satellite
  • From a room 30ft away, I still get over 300Mbps

Only issue I have is Im unable to setup batman since the NSS is incompatible with it. Hopefully once this is resolved, I can have real VLANs to separate my networks (right now I do L3 firewall rules to segment the networks)

3 Likes

Why do you keep fiddling with it if it's running out of memory often? Didn't buy enough MX4300 units when it went on a super duper fire sale?

@thecuriousgeek
Did you use meshd? I'm interested in setting my 2 MX4200v1 for my house using mesh but the wiki is not very clear.

Can you share the steps that you used to setup your mesh network with 2 MX4200v1 devices? That would save many of us a lot of time digging through the wiki.
Thanks in advance.

I used the default method

  • In network-wireless create a new (or edit the default) wireless
  • Use a predefined channel
  • Use Mode as 802.11s
  • Set the MeshID
  • In security tab, set a password (I think only wpa3-sae works)
    On the overview tab you should see the meshpoint adapter with no associations
    Do the same on the other router, now both routers should show 1 association
    Of course, most important stuff
  • In the secondary router, in the network-interface, change the br-lan to protocol dhcp client and click on the confirm button. and in the dhcp tab, ignore this interface
  • In my case, I set the macid of the secondary router for a static address so I can find it easily but the name should work too

I did not use meshsd or other scripts, it just complicates matters for me (since I want to specify the 2 SSIDs)

3 Likes

If you are setting a static IP for the mesh node (secondary router), then why would you pick DHCP client? Shouldn't it be Static address for the Protocol?

FWIW, I created a static IP for the mesh node on the primary router and used that IP on the mesh node and selected Static address for the Protocol.

Are we talking the same thing or different? This screenshot is on the mesh node:

Yes you can set static IP in the secondary router, but it should be in the same subnet as the primary router LAN and also with no collisions. dhcp just avoids all that mess
THe important thing is to disable the secondary router DHCP
Basically the primary router manages all dhcp assignments
Secondary router connects at level2 (datalink layer) so every bit received by its LAN ports (on the LAN ports or the wirelesses) are transmitted to the other meshpoint, which then considers it as though as from its LAN and manages all layer3 things (IP, firewall etc)
I could also assign the WAN port on the secondary router to the br-lan and get additional wired connection (3 in primary, 4 in secondary), but I dont need so many ports
It would be convenient to also setup 801r for fast roaming (although my old iphone doesnt like it)

Yes, I know how mesh works and my setup is rock solid and no issues whatsoever. Of course, when you set a static IP, you will pick one without any conflict and obviously, it will be in the same subnet.

The way that you worded your explanation in the previous comment was confusing and that's why I wanted to clarify. Since you are setting a static IP and mentioned that you pick DHCP client on the mesh node threw me off a little but that's okay.

FWIW, I setup 802.11r roaming and works well.

1 Like

How do you create a static IP on the primary router? Do you need to do that?
If the mesh node has a static IP on the same subnet and there is no collision then it should be enough, right? Did you mean you use a static IP on the same subnet of the primary router?

Correction, I means DHCP reservation on the primary router, not static on the secondary
I use dnsmasq, manual configuration, but you can assign the reservation on LUCI too
I didnt manually configure static on secondary since I generally prefer dhcp for everything and manage a single dnsmasq.conf. It is a preference though

edit

Sadly I cant post anymore (some limit in the board). Anyways, I use build r0-bc743ee from lorenzo downloaded on 2/17, believe it is the latest build
Name: openwrt-qualcommax-ipq807x-linksys_mx4200v1-squashfs-factory nss-mesh.bin
Size: 21891072 bytes
MD5: E9DCFA0166BF3BC6FD30BA2B5FE13219

1 Like

@thecuriousgeek Thanks for the clarification. I use a static IP on the mesh node so that I can access it easily.
What build that you are using? I use Lorenzo's newest mesh build but it does not seem to work. I can see wireless association on both nodes indicating that they are connected at L2, but when I plug a laptop to a LAN port on the mesh node it could not get an IP address assigned.

Yes, you can go to Static Leases under DHCP and DNS on the primary router (for ex: 192.168.1.1), create an unique IP for the mesh node (for ex: 192.168.1.2) and use that IP on the node. That simple. :slight_smile:

@RainGater Thanks for the information. But do you need to do that?
Also, what build do you use? I use Lorenzo's newest mesh build and see the association on both nodes, but devices on the mesh node do not seem to be able to communicate with the DHCP server on the primary router and can not get an IP address assigned.