Marquette University Master’s Thesis: A VoIP Implementation on an Embedded Platform

My master’s thesis has been published on Marquette’s website in its entirety. In a single sentence, I turned a Linsys router into a telephone. Since then, Kyle Persohn has expanded and improved the work I began.

Dell Latitute D620 Laptop Wireless and Ubuntu 11.10

After installing Ubuntu 11.04 on my Dell D620, I began noticing some wireless connectivity issues. This included delays or problems connecting to my home wireless network, increased latencies particularly when transferring files, and occasional disconnects. After upgrading to Ubuntu 11.10, the problems got worse. Doing some searching online revealed some possible solutions.

Installing the “b43-fwcutter” and “firmware-b43-installer” packages and rebooting the laptop is what ultimately worked for me.

aptitude install --quiet --assume-yes b43-fwcutter firmware-b43-installer

EVGA 680i SLI Motherboard and Ubuntu

A couple years ago, I built two servers and used EVGA 680i SLI motherboards. I chose that particular board because it had two Ethernet jacks and six SATA ports. At the time, I also purchased three SATA hard drives and a SATA optical drive. I plugged the four devices, installed Ubuntu 8.04 LTS and thought nothing of it. When I updated one of my servers to 8.10, I noticed that one of the newer kernel versions didn’t seem compatible with the drive configuration. I used an older kernel version, and eventually, I replaced SATA cables and switched the active SATA ports around. Eventually, it began working correctly on the latest kernel. I upgraded to 10.04 LTS, and things continued without incident.

However, a couple days ago when I decided to install a fourth hard drive, I again ran into the same problem. I did some searching and discovered some possible bugs. One of the solutions is to build a custom kernel. I opted to simply shuffle the SATA cables around again and moved all four hard drives to the four ports facing upward (ports 3-6) on the motherboard. I moved the optical drive to one of the two ports facing outward (port 1) on the motherboard.

EVGA 680i SATA Ports

Since the problem occurs during the boot process, and only seems to affect ports 1-2, all four hard drives function properly, and I can still boot from an optical disc or mount a disc once the computer has finished booting. Unfortunately, this solution makes adding a fifth (or sixth) hard drive impossible, but it’s a solution I am willing to live with until the problem is resolved (if it is resolved).

Fix ISP DNS Hijacking with DD-WRT

Ars Technica recently wrote up an article ISPs hijacking DNS requests to watch web searches. A couple years ago, I discovered that any time that I punched in an invalid domain name, instead of telling me the domain name did not exist, I was redirected to a search page. The search page had an opt out feature, but it reset after a few hours. I wrote a script to automatically opt myself out every few hours, but it was ineffective. When I called CenturyLink (my ISP) about this problem, they first denied it. After arguing with the representative for a while, he eventually informed me that this was how the feature was supposed to work. I asked him how that could be useful if the opt out really wasn’t an opt out. He didn’t have an answer. Eventually I opted to use alternative DNS. However, one solution for those of us running DD-WRT on our routers is to add additional DNSMasq options. While OpenDNS does honor opt outs, I still add the IP addresses they use to my configuration.

Before adding anything, pinging an invalid domain shows:

ping garbage.invalidtld
PING garbage.invalidtld ( 56(84) bytes of data.
64 bytes from ( icmp_req=1 ttl=56 time=54.4 ms

I went into the Services page of DD-WRT and added the following to the “Additional DNSMasq Options” section:


Now the same command returns the proper response:

ping garbage.invalidtld
ping: unknown host garbage.invalidtld

I could have applied the same method to filter CenturyLink’s DNS responses, but I have been happier with OpenDNS and decided not to switch back.

Google CDN URL for Dojo Changes

As Dojo suggests on their website, I opted to use Google’s copy of the Dojo Toolkit:

<script src="" type="text/javascript"></script>

This worked very well until today. After doing some digging, I realized that according to Google’s documentation, the URL has changed:

<script src="" type="text/javascript"></script>

I have to imagine that this will be bad for a lot of websites, but at least the solution is fairly simple.

Spawn a Styled xterm into Home and Disown It

First, I set up the styling (no scrollbar, font, font size, background, and foreground colors):

xterm +sb -fa monaco -fs 10 -bg black -fg white

Next, I redirected the output and backgrounded the process:

xterm +sb -fa monaco -fs 10 -bg black -fg white > /dev/null 2>&1 &

This worked well for quite a while, but when I spawn a shell in an arbitrary directory, I wanted my shell to start in home so I added:

eval $( cd ; xterm +sb -fa monaco -fs 10 -bg black -fg white > /dev/null 2>&1 & )

Finally, I wanted to fully disown the new xterm from the shell I spawned it from. Therefore, my .bash_aliases file now has:

alias term='eval $( cd ; xterm +sb -fa monaco -fs 10 -bg black -fg white > /dev/null 2>&1 & disown %1 )'

Now I can cleanly spawn a new terminal that sends no output to the existing shell.

How Nvidia Took the Fun Out of Dual Screen Xorg Configuration

Dual screen configuration used to be quite the hassle on Linux. However, Nvidia has made it incredibly easy with their nvidia-xconfig command. The “–no-logo” argument eliminates the Nvidia logo when X starts, and “–twinview” enables the second display.

nvidia-xconfig --no-logo --twinview

Now I can configure my systems for dual displays during an Ubuntu installation without the need for reinstalling an old hacked together xorg.conf file.

Adobe Flash 10 for 64-bit Ubuntu Linux

Since Ubuntu Hardy Heron, it has become much easier to install Flash on Ubuntu, but the included restricted packages always leave me a bit disappointed. Luckily, Adobe provides a proper 64-bit version of Flash for Linux called “Square”. Since I tend to automate my installations, I wrote a script to install the latest version of Flash on my computer:

#! /bin/bash

# Remove any installed Flash packages
aptitude remove --quiet --assume-yes flashplugin-installer flashplugin-nonfree

cd /tmp/
tar xzvf $FLASH
mv /usr/lib64/mozilla/plugins/

Now Flash runs properly, and with the switch to “Square,” it even seems to consume fewer resources on my machine.

MySQL Duplicate Key in Table Errors

Recently, I tried to dump data from a production database and import it locally in a development environment. I went through the normal process of dumping the data:

mysqldump database > database.sql

And importing it locally:

mysql database < database.sql

However, I quickly got a duplicate key error:

ERROR 1022 (23000) at line 1170: Can't write; duplicate key in table 'sys_tracking_archive'

After some looking, I discovered the “–insert-ignore” option:

mysqldump --insert-ignore > database.sql

The second attempt to import the data worked correctly. Alternatively, I could have replaced all instances of “INSERT” with “INSERT IGNORE” in the original SQL dump file.

Privileged SSH Port Forwarding with Sudo

There are many articles about privileged SSH port forwarding but not much about properly using SSH keys and config files.

The problem is that upon typing:

ssh dakara -L 80:localhost:80

the response is:

Privileged ports can only be forwarded by root.

The obvious solution is to just use sudo:

sudo ssh dakara -L 80:localhost:80

but this produces:

ssh: Could not resolve hostname dakara: Name or service not known

Unfortunately, “dakara” is a host configured in ~/.ssh/config and not available to root. This can be fixed with:

sudo ssh -F ~/.ssh/config dakara -L 80:localhost:80

but this tries to connect as root and prompts for a password. Adding “-l $USER” sets the user name to my user name (This could also be set in the SSH config file.), and adding “-E” to sudo preserves the environment allowing my SSH agent to be used.

sudo -E ssh -F ~/.ssh/config -l $USER dakara -L 80:localhost:80

Now everything connects, and I am not prompted for a password.