Friday, April 25, 2008

Linksys WRT54GL Routers: Improving Performance

If you have a shared broadband (DSL, cable) connection at home, then I'm sure it is a common occurence that you find that your Internet connection becomes very slow or unusable if somebody in your home is running P2P software (BitTorrent, Kazaa, eMule, eDonkey, etc.).

This is most likely because the router that "shares" your internet connection is being overloaded by the huge number of connections that P2P softwares make. Most home routers in their default configuration, cannot meet the connection demands of P2P software.

IMHO, the best and also cheapest option for a home router is to buy a router which is capable of being updated to 3rd party Linux firmware. A few of the more popular routers which meet this criteria are the Linksys WRT54GL and the Buffalo WHR-HP-G54. I recommend the new Buffalo WHR-G125 which has a faster CPU than the older models (240Mhz vs 200Mhz) and a better WiFi chipset.

As for which 3rd party Linux firmware to use, I highly recommend the Tomato firmware, which is both easy to use and powerful. Downloads, installation instructions and source code available at http://www.polarcloud.com/tomato.

Tomato SpeedMod

Aside from just using Tomato, I have also been working on tweaking the stock Tomato firmware to gain higher performance from the router. These are some of the changes that I've made to the stock firmware:

1. Patched ip_conntrack to increase NAT hashtable size and optimized conntrack hash bucket selection filter from modulo to bitwise AND.

2. Increased the IP route cache hashtable to speed up routing when there are many connections (>4000).

3. Added fixes for network hash exploits in Linux 2.4.20 (SpeedMod 110).

4. Patched ip_conntrack_core to Linux 2.4.29 (SpeedMod 112).

5. Replaced Jenkins' lookup3 hash with MurmurHash 2.0 which is faster, this should improve overall speed (SpeedMod 117).

6. Replaced Jenkins' lookup2 hash with lookup3 which is faster, this should improve overall speed (SpeedMod 119).

With these changes, these little routers should be able to handle thousands of connections and still remain responsive. I've been in contact with Jon (author of the Tomato firmware) and he may integrate some or all these changes into the stock firmware in the future.

DOWNLOADS (Updated 01-Dec-09) Tomato 1.27 + SpeedMod 119:

Click HERE to download SpeedMod-patched Tomato 1.27 firmware for:

  • Buffalo WHR-HP-G54 / WHR-G54S
  • Linksys WRT54GL / WRT54G v1-v4
  • Linksys WRT54GS v1-v3
  • Linksys WRT54GS v4
  • Linksys WRTSL54GS
  • Motorola WR850G
Click HERE to download SpeedMod-patched Tomato 1.27 New Driver for:
  • Buffalo WHR-G125 and Asus WL-520GU
  • Linksys WRT54GL / WRT54G v4 / WRT54GS v1-v4 (experimental)
Click HERE to download current SpeedMod source code.

OLD VERSIONS:


Click HERE to download Tomato 1.25 SpeedMod 118 (Murmurhash)
Click HERE to download Tomato 1.25 ND SpeedMod 118 (Murmurhash)
Click HERE to download Tomato 1.23 SpeedMod
Click HERE to download Tomato 1.23 ND SpeedMod
Click HERE to download Tomato 1.22 SpeedMod
Click HERE to download Tomato 1.22 ND SpeedMod
Click HERE to download Tomato 1.21 SpeedMod
Click HERE to download Tomato 1.21 ND SpeedMod
Click HERE to download Tomato 1.19 SpeedMod
Click HERE to download Tomato 1.19 ND SpeedMod
Click HERE to download the old SpeedMod source (used in 1.21 and 1.19)

Not sure which version WRT54G/GS you have? Click here to check.

These patched versions were built from the Tomato sources with my patches on top. They work on my WRT54GL and WHR-HP-G54. Try them at your own risk, no guarantees!

For the geeks, if you want to recompile the Tomato source code yourself and implement my patches, download the source and follow the procedures to recompile Tomato, then untar my patches over the source directory.

With these patches, in the web admin page Advanced > Conntrack > Maximum Connections you should be able to increase the value to around 8192 (for 16MB RAM routers) and still get good response from the router. Be careful when increasing this value, because the router might run out of RAM, depending on which other features of Tomato you use.

TIP: Fix for ND versions and Intel 2200BG cards:

