From a6d0b2afbc22622e5c7efb8a30f2781a84d6c4b1 Mon Sep 17 00:00:00 2001 From: Max Krummenacher Date: Fri, 18 Jul 2014 22:22:08 +0200 Subject: usb-rndis: add config for g_ether.ko solution i.MX6 and Vybrid modules use the g_ether driver for RNDIS functionality. This commit uses a systemd service to load the kernel module, configures the new usb0 NIC and starts a dhcp server to serve an IP address to a USB host. The Tegras use the android gadget driver. The configuration remains unchanged. --- recipes-core/usb-rndis/files/start-rndis.sh | 8 +- recipes-core/usb-rndis/files/tegra/start-rndis.sh | 15 +++ .../usb-rndis/files/tegra/udhcpd-usb-rndis.conf | 115 +++++++++++++++++++++ recipes-core/usb-rndis/files/tegra/usb-rndis.rules | 2 + recipes-core/usb-rndis/files/udhcpd-usb-rndis.conf | 2 +- recipes-core/usb-rndis/files/usb-rndis.rules | 2 - recipes-core/usb-rndis/files/usb-rndis.service | 9 +- recipes-core/usb-rndis/usb-rndis-systemd.bb | 25 ++++- 8 files changed, 163 insertions(+), 15 deletions(-) create mode 100644 recipes-core/usb-rndis/files/tegra/start-rndis.sh create mode 100644 recipes-core/usb-rndis/files/tegra/udhcpd-usb-rndis.conf create mode 100644 recipes-core/usb-rndis/files/tegra/usb-rndis.rules delete mode 100644 recipes-core/usb-rndis/files/usb-rndis.rules (limited to 'recipes-core') diff --git a/recipes-core/usb-rndis/files/start-rndis.sh b/recipes-core/usb-rndis/files/start-rndis.sh index a3b4e00..18eecfb 100644 --- a/recipes-core/usb-rndis/files/start-rndis.sh +++ b/recipes-core/usb-rndis/files/start-rndis.sh @@ -2,13 +2,13 @@ # configures the usb gadget to provide rnidis, case "$1" in start) - echo 0 > /sys/class/android_usb/android0/enable - echo rndis > /sys/class/android_usb/android0/functions - echo 1 > /sys/class/android_usb/android0/enable + /sbin/modprobe g_ether dev_addr=00:14:2d:ff:ff:ff host_addr=00:14:2d:ff:ff:fe \ + sleep 1 && /sbin/ifconfig usb0 192.168.11.2 \ + && /usr/sbin/udhcpd -S /etc/udhcpd-usb-rndis.conf ;; stop) - echo 0 > /sys/class/android_usb/android0/enable + /sbin/modprobe -r g_ether ;; esac diff --git a/recipes-core/usb-rndis/files/tegra/start-rndis.sh b/recipes-core/usb-rndis/files/tegra/start-rndis.sh new file mode 100644 index 0000000..a3b4e00 --- /dev/null +++ b/recipes-core/usb-rndis/files/tegra/start-rndis.sh @@ -0,0 +1,15 @@ +#!/bin/sh +# configures the usb gadget to provide rnidis, +case "$1" in + start) + echo 0 > /sys/class/android_usb/android0/enable + echo rndis > /sys/class/android_usb/android0/functions + echo 1 > /sys/class/android_usb/android0/enable + ;; + + stop) + echo 0 > /sys/class/android_usb/android0/enable + ;; +esac + +exit 0 diff --git a/recipes-core/usb-rndis/files/tegra/udhcpd-usb-rndis.conf b/recipes-core/usb-rndis/files/tegra/udhcpd-usb-rndis.conf new file mode 100644 index 0000000..117b940 --- /dev/null +++ b/recipes-core/usb-rndis/files/tegra/udhcpd-usb-rndis.conf @@ -0,0 +1,115 @@ +# Sample udhcpd configuration file (/etc/udhcpd.conf) +# Values shown are defaults + +# The start and end of the IP lease block +start 192.168.11.1 +end 192.168.11.1 + +# The interface that udhcpd will use +interface rndis0 + +# The maximum number of leases (includes addresses reserved +# by OFFER's, DECLINE's, and ARP conflicts). Will be corrected +# if it's bigger than IP lease block, but it ok to make it +# smaller than lease block. +max_leases 1 + +# The amount of time that an IP will be reserved (leased to nobody) +# if a DHCP decline message is received (seconds) +#decline_time 3600 + +# The amount of time that an IP will be reserved +# if an ARP conflict occurs (seconds) +#conflict_time 3600 + +# How long an offered address is reserved (seconds) +#offer_time 60 + +# If client asks for lease below this value, it will be rounded up +# to this value (seconds) +#min_lease 60 + +# The location of the pid file +#pidfile /var/run/udhcpd.pid + +# The location of the leases file +#lease_file /var/lib/misc/udhcpd.leases + +# The time period at which udhcpd will write out leases file. +# If this is 0, udhcpd will never automatically write leases file. +# Specified in seconds. +#auto_time 7200 + +# Every time udhcpd writes a leases file, the below script will be called +#notify_file # default: no script +#notify_file dumpleases # useful for debugging + +# The following are bootp specific options +# next server to use in bootstrap +#siaddr 192.168.0.22 # default: 0.0.0.0 (none) +# tftp server name +#sname zorak # default: none +# tftp file to download (e.g. kernel image) +#boot_file /var/nfs_root # default: none + +# Static leases map +#static_lease 00:60:08:11:CE:4E 192.168.0.54 +#static_lease 00:60:08:11:CE:3E 192.168.0.44 + +# The remainder of options are DHCP options and can be specified with the +# keyword 'opt' or 'option'. If an option can take multiple items, such +# as the dns option, they can be listed on the same line, or multiple +# lines. +# Examples: +#opt dns 192.168.10.2 192.168.10.10 +option subnet 255.255.255.0 +#opt router 192.168.10.2 +#opt wins 192.168.10.10 +#option dns 129.219.13.81 # appended to above DNS servers for a total of 3 +option domain usb_local +option lease 864000 # default: 10 days +#option msstaticroutes 10.0.0.0/8 10.127.0.1 # single static route +#option staticroutes 10.0.0.0/8 10.127.0.1, 10.11.12.0/24 10.11.12.1 +# Arbitrary option in hex form: +#option 0x08 01020304 # option 8: "cookie server IP addr: 1.2.3.4" + +# Currently supported options (for more info, see options.c): +#opt lease NUM +#opt subnet IP +#opt broadcast IP +#opt router IP_LIST +#opt ipttl NUM +#opt mtu NUM +#opt hostname STRING # client's hostname +#opt domain STRING # client's domain suffix +#opt search STRING_LIST # search domains +#opt nisdomain STRING +#opt timezone NUM # (localtime - UTC_time) in seconds. signed +#opt tftp STRING # tftp server name +#opt bootfile STRING # tftp file to download (e.g. kernel image) +#opt bootsize NUM # size of that file +#opt rootpath STRING # (NFS) path to mount as root fs +#opt wpad STRING +#opt serverid IP # default: server's IP +#opt message STRING # error message (udhcpd sends it on success too) +#opt vlanid NUM # 802.1P VLAN ID +#opt vlanpriority NUM # 802.1Q VLAN priority +# Options specifying server(s) +#opt dns IP_LIST +#opt wins IP_LIST +#opt nissrv IP_LIST +#opt ntpsrv IP_LIST +#opt lprsrv IP_LIST +#opt swapsrv IP +# Options specifying routes +#opt routes IP_PAIR_LIST +#opt staticroutes STATIC_ROUTES # RFC 3442 classless static route option +#opt msstaticroutes STATIC_ROUTES # same, using MS option number +# Obsolete options, no longer supported +#opt logsrv IP_LIST # 704/UDP log server (not syslog!) +#opt namesrv IP_LIST # IEN 116 name server, obsolete (August 1979!!!) +#opt cookiesrv IP_LIST # RFC 865 "quote of the day" server, rarely (never?) used +#opt timesrv IP_LIST # RFC 868 time server, rarely (never?) used +# TODO: in development +#opt userclass STRING # RFC 3004. set of LASCII strings. "I am a printer" etc +#opt sipserv STRING LIST # RFC 3361. flag byte, then: 0: domain names, 1: IP addrs \ No newline at end of file diff --git a/recipes-core/usb-rndis/files/tegra/usb-rndis.rules b/recipes-core/usb-rndis/files/tegra/usb-rndis.rules new file mode 100644 index 0000000..938e46d --- /dev/null +++ b/recipes-core/usb-rndis/files/tegra/usb-rndis.rules @@ -0,0 +1,2 @@ +#when a host connects over rndis, give the rnids0 NIC a IP address and up it +SUBSYSTEM=="android_usb", ATTR{state}=="CONFIGURED", RUN+="/bin/sh -c '/sbin/ifconfig rndis0 192.168.11.2/24 ; /usr/sbin/udhcpd -S /etc/udhcpd-usb-rndis.conf' " diff --git a/recipes-core/usb-rndis/files/udhcpd-usb-rndis.conf b/recipes-core/usb-rndis/files/udhcpd-usb-rndis.conf index 117b940..acb14b2 100644 --- a/recipes-core/usb-rndis/files/udhcpd-usb-rndis.conf +++ b/recipes-core/usb-rndis/files/udhcpd-usb-rndis.conf @@ -6,7 +6,7 @@ start 192.168.11.1 end 192.168.11.1 # The interface that udhcpd will use -interface rndis0 +interface usb0 # The maximum number of leases (includes addresses reserved # by OFFER's, DECLINE's, and ARP conflicts). Will be corrected diff --git a/recipes-core/usb-rndis/files/usb-rndis.rules b/recipes-core/usb-rndis/files/usb-rndis.rules deleted file mode 100644 index 938e46d..0000000 --- a/recipes-core/usb-rndis/files/usb-rndis.rules +++ /dev/null @@ -1,2 +0,0 @@ -#when a host connects over rndis, give the rnids0 NIC a IP address and up it -SUBSYSTEM=="android_usb", ATTR{state}=="CONFIGURED", RUN+="/bin/sh -c '/sbin/ifconfig rndis0 192.168.11.2/24 ; /usr/sbin/udhcpd -S /etc/udhcpd-usb-rndis.conf' " diff --git a/recipes-core/usb-rndis/files/usb-rndis.service b/recipes-core/usb-rndis/files/usb-rndis.service index 6592ad7..d586abc 100644 --- a/recipes-core/usb-rndis/files/usb-rndis.service +++ b/recipes-core/usb-rndis/files/usb-rndis.service @@ -1,8 +1,9 @@ -#also consult /etc/udev/ruldes.d/usb-rndis.rules +#for the tegras (Android Gadget) also consult /etc/udev/ruldes.d/usb-rndis.rules [Unit] -Description=Set the USB gadget to RNDIS -Documentation=http://permalink.gmane.org/gmane.linux.usb.general/56244 +Description=Load/Configure the kernel driver providing the RNDIS gadget +Documentation=http://www.linux-usb.org/gadget/ http://permalink.gmane.org/gmane.linux.usb.general/56244 DefaultDependencies=no +After=basic.target [Service] Type=oneshot @@ -11,4 +12,4 @@ ExecStart=/usr/bin/start-rndis.sh start ExecStop=/usr/bin/start-rndis.sh stop [Install] -WantedBy=basic.target +WantedBy=multi-user.target diff --git a/recipes-core/usb-rndis/usb-rndis-systemd.bb b/recipes-core/usb-rndis/usb-rndis-systemd.bb index 5e9c741..63cc675 100644 --- a/recipes-core/usb-rndis/usb-rndis-systemd.bb +++ b/recipes-core/usb-rndis/usb-rndis-systemd.bb @@ -8,28 +8,45 @@ LIC_FILES_CHKSUM = "file://${COREBASE}/LICENSE;md5=4d92cd373abda3937c2bc47fbc49d PR = "r1" +# Tegra Kernels: # The kernel provides with CONFIG_USB_G_ANDROID a composite gadget driver among other with RNDIS functionality. +# Others: +# The kernel provides with CONFIG_USB_ETH_RNDIS a USB gadget driver which provides RNDIS functionality. + # This package contains systemd files to configure RNDIS at startup, configures a fix IP localy and provides a dhcp server on the new interface. # Local IP is 192.168.11.2, remote IP is 192.168.11.1 inherit allarch systemd -SRC_URI = " \ +SRC_URI_COMMON = " \ file://start-rndis.sh \ file://usb-rndis.service \ + file://udhcpd-usb-rndis.conf \ +" + +SRC_URI = " \ + ${SRC_URI_COMMON} \ +" + +SRC_URI_tegra = " \ + ${SRC_URI_COMMON} \ file://usb-rndis.rules \ - file://udhcpd-usb-rndis.conf " +" do_install() { - install -d ${D}/${sysconfdir}/udev/rules.d ${D}/${bindir} + install -d ${D}/${sysconfdir} ${D}/${bindir} install -m 0755 ${WORKDIR}/start-rndis.sh ${D}/${bindir}/ - install -m 0644 ${WORKDIR}/usb-rndis.rules ${D}/${sysconfdir}/udev/rules.d/ install -m 0644 ${WORKDIR}/udhcpd-usb-rndis.conf ${D}/${sysconfdir}/ install -d ${D}${systemd_unitdir}/system/ install -m 0644 ${WORKDIR}/usb-rndis.service ${D}${systemd_unitdir}/system } +do_install_append_tegra() { + install -d ${D}/${sysconfdir}/udev/rules.d + install -m 0644 ${WORKDIR}/usb-rndis.rules ${D}/${sysconfdir}/udev/rules.d +} + NATIVE_SYSTEMD_SUPPORT = "1" SYSTEMD_PACKAGES = "${PN}" SYSTEMD_SERVICE_${PN} = "usb-rndis.service" -- cgit v1.2.3