| #!/bin/bash |
| |
| PRODUCT_STRING="Mendel" |
| MANUFACTURER_STRING="Google,LLC" |
| PRODUCT_ID="0x9303" |
| VENDOR_ID="0x18d1" |
| USB_VER="0x0200" |
| DEV_CLASS="2" |
| SERIAL_NUMBER=$(hostname) |
| ECM_MAC_ADDR="02:22:78:0d:f6:df" |
| RNDIS_DEV_MAC_ADDR="02:22:78:0d:f6:de" |
| RNDIS_HOST_MAC_ADDR="02:22:78:0d:f6:dd" |
| |
| USB_VER="0x0200" # USB 2.0 |
| DEV_CLASS="2" |
| ATTR="0x80" # Bus Powered |
| MAX_POWER="500" |
| CFG1_NAME="RNDIS" |
| CFG2_NAME="CDC" |
| |
| MS_VENDOR_CODE="0xcd" # Microsoft |
| MS_QW_SIGN="MSFT100" # Microsoft |
| MS_COMPAT_ID="RNDIS" |
| MS_SUBCOMPAT_ID="5162001" |
| |
| # Remove the mendel ethernet connection |
| remove_mendel_connection() { |
| nmcli connection delete "gadget${1}" || true |
| } |
| remove_mendel_connection 0 |
| remove_mendel_connection 1 |
| |
| # Setup the USB Gadget device |
| CONFIGFS_PATH=/sys/kernel/config |
| USB_GADGET_PATH=$CONFIGFS_PATH/usb_gadget |
| MENDEL_GADGET_PATH=$USB_GADGET_PATH/g1 |
| mkdir -p ${MENDEL_GADGET_PATH} |
| |
| echo "${USB_VER}" > ${MENDEL_GADGET_PATH}/bcdUSB |
| echo "${DEV_CLASS}" > ${MENDEL_GADGET_PATH}/bDeviceClass |
| echo "${PRODUCT_ID}" > ${MENDEL_GADGET_PATH}/idProduct |
| echo "${VENDOR_ID}" > ${MENDEL_GADGET_PATH}/idVendor |
| mkdir -p ${MENDEL_GADGET_PATH}/strings/0x409 |
| echo "${SERIAL_NUMBER}" > ${MENDEL_GADGET_PATH}/strings/0x409/serialnumber |
| echo "${MANUFACTURER_STRING}" > ${MENDEL_GADGET_PATH}/strings/0x409/manufacturer |
| echo "${PRODUCT_STRING}" > ${MENDEL_GADGET_PATH}/strings/0x409/product |
| |
| # Create Config 1 for CDC |
| MENDEL_CONFIG1_PATH="${MENDEL_GADGET_PATH}/configs/c.1" |
| mkdir -p "${MENDEL_CONFIG1_PATH}" |
| echo "${ATTR}" > "${MENDEL_CONFIG1_PATH}/bmAttributes" |
| echo "${MAX_POWER}" > ${MENDEL_CONFIG1_PATH}/MaxPower |
| mkdir -p ${MENDEL_CONFIG1_PATH}/strings/0x409 |
| echo "${CFG1_NAME}" > ${MENDEL_CONFIG1_PATH}/strings/0x409/configuration |
| |
| # Create Config 2 for RNDIS |
| MENDEL_CONFIG2_PATH="${MENDEL_GADGET_PATH}/configs/c.2" |
| mkdir -p "${MENDEL_CONFIG2_PATH}" |
| echo "${ATTR}" > "${MENDEL_CONFIG2_PATH}/bmAttributes" |
| echo "${MAX_POWER}" > ${MENDEL_CONFIG2_PATH}/MaxPower |
| mkdir -p ${MENDEL_CONFIG2_PATH}/strings/0x409 |
| echo "${CFG2_NAME}" > ${MENDEL_CONFIG2_PATH}/strings/0x409/configuration |
| |
| # Windows Specific Configuration |
| echo "1" > "${MENDEL_GADGET_PATH}/os_desc/use" |
| echo "${MS_VENDOR_CODE}" > "${MENDEL_GADGET_PATH}/os_desc/b_vendor_code" |
| echo "${MS_QW_SIGN}" > "${MENDEL_GADGET_PATH}/os_desc/qw_sign" |
| |
| # Create RNDIS Function |
| FUNCTION_RNDIS0="${MENDEL_GADGET_PATH}/functions/rndis.0" |
| mkdir "${FUNCTION_RNDIS0}" |
| echo "${RNDIS_DEV_MAC_ADDR}" > "${FUNCTION_RNDIS0}/dev_addr" |
| echo "${RNDIS_HOST_MAC_ADDR}" > "${FUNCTION_RNDIS0}/host_addr" |
| echo "${MS_COMPAT_ID}" > "${FUNCTION_RNDIS0}/os_desc/interface.rndis/compatible_id" |
| echo "${MS_SUBCOMPAT_ID}" > "${FUNCTION_RNDIS0}/os_desc/interface.rndis/sub_compatible_id" |
| echo "RNDIS" > "${FUNCTION_RNDIS0}/os_desc/interface.rndis/compatible_id" |
| |
| FUNCTION_ACM0="${MENDEL_GADGET_PATH}/functions/acm.0" |
| mkdir "${FUNCTION_ACM0}" |
| |
| # Create the ECM0 Function |
| FUNCTION_ECM0="${MENDEL_GADGET_PATH}/functions/ecm.0" |
| mkdir "${FUNCTION_ECM0}" |
| echo "${ECM_MAC_ADDR}" > "${FUNCTION_ECM0}/dev_addr" |
| find ${FUNCTION_ECM0} |
| |
| |
| ln -s "${FUNCTION_RNDIS0}" "${MENDEL_CONFIG2_PATH}" |
| ln -s "${FUNCTION_ACM0}" "${MENDEL_CONFIG1_PATH}" |
| ln -s "${FUNCTION_ACM0}" "${MENDEL_CONFIG2_PATH}" |
| ln -s "${FUNCTION_ECM0}" "${MENDEL_CONFIG1_PATH}" |
| ln -s "${MENDEL_CONFIG2_PATH}" "${MENDEL_GADGET_PATH}/os_desc" |
| |
| UDC=$(echo -n $(ls /sys/class/udc/|head -c -1 -n 1)) |
| echo $UDC |
| sleep 1 |
| echo $UDC > "${MENDEL_GADGET_PATH}/UDC" |
| |
| # Set a static ip for the gadget ethernet |
| configure_network() { |
| GADGET_CON_NAME="gadget${1}" |
| INTERFACE_NAME="usb${1}" |
| $(nmcli con show | grep -q "${GADGET_CON_NAME}") |
| mendel_conn_exist=$? |
| if [[ "$mendel_conn_exist" -eq 0 ]]; then |
| echo "${GADGET_CON_NAME} connection already exists" |
| else |
| nmcli con add con-name "${GADGET_CON_NAME}" ifname "${INTERFACE_NAME}" type ethernet ip4 "192.168.10${1}.2/24" |
| fi |
| nmcli con up id "${GADGET_CON_NAME}" |
| } |
| |
| configure_network 0 |
| configure_network 1 |