Telnet into the router, and issue the following commands:

nvram set wl_reg_mode=off
nvram set wl0_reg_mode=off
nvram commit
reboot

UPDATE: QOS SFQ vs PFIFO

I no longer recommend using the PFIFO qdisc for QOS, and recommend using the (default) SFQ qdisc. If you have previously used the hidden setting to enable PFIFO, you can disable it by:

nvram unset qos_pfifo
nvram commit
reboot

77 comments:

linuxera said...

Thanks Rodney! Good job.

tanjent said...

What sort of performance difference did you see between Murmur and Jenkins? I haven't had the opportunity to test it on any embedded systems.

-Austin (author of Murmurhash)

Anonymous said...

Isn't there a version for Asus WL500G Premium? The original Tomato supports this model.

Anonymous said...

Thanks Very much. I have upgraded from ver 1.15 and it looks more stable and fast...

Anonymous said...

Hi! I got a WRT54GS with 32MB RAM, will Tomato or your mod make full use of that as well? Just thought about it since you said that the RAM the problem.

/currently running tomato 1.18

Rod said...

To anonymous with WRT54GS / 32MB RAM. You're one of the lucky ones! By default I've tuned Tomato to handle a maximum of about 8192 connections. Since you have so much more RAM, you could theoretically have more connections than that, but I don't think you will need more than 8192...

I recommend you set your connection limit to 8192 and you can probably still use a lot of Tomato's features, e.g. traffic bandwidth history, etc. with no problems.

Anonymous said...

Using 1.19-ND on a WRT54GL, I have noticed that "Measure Noise Floor" causes the router to disconnect and become unresponsive - requiring a reboot.

This does not occur with the non-ND version.

I'd rather use the ND version - How important is it to "Measure Noise Floor?" Occasionally, what I've noticed is if the noise floor is not measured, then the hostnames of some clients do not show up(although, the MAC address does)

Rod said...

I found the same thing with the ND version on WRT54GL. Measure Noise Floor will make the WiFi disconnect. Its probably because the ND version has the new WiFi drivers which may have broken Tomato's "Measure Noise Floor" compatibility. But its okay since I seldom use that function anyway.

New SpeedMod update out soon, maybe tonight. I've found that the Murmurhash is actually slower than Jenkins' Lookup3, so I am going to move back to Jenkins' Lookup3. Also going to make some changes to ip route cache size.

BTW, the Rusty's brain error was due to those users hitting the ip route cache size limit, maybe because they ran out of RAM.

Mr. Zarniwoop said...

1. Both Safari and Firefox on two different computers didn't like your download links, they start displaying the .7z file in the browser. On other sites, like Jon's, I can download .7z files without issue. IE saw it as a download ok, however.

2. The experimental v1.19.8423 ND build for Linksys WRT54GL/Gv4 seems to be working fine on my old 32MB RAM WRT54GS v2.0.

I will pound the crap out of the WLAN the next few days doing torrents and Skype over wireless and let you know how it holds up.

Rod said...

@Mr. Zarniwoop,

Thanks for the note on the .7z file opening in the browser. It was a missing mime-type in my web-server. Just fixed it.

Anonymous said...

Rodney,

Thanks for this mod! Would it possible to "brand" it? For example in the web UI banner, change the version from "Version 1.19" to something like "Version 1.19 speedMod"?

Anyhow, thanks again!
-Int15

Rod said...

Hi Int15,

No plans to change the 'branding' in Tomato's UI. This is still basically Tomato, no new features except some tweaking of the Linux core. At the moment I distinguish it using the build number only. :)

Mr. Zarniwoop said...

After about a week of pounding the crap out the experimental v1.19.8427 ND build on my old 32MB RAM WRT54GS v2.0 doing torrents and Skype over wireless, I can say SpeedMod really does perform better than stock Tomato when there are a lot of connections.

When I had under 2,000 or so connections, nothing seems very different compared to stock Tomato. But, when I have large numbers of connections (up to a maximum of about 4,000 or so this past week) my home network was still very responsive and I could happily surf the web or send large emails without the "pauses" that seem to happen with stock Tomato when it has to handle lots of connections.

I use QoS and have rules to prioritize Skype and de-prioritize torrents, but with stock Tomato once there are tons of connections everything network-related just "feels" unresponsive and sluggish. With every firmware I've tried in those situations, for example, waiting 5-20 seconds for a page load that normally takes about a second was typical. With SpeedMod, over 4,000 connections doesn't "feel" any different than just a few dozen connections and web pages remain responsive.

