Difference between revisions of "Didj Enable Networking"

From eLinux.org
Jump to: navigation, search
(Set up Dropbear)
(Set up Dropbear)
Line 207: Line 207:
 
a) You followed the previous steps to set up networking and users.  
 
a) You followed the previous steps to set up networking and users.  
  
b) You have a working cross-compiler (see http://elinux.org/Didj_Build_Environment).
+
b) You have [[LeapFrog_Pollux_Platform:_Build_Environment| Set up the Build Environment]]
  
  
Line 218: Line 218:
  
 
''On the host:''  
 
''On the host:''  
<code>
+
  $ wget http://matt.ucc.asn.au/dropbear/releases/dropbear-0.52.tar.gz
  wget http://matt.ucc.asn.au/dropbear/releases/dropbear-0.52.tar.gz
+
</code>
+
 
+
  
 
Untar the file and go into the resulting directory.
 
Untar the file and go into the resulting directory.
Line 227: Line 224:
  
 
''On the host:''  
 
''On the host:''  
<code>
+
  $ tar -xvzf dropbear-0.52.tar.gz
  tar -xvzf dropbear-0.52.tar.gz
+
  $ cd dropbear-0.52
  cd dropbear-0.52
+
</code>
+
  
  
(Optional step: If desired, customize dropbear by editing options.h)
+
''' Optional '''
 
+
Edit options.h in the dropbear source directory.
''On the host:''
+
<code>
+
vim options.h
+
</code>
+
  
  
Line 244: Line 235:
  
 
''On the host:''  
 
''On the host:''  
<code>
+
  $ export CC=arm-linux-uclibcgnueabi-gcc
  export CC=arm-linux-uclibcgnueabi-gcc
+
  $ ./configure --host=arm-linux-uclibcgnueabi --disable-zlib --disable-syslog -disable-lastlog
  ./configure --host=arm-linux-uclibcgnueabi --disable-zlib --disable-syslog
+
</code>
+
 
+
  
 
Compile Dropbear (In this example, we create a single statically-linked executable that, like Busybox, encompases a number of programs.)
 
Compile Dropbear (In this example, we create a single statically-linked executable that, like Busybox, encompases a number of programs.)
  
 
''On the host:''
 
''On the host:''
<code>
+
  $ make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp" STATIC=1 MULTI=1
  make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp" STATIC=1 MULTI=1
+
</code>
+
 
+
  
 
To reduce the size of the resulting binary file, strip the symbols:
 
To reduce the size of the resulting binary file, strip the symbols:
  
 
''On the host:''  
 
''On the host:''  
<code>
+
  $ arm-linux-uclibcgnueabi-strip dropbearmulti
  arm-linux-uclibcgnueabi-strip dropbearmulti
+
</code>
+
 
+
  
 
'''Move Dropbear to your Didj'''
 