Good stuff, hope SpeedMod it makes its way into the stock firmware.

Rod said...

Thanks for sharing your experience Mr. Zarniwoop. Thats exactly the kind of experience I wanted SpeedMod to give.

The reason I got into playing with the source code myself was because I got fed up of the 'pauses' in all the other firmwares that you mentioned when there are lots of connections.

SpeedMod's still not done though. The area I'm looking into most now is the tuning of the route cache and its garbage collector. Still trying to figure out the best combination of parameters to allow for a large hashtable but avoid overflows.

Anonymous said...

The link for the ND driver is corrupted. I can't extract the .7z, it gives me a 'file is broken' error every time. I tried downloading it several times, even using different browsers. Same thing.

Rod said...

Just tested the ND archive and it seems fine from my end. Please try to clear your browser's cache and try to download it again, or try later maybe. I suspect it could be due to a web proxy / transparent proxy caching an incomplete copy of the file.

Anonymous said...

Ok.. the ND link works now. How odd.. Must have been something with a proxy somewhere.

Anyhow, awesome mod :) I've been using tomato since about 1.05 or so, and I've noticed a huge difference with your SppedMod. I'm able to set my max connections in uTorrent MUCH higher, and still maintain a solid, trouble-free connection.

THANKS!

Anonymous said...

I feel likes the build 8427 get more download speed on bittorrent than build 8500. I'm using build 8500ND on WRT54GS v2 and i used to download 5-10 BTs at speed above 1MBps/sec and now on build 8500 I can get like half of that (500-600kbps/sec). Can you upload build 8427 again? Thanks

Rod said...

@Anonymous, the only difference between build 8500 and 8427 is the route cache parameters. It should not affect your BT speed so drastically, it could be different torrents or your ISPs changed something. I don't recommend you use 8247 as the changes in 8500 are meant to optimize the route cache garbage collector, so it should actually be a bit faster than 8427.

Anonymous said...

Thanks for this product!

Since installing this firmware in my WRT54G, I have not had any random dropped connections which were so frequent under the Linksys code.

I have one problem : I use Avira Security Suite and the Webguard module often reports this error : ERROR WRITING TO SOCKET

According to Avira this error usually means that the socket is blocked by another security application.

Could something in the Tomato configuration be causing this?

Thanks in advance for any suggestions

Rod said...

To anonymous, the error from Avira Security Suite is something to do with your PC's configuration. Maybe as you say, there is another security application running.

Tomato only runs on the router and wont affect security software running on your PC.

Posti said...

Would it be hard to add better ack packed prioritizing modification as well. What i mean is that ack would be prioritized according to to class. If you had class low packets ack would be little higher in priority between medium and low so it would effect packets in medium priority.
Current example bittorrent is flooding connection with acks and if you have prioritize acks on then your ping/latency is lousy when playing games etc.

Posti said...

I think i found the culprit behind my high pings when using ACK prioritizing and bittorrent. It seem that when i used that tomato 1.18 hidden setting to set it to use pfifo my pings got bad. Anyway works fine now when pfifo is disabled.

Rod said...

@posti: Tomato puts ACKs and pings in the highest QoS band. The pfifo or sfq qdiscs should have little effect for the highest band, since that band's bandwidth shouldn't be exceeding your total upload capacity. If you are still seeing high pings, it could be that your upload bandwidth is set too high, which will cause QoS to have little to no effect. For most cases, you have to set the upload bandwidth in the QoS config to about 85% of your actual upload bandwidth. For example, if your advertised upload bandwidth is 1000kbit/sec, then QoS only becomes effective if you set the upload bandwidth in the config to around 850kbit/sec.

Posti said...

I had ADSL sync at 2445 and upstream cap set to 2100 and latencies where great while i uploaded and downloaded around 200KB/s.
But after i started to download around 450KB/s and over they when really bad around 150-300ms.
My downstream is 9000kbit so i can download around 900KB/s. So downstream wasn't saturated.
After i lowered upstream cap to 2000 and latencies are good again. It's odd since if that upstream cap includes those acks this shouldn't have happenen.
I used pfifo in this case.
Maybe there is bug somewhere, and those ack's aren't included in upstream cap/max bandwidth calculation.

Posti said...

Addition to my last comment.

When uploaded fast as I can and downloaded around 200KB/s with bittorrent latencies where great. But after started downloading around 450KB/s + my latencies whent bad. More download speed mean more ack's. I had optimize ack packets set on.
If those ack packets are included in upstream cap then my latency should have stayed allmost the same.

Rod said...

@posti: acks and pings (icmp) are put in the "Highest" QoS band. did you set the bandwidth to 100%-100% for the "Highest" band? i'm pretty sure the acks are correctly going to the right band. you can check this by looking at the qos graphs page in tomato. i normally use "Highest" only for tcp acks/other small packets, icmp, dns and voip (udp). everything else goes to lower bands. also, i find that its pointless and actually slower to use too many bands - i myself use only 3 bands (Highest 100%-100%, High 10%-90%, Medium 1%-70%). Highest is for tcp small packets, icmp, dns, voip. High is for user applications and my servers. Medium is for bulk traffic (P2P, etc.) my downlink is about 10mbit, uplink is 1mbit.

Posti said...

Setting highest to 100%-100% helped. It seems that around 80% of adsl upstream sync i get excellent latency even with high download speed around 800-900KB/s.

Also some wierd stuff has been going on with my adsl line for couple of days. Noticed it yesterday line sync was jumping from 2600->2300->1900->1300 and between no connection.

Then i removed Annex M and set ADSL2+ to ADSL2 and everything worked again with upstream cap set to 1000. Disabling annex m lowers my upstream to around 1280kbit and don't use those new frequencies to get that 3mbit upstream. Changing ADSL2+ to ADSL2 probably didn't do anything.

Also when i used annex m even with 80% and less my latency was bad. Even with sync of 2600 and with cap 1500 my latency was bad. Probably due to lot of errors in connection.
My ISP is looking into it.
Thanks for your help.

chris said...

posti ,

there are only a handful of good CPE devices that have decent Annex M firmware - most are ordinary.

With the right CPE, Annex M is far superior to Annex A for stability.

What CPE model/firmware do you have?

Anonymous said...

Hi Rod, now that speedmod makes this router perform so much better, I and I am sure many others, feel that it is able to really support multiple users in our residential blocks/hotels. But the default Static DNS and RESTRICTION settings of of 50 make it difficult to control access. Also, UPNP settings seem to be limited to 25, with no timeout, which isn't much use for our application. The table fills up very quickly with 50-70 users. I'm sure it not only can be done, but would work well now you've spruced up the firmware. There seems to be a big demand for an easy to use router for this type of application, but I can not find one on the market. Can you help?

Thanks from us all to you and Jon for your hard work. It's appreciated.

Keith in Thailand said...

Apologies for the anonymous post, rectified here...

regards, Keith

Anonymous said...

Hi,rod
how to recompile Tomato_ND firmware.

i'm recompile Tomato it's fine,but Tomato_ND cannt.


Thank your help

nvtweak said...

To compile the ND version just delete the .c files in the release/src/shared folder that are giving you errors. You will see the duplicate .c files and .o files. Keep the prebuild .o files.

Anonymous said...

Is the Buffalo WHR-G125 currently still the best router that supports Tomato speed mod firmware, or is the new Netgear WGR614L better? If so, will there be future support for the Netgear WGR614L router?

Drft3

Anonymous said...

Does Tomato support the new ASUS WL-500gP V2 8MB/32MB routers based on bcm5354 chips. They are suppose to be exactly the same as the WHR-G125, with the added USB port, removable antenna, double the flash and ram, and built in print server.

Anonymous said...