'''Move Dropbear to your Didj'''
Line 291: Line 273:
  
 
The Didj should mount itself (if it doesn't, you can use the Disk Utility.)
 
The Didj should mount itself (if it doesn't, you can use the Disk Utility.)
 
  
 
Copy dropbearmulti to the mounted Didj directory (this is the /Didj directory on the device), and then unmount the Didj.
 
Copy dropbearmulti to the mounted Didj directory (this is the /Didj directory on the device), and then unmount the Didj.
  
 
''On the host:''  
 
''On the host:''  
<code>
+
  $ cp dropbearmulti /mnt/Didj
  cp dropbearmulti /mnt/Didj
+
  $ umount /mnt/Didj
  umount /mnt/Didj
+
</code>
+
 
+
  
 
Then, on the Didj console, disable mass_storage (which results in /Didj mounting on the device)
 
Then, on the Didj console, disable mass_storage (which results in /Didj mounting on the device)
  
 
''On the Didj console:''  
 
''On the Didj console:''  
<code>
+
  # usbctl -d mass_storage -a disable
  usbctl -d mass_storage -a disable  
+
</code>
+
 
+
  
 
Move dropbearmulti to its final home, and create symlinks for the dropbear programs.
 
Move dropbearmulti to its final home, and create symlinks for the dropbear programs.
  
 
''On the Didj console:''  
 
''On the Didj console:''  
<code>
+
  # mount -o remount, rw /
  mount -o remount, rw /
+
  # cp /Didj/dropbearmulti /bin
  cp /Didj/dropbearmulti /bin
+
  # cd /bin
  cd /bin
+
  # ln -s dropbearmulti dropbear
  ln -s dropbearmulti dropbear
+
  # ln -s dropbearmulti dbclient
  ln -s dropbearmulti dbclient
+
  # ln -s dropbearmulti dropbearkey
  ln -s dropbearmulti dropbearkey
+
  # ln -s dropbearmulti dropbearconvert
  ln -s dropbearmulti dropbearconvert
+
  # ln -s dropbearmulti scp
  ln -s dropbearmulti scp
+
cd /usr/bin
+
ln -s dropbearmulti ../../bin/dropbear
+
ln -s dropbearmulti ../../bin/dbclient
+
ln -s dropbearmulti ../../bin/dropbearkey
+
ln -s dropbearmulti ../../bin/dropbearconvert
+
ln -s dropbearmulti ../../bin/scp
+
</code>
+
 
+
  
 
Lastly, create the default directory for the encryption keys, and then generate the keys:
 
Lastly, create the default directory for the encryption keys, and then generate the keys:
  
 
''On the Didj console:''
 
''On the Didj console:''
<code>
+
  # mkdir /etc/dropbear
  mkdir /etc/dropbear
+
  # dropbearkey -t rsa -s 1024 -f /etc/dropbear/dropbear_rsa_host_key
  dropbearkey -t rsa -s 1024 -f /etc/dropbear/dropbear_rsa_host_key
+
  # dropbearkey -t dss -f /etc/dropbear/dropbear_dss_host_key
  dropbearkey -t dss -f /etc/dropbear/dropbear_dss_host_key
+
</code>
+
  
 
'''Running Dropbear'''
 
'''Running Dropbear'''
Line 345: Line 309:
  
 
''On the Didj console:''  
 
''On the Didj console:''  
use -F option to run in foreground
+
  # dropbear -a
<code>
+
  dropbear -a
+
</code>
+
  
 
And SSH in from your host! (assumes you have created a user named 'didj')
 
And SSH in from your host! (assumes you have created a user named 'didj')
  
 
''On the host:''  
 
''On the host:''  
<code>
+
  $ ssh didj@10.0.0.1
  ssh didj@10.0.0.1
+
</code>
+
  
 
== Netcat ==
 
== Netcat ==

Revision as of 06:17, 8 July 2011

Revision History

Rev 1.0 2010/04/06 nirvous

Rev 1.1 2010/04/16 nirvous

Introduction

This how-to outlines the basic steps to enabling networking via the USB gadget Ethernet driver (g_ether) contained in the LF 2009 sources.

Following the steps contained herein should result in a functioning Ethernet connection and the ability to telnet into the device via USB.

The steps have been tested on Ubuntu 8.04 Hardy Heron (2.6.24 kernel). Similar steps are also known to work on kernel versions up to 2.6.25.

(Note: There may be other more-efficient ways to go about these steps, we can improve this document as those emerge.)

At this time, more-recent kernels than 2.6.25 will not support communications with the this version of g_ether (for Ubuntu users, this means that versions later than Hardy are not working at this time.)

The version of g_ether we are using does not support Windows at this time (due to what seems to be a broken RNDIS implementation in this version of ether.c).

To-dos: Investigate and address enabling g_ether connectivity to hosts running recent linux kernels, Windows, OS X...


Technical Requirements

1. Console Access

2. Set up your Build Environment

3. Source Code (Didj-Linux-4222-20090422-1236.tar.gz)

4. Host running a compatible linux kernel (ex: Ubuntu 8.04 Hardy)

5. Cartridge

Kernel Configuration

Out of the box, neither networking support nor the PTY devices used by busybox/telnetd are enabled in the stock Didj kernel

To add this support, make a custom kernel.

Making a custom kernel for networking and PTY support

Next you need to configure your kernel using make menuconfig

cd SOURCE_CODE/linux-2.6.20-lf1000
make menuconfig


When the menu system launches, enable the following:

  1. Networking
    1. Select: Networking-> Networking Options-> TCP/IP Networking
    2. Make sure its selected if not hit Spacebar to select TCP/IP Networking.
    3. Exit back to the main menu.
  2. USB Ethernet support
    1. Select: Device Drivers-> USB Support-> USB Gadget Support
    2. Hit spacebar to select USB Gadget Support
    3. Select: Ethernet Gadget (with CDC Ethernet support)
    4. Hit Spacebar to configure it as a kernel module <M>. Note: RNDIS support is listed, but it is broken, so deselect it.
    5. Exit up to device drivers
  3. PTY device support (for telnetd)
    1. Select: Device Drivers->Character Drivers->Unix98 PTY Support
    2. Hit Spacebar to select <*>
    3. Select: Device Drivers->Character Drivers->Legacy (BSD) PTY Support
    4. Hit Spacebar to select
    5. If its not already pre-set, set 'Maximum number of legacy PTY in use' at 256
  4. Exit all the way out of the menu application, making sure to save the changes when prompted.
  5. Compile the kernel and g_ether module by running the make_rootfs.sh script as described in http://elinux.org/Didj_Kernel_Build_Environment

Transferring (or installing) the custom kernel onto the Didj

You can do this in one of two ways

The safest way is via UART boot (see http://elinux.org/Didj_Boot_From_UART)

Or, you can burn your custom kernel to the Didj NAND. (Remember, though, that NAND writes can have destructive consequences)

  • Back up the didj NAND partitions:

http://www.hackerfoundry.com/forums/viewtopic.php?f=4&t=7&hilit=mounting&start=210#p255

  • Create a kernel.bin

http://elinux.org/Didj_Kernel_Build_Environment#Create_kernel.bin

  • Write it to the NAND

http://www.hackerfoundry.com/forums/viewtopic.php?f=4&t=7&start=220#p263

Installing g_ether.ko

First, boot the device, connect the USB cable, and mount the device as a drive.

You'll find g_ether.ko in your kernel sources directory tree:

SOURCE_CODE/linux-2.6.20-lf1000/drivers/usb/gadget/g_ether.ko


Copy this to your Didj.

Inserting the g_ether.ko kernel module

First, if its still connected, unmount the /Didj partition from your host.

Then, mount /Didj on your Didj:

On the Didj:

$ usbctl -d mass_storage -a disable
Mounting /dev/mtdblock9 on /Didj as rw

remove the g_file_storage kernel module:

$rmmod g_file_storage

and install g_ether.ko:

$ cd /Didj
$ insmod ./g_ether.ko 
ether gadget: using random self ethernet address
usb0: Ethernet Gadget, version: May Day 2005
usb0: using lf1000_udc, OUT ep2-bulk IN ep1-bulk
usb0: MAC 46:ac:79:6e:92:e2
usb0: high speed config #1: 100 mA, Ethernet Gadget, using CDC Ethernet Subset
ether gadget: set_interface ignored!

Set up TCP/IP

With the USB cable still connected to your host, configure an IP address (make sure this is a different subnet from your existing LAN).

On the Didj:

<code>

#ifconfig usb0 10.0.0.2 netmask 255.255.255.0


On the host:

#sudo ifconfig usb0 10.0.0.1 netmask 255.255.255.0

At this point you should be able to ping from one machine to the other.

On the host:

#ping 10.0.0.2

On the Didj:

#ping 10.0.0.1

Set up telnetd

Configuring PTY devices – telnetd requires these devices to be configured in order to run

On the Didj:

#mkdir --mode=755 /dev/pts
#mknod -m=666 /dev/ptmx c 5 2 
#mount -t devpts none /dev/pts  


Create a user:

On the Didj:

#touch /etc/group
#echo root:x:0:0:root:/root:/ > /etc/passwd
#adduser -H didj
(this will prompt you for a password, can leave blank)

Run Telnetd

as a background daemon

#telnetd 

or in the foreground

#telnetd -F

At this point you should be able to telnet from the host to the device.

Set up Dropbear

(Dropbear is a relatively small SSH 2 server and client.)


Assumptions

a) You followed the previous steps to set up networking and users.

b) You have Set up the Build Environment


Compiling dropbear

On your Linux host, obtain the dropbear tarball from http://matt.ucc.asn.au/dropbear/dropbear.html

For example:

On the host:

$ wget http://matt.ucc.asn.au/dropbear/releases/dropbear-0.52.tar.gz

Untar the file and go into the resulting directory. For example:

On the host:

$ tar -xvzf dropbear-0.52.tar.gz
$ cd dropbear-0.52


Optional Edit options.h in the dropbear source directory.


Set up the CC variable and then configure the compilation. (In this example we add directives to disable zlib and syslog)

On the host:

$ export CC=arm-linux-uclibcgnueabi-gcc
$ ./configure --host=arm-linux-uclibcgnueabi --disable-zlib --disable-syslog -disable-lastlog

Compile Dropbear (In this example, we create a single statically-linked executable that, like Busybox, encompases a number of programs.)

On the host:

$ make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp" STATIC=1 MULTI=1

To reduce the size of the resulting binary file, strip the symbols:

On the host:

$ arm-linux-uclibcgnueabi-strip dropbearmulti

Move Dropbear to your Didj

In this example, we use the Didj as a USB storage device. See http://elinux.org/Didj_USB_Mounting and http://elinux.org/Didj_SCSI_Commands

Attach the USB cable and power up your Didj.

Type dmsg and locate the scsi device that corresponds to your Didj.

On the host:

#dmesg
...lots of messages...
kernel: sd 5:0:0:0: Attached scsi generic sg2 type 0


Issue a scsi unlock command.

On the host:

sg_raw /dev/sg2 C2 00 00 00 00 00 00 00 00 00 

The Didj should mount itself (if it doesn't, you can use the Disk Utility.)

Copy dropbearmulti to the mounted Didj directory (this is the /Didj directory on the device), and then unmount the Didj.

On the host:

$ cp dropbearmulti /mnt/Didj
$ umount /mnt/Didj

Then, on the Didj console, disable mass_storage (which results in /Didj mounting on the device)

On the Didj console:

# usbctl -d mass_storage -a disable

Move dropbearmulti to its final home, and create symlinks for the dropbear programs.

On the Didj console:

# mount -o remount, rw /
# cp /Didj/dropbearmulti /bin
# cd /bin
# ln -s dropbearmulti dropbear
# ln -s dropbearmulti dbclient
# ln -s dropbearmulti dropbearkey
# ln -s dropbearmulti dropbearconvert
# ln -s dropbearmulti scp

Lastly, create the default directory for the encryption keys, and then generate the keys:

On the Didj console:

# mkdir /etc/dropbear
# dropbearkey -t rsa -s 1024 -f /etc/dropbear/dropbear_rsa_host_key
# dropbearkey -t dss -f /etc/dropbear/dropbear_dss_host_key

Running Dropbear

Now launch dropbear...

On the Didj console:

# dropbear -a

And SSH in from your host! (assumes you have created a user named 'didj')

On the host:

$ ssh didj@10.0.0.1

Netcat

Note the IP address that you assigned to the Didj, for example 10.0.0.1. To copy a file, for example "./myfile" from your PC to the Didj:

On the Didj, run:

 # nc -p 5600 -l -w 30 > myfile

On the host, run:

 $ nc 10.0.0.1 5600 -w 2 < myfile

When nc exits, you should see the file on the Didj.

Acknowledgments

Many thanks to ca0abinary, doh, jburks, Moogle, PhilKll, zuccini, and many others both in the didj forum and on #Didj for their insight (and patience!).