I'm using a 500gP V2 with tomato, no
problems, works very well.
I had informed the tomato author that my V2 runs very well but he did not update his homepage. :(

And also with the initial 1.20 Tomato firmware I have no problems at all.

Ben said...

Tomato_ND & WL-500GPV2

problems

1.AIR LED cannt off automatic,when turn off Wireless.

2.RESET & SES button not support.

Rod said...

Official Tomato 1.21 Speedmod released now. I've added links to the older 1.19 version just in case.

Thanks My Zarniwoop for rhester72's earlier links. I've remove them to avoid confusion.

Louis said...

Apparently, this 1.21 Speedmod doesn't work for my WL-520GU (16M RAM). It start to stall (unable to create new TCP session) and lose telnet session when approaching 3K connection. Wait for long time still no fix. Need to reboot to fix.

Even officially 1.21 speedmod can't take 4k sessions. Once it hits the 4k mark and fallback to ~300 connections after timeout. Still no tcp session can be created, sampling by Web browsing. However, if I configure it to run 3K sessions max, and it survives.

I'm using an IP traffic generator to send 4000 UDP sessions from 100 to 500 session/s.

Rod said...

Hi Louis,

Interesting test. From your description I suspect that maybe your router ran out of free RAM.

If you haven't already tried, you can turn off unnecessary features in Tomato to increase free RAM. You can turn of logging, bandwidth history, don't use CIFS.

I've used this firmware on a 16MB router up to 6000-8000 connections before with no problem (with enough free RAM).

Demetris said...

Hi rod,
Thanks for the hard work.
I have a WHR-G125 so i downloaded
Tomato121ND-SpeedMod-8502.7z
there isnt a bin firmware for my router only a *.trx file name.
Please advice.
Is this firmware safe for my router?
Wont brick it when flashed to it?
Thanks for any help
I have contact jon an ask him if he has plans to implemment support for this router in his official one. I hope you can work together to make this firmware even better!

nvtweak said...

Demetris,
Buffalo uses .trx so yes it's safe. Uptime is 22 days on my WHR-G125. A bad lightning storm ruined my uptime :P

Anonymous said...

Where can I get this IP traffic generator?

Matt said...

I hate to be a newb, but what's the difference between regular and "New Driver"?

Anonymous said...

which one firmware file good for asus WL-520GU?

Anonymous said...

Another way you can improve performance is by adjusting..

the ammount of address your router can handle.
which explains here.
link

You can also set your dns settings to a more better server...

which a list can be found here.
link

Anonymous said...

I have been using this modified version of Tomato on my Linksys WRT54G for a few months now and just wanted to add my thanks to Rod for all of the work he has put into the changes.

Thought I would share this with you.

A couple of weeks ago I came across an article about using the router to store the HOSTS file, rather than it residing on the computer.

Using a script provided by the author of the article as a staring point, I now keep the HOSTS file on the router, and each Friday the router downloads the current HOSTS file from http://www.mvps.org, performs some maintenance on the file, and then creates a file that DNSMASQ looks for.
On my laptop, I use the router address for both the Default Gateway and Preferred DNS Server.

I have not noticed any effect on performare

Anonymous said...

Hey Rodney,

Can you update your speedmod?

Thanks :D

Jk said...

hi, anyone can help-me?? i dont talk very much inglish but lets try. the speedmod work great for me. thanks all of you. i post my question in live chat on this page but no answer. my problem is:
i've upnp enable, and a schedule reboot every day. but when reboot, it clear upnp list. i've to close emule and open it again to automatic forward ports.
is there anyway to save upnp list to nvram??

Anonymous said...

tomato 1.23 is out now! :)

Anonymous said...

QOS pfifo is no longer available in clean build?

Jk said...

Yes it is. I'm using 1.23 and qos pfifo.
I'm doing some test in qos configuration that sims work better with emule. If i'm rigth, i will share with all of you to try it (if i can explain it in ingish. we will see)

sfchains said...

I access the Tomato GUI through Firefox, and since I upgraded to 1.23 (from 1.22) I have noticed heaps of Javascript errors in the Firefox Error Console, the majority being "assignment to undeclared variables". Another is "Use of getBoxObjectFor() is deprecated. Try to use element.getBoundingClientRect
() if possible."

Anyone else seeing these entries?

Rod said...

Hi people, just came back from a long overseas trip. Speedmod just updated to 1.23.

Anonymous said...

I'm experiencing many wireless disconnections with tomato v1.23. I have a buffalo whr hp 54G router. Is tomato the cause?

Jk said...

I'he very wireless disconnects too. Betwen 8h and 13h, my wireless keep disconnect, then it comes again, then disconnect, and comes again. I've tried all mods and it's the same. I was affraid that it could be interference but i have tried all channels, 5mw to 251 and it's the same. I have a WL500gp v2. On linksys seems to work fine

Rod said...

Hi guys, Tomato shouldn't cause any problems with wireless disconnects, vs other firmwares. Try changing to a different Wifi channel if you have disconnects.

Or you can also try implementing nvram settings fix for "Intel 2200BG cards", not sure if will help or not.

Jk said...

Hi rod. I'm sorry, because it's an interference in my network that makes the wireless disconnect. I just change the firmware and the day after, all my wireless slow down. Now i see that is not a firmware problem. In my case it's interference. Sorry

web design India said...

very cool post

Anonymous said...

Hello,

I'm using the modified version of 1.23 that enables the USB port on the Asus WL-520GU (the default version does not support the USB). Can you supply a version of the USB capable 1.23 with your speed mods?

Thanks!

Anonymous said...

New official version !!!

http://www.polarcloud.com/tomato_125

lofi said...

Hi all,

I recently upgrade the tomato v1.25 firmware through tomato GUI to my buffalo WHR-HP-G54 router.

In the middle of the process it showed the error "Error erase MTD block" then follow by a reboot. After that i can't access the router.

May i know does it have any other way to access the router and re-flash the firmware?I had google it but unfortunately i can't get any relevant info.

Thanks

Rod said...

@lofi

Try the TFTP procedure mentioned here:

http://www.dd-wrt.com/wiki/index.php/Recover_from_a_Bad_Flash#Buffalo_WHR-HP-G54_soft_repair

Anonymous said...

Hi, I read all the comments and one person asked what is the difference between the "New Driver" version and the regular one.

No response was given but I'd also like to know the answer. What is the difference?

Rod said...

Use ND only for certain newer routers. Check this thread for more info:

http://www.linksysinfo.org/forums/showthread.php?t=59920

Anonymous said...

From Johnee:
This firmware is the best. Makes my router run fast and lean! When is the next iteration coming, and could you also support USB (FTP server) as a lean and mean combo?

Anonymous said...

Hi Rod,

This post http://www.linksysinfo.org/forums/showpost.php?p=338606&postcount=1 seems to imply the latest tomato has the wireless lan mod. Does that mean your "TIP: Fix for ND versions and Intel 2200BG cards:" is no longer needed for your latest verson?

Anonymous said...

Yes, it appears to be fixed in 1.25 speedmod as well. I'm pretty sure I never applied this fix myself long ago since I don't own a intel laptop so I had no problems, if someone else could confirm that reset their router settings after flashing 1.25 would be good.

# nvram get wl_reg_mode
off
# nvram get wl0_reg_mode
off
#

Rod said...

SpeedMod 118 changes:
- Changed hash functions for Linux IP fragment code (net hash exploit fix)
- Using Murmurhash instead of Jenkins for IP fragment code
- Some adjustments to the re-hash secret interval

Junianto said...

hi Rod,

from speedmod 1.17,
i'll just upgrade directly to 1.18?
or i should do some nvram reset?

Rod said...

@junianto: no nvram reset necessary, just upgrading is fine

Anonymous said...

Have you ever looked into tweaking dns? I put cache-size=10000 into Dnsmasq: Custom Configuration and after testing with ns_bench I did not notice any slowdown despite the bigger cache.

Default (150)
29.98 MB / 18.63 MB (62.14%)

Custom (10000)
29.98 MB / 17.95 MB (59.88%)


There's also a beta out for the first time so we will probably get 1.26 stable soon!
http://www.polarcloud.com/tomato

Rod said...

Yup, tweaking dnsmasq DNS cache configuration definitely helps. But it also depends, sometimes if your ISP has fast DNS servers, it might be faster to just bypass the DNS caching.

Teddy said...

It seems there's an error in the MurmurHash2 implementation in the latest SpeedMod 118. Parameter len passed to the jhash2() function is the number of *u32s* in the key. However, it's handled inside as if it was the number of *bytes*. This also affects all variations of jhash_Nword(). In my tests on the mips platform the fixed version actually was a little bit slower than lookup3. Please correct me if I'm missing something here...

Rod said...

@Teddy

Yes you are probably right. I wasnt sure how to do a direct translation of MurmurHash into a jhash2 compatible function, so probably made some mistakes there.

Any suggestions on a better implementation of the hash?

Rod said...

SpeedMod 119 changes only the hash algorithm to lookup3 instead of Murmurhash. Lookup3 looks like it performs better for this application, but the differences are minor.

Anonymous said...

Tomato 1.27 (minor update) is out