size_t ihpapi_ResetToFactoryDefaults (uint8_t sa [], uint8_t da [], size_t bufferLen, uint8_t buffer []) { size_t offset = 0; offset += EncodeEthernetHeader (buffer + offset, bufferLen - offset, da, sa); offset += EncodeIntellonHeader (buffer + offset, bufferLen - offset, (VS_FAC_DEFAULT | MMTYPE_REQ)); if (offset < sizeof (struct header_vs)) { return (0); } if (bufferLen < IHPAPI_ETHER_MIN_LEN) { errno = ERANGE; return (0); } memset (buffer + offset, 0, IHPAPI_ETHER_MIN_LEN - offset); return (IHPAPI_ETHER_MIN_LEN); }
size_t ihpapi_GetNetworkInfo (uint8_t sa [], uint8_t da [], size_t bufferLen, uint8_t buffer []) { size_t offset = 0; offset += EncodeEthernetHeader (buffer + offset, bufferLen - offset, da, sa); offset += EncodeIntellonHeader (buffer + offset, bufferLen - offset, (VS_NW_INFO | MMTYPE_REQ)); if (offset < sizeof (struct header_vs)) { return (0); } if (bufferLen < IHPAPI_ETHER_MIN_LEN) { errno = ERANGE; return (0); } if (offset < IHPAPI_ETHER_MIN_LEN) { memset (buffer + offset, 0, IHPAPI_ETHER_MIN_LEN - offset); } return (IHPAPI_ETHER_MIN_LEN); }
size_t ihpapi_GetFrequencyBandSelection (uint8_t sa [], uint8_t da [], size_t bufferLen, uint8_t buffer []) { vs_get_property_req_t* request = (vs_get_property_req_t *)(buffer); size_t offset = 0; offset += EncodeEthernetHeader (buffer + offset, bufferLen - offset, da, sa); offset += EncodeIntellonHeader (buffer + offset, bufferLen - offset, (VS_GET_PROPERTY | MMTYPE_REQ)); if (offset < sizeof (struct header_vs)) { return (0); } if (bufferLen < IHPAPI_ETHER_MIN_LEN) { errno = ERANGE; return (0); } if (offset < IHPAPI_ETHER_MIN_LEN) { memset (buffer + offset, 0, IHPAPI_ETHER_MIN_LEN - offset); } /* Unique ID for the request */ request->COOKIE = ihtonl(0); /* Output format(0x00=binary) */ request->OUTPUT_FORMAT = 0x00; /* Property format(0x00=string, 0x01=4-byte ID) */ request->PROP_FORMAT = 0x01; /* Reserved field */ request->RESERVED[0] = 0x00; request->RESERVED[1] = 0x00; /* Property version */ request->PROP_VERSION = ihtonl(0); /* Property string length, it should by 4 bytes for "ID" property format */ request->PROP_STR_LENGTH = ihtonl(4); /* Proterty string, for "ID" property format, the next 4 bytes are the ID in little endian format */ request->PRO_STR = ihtonl(109); return (IHPAPI_ETHER_MIN_LEN); }
size_t ihpapi_SetSDRAMConfig (uint8_t sa [], uint8_t da [], size_t bufferLen, uint8_t buffer [], size_t SDRAM_len, uint8_t SDRAM_buffer []) { struct __packed vs_set_sdram_req { struct header_vs header; uint8_t SDRAMCONFIG [SDRAM_MAX_LEN]; uint32_t CHECKSUM; } * request = (struct vs_set_sdram_req *)(buffer); int isLegacy; size_t offset = 0; extern struct SeqCB scb; NVMBlockHeader *hdr; TxInfo *tcb = &scb.tcb; tcb->txok = false; #if INTELLON_SAFEMODE if (bufferLen < IHPAPI_ETHER_MIN_LEN) { errno = ERANGE; return (0); } if (SDRAM_buffer == 0) { errno = EINVAL; return (0); } #endif /* Determine Config file type. */ if (SDRAM_len <= SDRAM_MAX_LEN) { if (SDRAM_len != SDRAM_MAX_LEN) { errno = ERANGE; return (0); } /* SDRAM Config file */ offset += EncodeEthernetHeader (buffer + offset, bufferLen - offset, da, sa); offset += EncodeIntellonHeader (buffer + offset, bufferLen - offset, (VS_SET_SDRAM | MMTYPE_REQ)); if (offset < sizeof (struct header_vs)) { return (0); } memcpy (request->SDRAMCONFIG, SDRAM_buffer, SDRAM_len); request->CHECKSUM = ihtonl(checksum32 ((const uint32_t *)SDRAM_buffer, (SDRAM_len >> 2), 0)); offset += SDRAM_len + sizeof (request->CHECKSUM); if (offset < IHPAPI_ETHER_MIN_LEN) { memset (buffer + offset, 0, IHPAPI_ETHER_MIN_LEN - offset); offset = IHPAPI_ETHER_MIN_LEN; } } else { /* SDRAM Configuration may be part of the NVM file - verify it! */ /* Precondition: Blank or no-flash only operation */ if (_anyset (scb.flags, scbFlag_bsy))
size_t ihpapi_ManageEnetPHY (uint8_t sa [], uint8_t da [], size_t bufferLen, uint8_t buffer [], ihpapi_enetPHYCtl_t * inputEnetPHYInfo) { struct __packed vs_enet_settings_req { struct header_vs header; uint8_t MCONTROL; uint8_t AUTONEGOTIATE; uint8_t ADVCAPS; uint8_t ESPEED; uint8_t EDUPLEX; uint8_t EFLOW_CONTROL; } * request = (struct vs_enet_settings_req *)(buffer); size_t offset = 0; offset += EncodeEthernetHeader (buffer + offset, bufferLen - offset, da, sa); offset += EncodeIntellonHeader (buffer + offset, bufferLen - offset, (VS_ENET_SETTINGS | MMTYPE_REQ)); if (offset < sizeof (struct header_vs)) { return (0); } if (bufferLen < IHPAPI_ETHER_MIN_LEN) { errno = ERANGE; return (0); } if (inputEnetPHYInfo == (ihpapi_enetPHYCtl_t *)(0)) { errno = EFAULT; return (0); } /* * reject illegal input values; */ if ( inputEnetPHYInfo->mcontrol > 0x01 || inputEnetPHYInfo->autonegotiate > 0x01 || _anyset(inputEnetPHYInfo->advcaps,0xF0) || inputEnetPHYInfo->espeed > 0x01 || inputEnetPHYInfo->eduplex > 0x01 || inputEnetPHYInfo->eflowcontrol > 0x03 ) { errno = EINVAL; return (0); } request->MCONTROL = inputEnetPHYInfo->mcontrol; request->AUTONEGOTIATE = inputEnetPHYInfo->autonegotiate; request->ADVCAPS = inputEnetPHYInfo->advcaps; request->ESPEED = inputEnetPHYInfo->espeed; request->EDUPLEX = inputEnetPHYInfo->eduplex; request->EFLOW_CONTROL =inputEnetPHYInfo->eflowcontrol; offset += 6; if (offset < IHPAPI_ETHER_MIN_LEN) { memset (buffer + offset, 0, IHPAPI_ETHER_MIN_LEN - offset); offset = IHPAPI_ETHER_MIN_LEN; } return (offset); }
size_t ihpapi_SetHgManage(uint8_t sa [], uint8_t da [], size_t bufferLen, uint8_t buffer [], T_szHgManage manage) { uint8_t wan_name_length_v = strlen(manage.wan_name) + 1; uint8_t pppoe_user_name_length_v = strlen(manage.user_name) + 1; uint8_t pppoe_password_length_v = strlen(manage.password) + 1; struct __packed vs_set_hg_manage_req { struct header_vs header; uint8_t action; uint8_t case_MainType; uint16_t case_SubType; uint8_t case_length; uint16_t RSVD; uint8_t case_val1; uint8_t case_val2; uint8_t extend_MainType; uint16_t extend_SubType; uint8_t variable_length; uint8_t wan_name_length; uint8_t wan_name[wan_name_length_v]; uint8_t vlan[2]; uint8_t vlan_priority; uint8_t acs_user_name_length; uint8_t acs_user_name[8]; uint8_t acs_password_length; uint8_t acs_password[13]; uint8_t acs_url_length; uint8_t acs_url[31]; uint8_t request_user_name_length; uint8_t request_user_name[12]; uint8_t request_password_length; uint8_t request_password[14]; uint8_t request_acs_url_length; uint8_t request_acs_url[26]; uint8_t ip_assigned_mode; uint8_t connection_protocol; uint8_t pppoe_user_name_length; uint8_t pppoe_user_name[pppoe_user_name_length_v]; uint8_t pppoe_password_length; uint8_t pppoe_password[pppoe_password_length_v]; uint8_t mng_ipv4_addr[4]; uint8_t mng_ipv4_mask[4]; uint8_t default_ipv4_gw[4]; uint8_t mng_ipv6_addr[16]; uint8_t mng_ipv6_mask; uint8_t default_ipv6_gw[16]; uint8_t dns_ipv4[4]; uint8_t dns_ipv4_copy[4]; uint8_t dns_ipv6[16]; uint8_t dns_ipv6_copy[16]; } * request = (struct vs_set_hg_manage_req *)(buffer); size_t offset = 0; offset += EncodeEthernetHeader (buffer + offset, bufferLen - offset, da, sa); //ODA,OSA,MTYPE offset += EncodeIntellonHeader (buffer + offset, bufferLen - offset, (VS_HOME_GATEWAY_OPERATION | MMTYPE_REQ)); //MMV,MMTYPE,OUI if (offset < sizeof (struct header_vs)) { return (0); } if (bufferLen < IHPAPI_ETHER_MIN_LEN) { errno = ERANGE; return (0); } if (offset < IHPAPI_ETHER_MIN_LEN) { memset (buffer + offset, 0, IHPAPI_ETHER_MIN_LEN - offset); } request->action = 0x01; request->case_MainType = 0xf7; request->case_SubType = ihtons(0x0003); request->case_length = 0x04; request->RSVD = ihtons(0); request->case_val1 = 0; request->case_val2 = 0; request->extend_MainType = 0xf8; request->extend_SubType = ihtons(0x1001); request->variable_length = wan_name_length_v + 0x08 + 0x0d + 0x1f + 0x0c + 0x0e + 0x1a + pppoe_user_name_length_v + pppoe_password_length_v; request->wan_name_length = wan_name_length_v; memcpy(request->wan_name, &manage.wan_name, wan_name_length_v); memcpy(request->vlan, &manage.vlan, 2); request->vlan_priority = manage.priority; request->acs_user_name_length = 0x08; request->acs_user_name[0] = 0x4f; request->acs_user_name[1] = 0x70; request->acs_user_name[2] = 0x65; request->acs_user_name[3] = 0x6e; request->acs_user_name[4] = 0x57; request->acs_user_name[5] = 0x52; request->acs_user_name[6] = 0x54; request->acs_user_name[7] = 0; request->acs_password_length = 0x0d; request->acs_password[0] = 0x6f; request->acs_password[1] = 0x70; request->acs_password[2] = 0x65; request->acs_password[3] = 0x6e; request->acs_password[4] = 0x77; request->acs_password[5] = 0x72; request->acs_password[6] = 0x74; request->acs_password[7] = 0x31; request->acs_password[8] = 0x32; request->acs_password[9] = 0x33; request->acs_password[10] = 0x34; request->acs_password[11] = 0x35; request->acs_password[12] = 0; request->acs_url_length = 0x1f; request->acs_url[0] = 0x68; request->acs_url[1] = 0x74; request->acs_url[2] = 0x74; request->acs_url[3] = 0x70; request->acs_url[4] = 0x3a; request->acs_url[5] = 0x2f; request->acs_url[6] = 0x2f; request->acs_url[7] = 0x31; request->acs_url[8] = 0x30; request->acs_url[9] = 0x2e; request->acs_url[10] = 0x33; request->acs_url[11] = 0x32; request->acs_url[12] = 0x2e; request->acs_url[13] = 0x31; request->acs_url[14] = 0x30; request->acs_url[15] = 0x30; request->acs_url[16] = 0x2e; request->acs_url[17] = 0x38; request->acs_url[18] = 0x2f; request->acs_url[19] = 0x73; request->acs_url[20] = 0x65; request->acs_url[21] = 0x72; request->acs_url[22] = 0x76; request->acs_url[23] = 0x65; request->acs_url[24] = 0x72; request->acs_url[25] = 0x3a; request->acs_url[26] = 0x38; request->acs_url[27] = 0x30; request->acs_url[28] = 0x38; request->acs_url[29] = 0x30; request->acs_url[30] = 0; request->request_user_name_length = 0x0c; request->request_user_name[0] = 0x74; request->request_user_name[1] = 0x65; request->request_user_name[2] = 0x73; request->request_user_name[3] = 0x74; request->request_user_name[4] = 0x5f; request->request_user_name[5] = 0x72; request->request_user_name[6] = 0x5f; request->request_user_name[7] = 0x75; request->request_user_name[8] = 0x73; request->request_user_name[9] = 0x65; request->request_user_name[10] = 0x72; request->request_user_name[11] = 0; request->request_password_length = 0x0e; request->request_password[0] = 0x74; request->request_password[1] = 0x65; request->request_password[2] = 0x73; request->request_password[3] = 0x74; request->request_password[4] = 0x5f; request->request_password[5] = 0x72; request->request_password[6] = 0x5f; request->request_password[7] = 0x70; request->request_password[8] = 0x61; request->request_password[9] = 0x73; request->request_password[10] = 0x73; request->request_password[11] = 0x77; request->request_password[12] = 0x64; request->request_password[13] = 0; request->request_acs_url_length = 0x1a; request->request_acs_url[0] = 0x68; request->request_acs_url[1] = 0x74; request->request_acs_url[2] = 0x74; request->request_acs_url[3] = 0x70; request->request_acs_url[4] = 0x3a; request->request_acs_url[5] = 0x2f; request->request_acs_url[6] = 0x2f; request->request_acs_url[7] = 0x31; request->request_acs_url[8] = 0x32; request->request_acs_url[9] = 0x37; request->request_acs_url[10] = 0x2e; request->request_acs_url[11] = 0x30; request->request_acs_url[12] = 0x2e; request->request_acs_url[13] = 0x30; request->request_acs_url[14] = 0x2e; request->request_acs_url[15] = 0x31; request->request_acs_url[16] = 0x3a; request->request_acs_url[17] = 0x39; request->request_acs_url[18] = 0xf8; request->request_acs_url[19] = 0x01; request->request_acs_url[20] = 0x10; request->request_acs_url[21] = 0x5f; request->request_acs_url[22] = 0x30; request->request_acs_url[23] = 0x39; request->request_acs_url[24] = 0x30; request->request_acs_url[25] = 0; request->ip_assigned_mode = manage.ip_assigned_mode; request->connection_protocol = manage.connection_protocol; request->pppoe_user_name_length = pppoe_user_name_length_v; memcpy(request->pppoe_user_name, manage.user_name, pppoe_user_name_length_v); request->pppoe_password_length = pppoe_password_length_v; memcpy(request->pppoe_password, manage.password, pppoe_password_length_v); memcpy(request->mng_ipv4_addr, &manage.ipv4_addr, 4); memcpy(request->mng_ipv4_mask, &manage.ipv4_mask, 4); memcpy(request->default_ipv4_gw, &manage.ipv4_gw, 4); memset(request->mng_ipv6_addr, 0, 16); request->mng_ipv6_mask = 0; memset(request->default_ipv6_gw, 0, 16); memcpy(request->dns_ipv4, &manage.dns_ipv4, 4); memcpy(request->dns_ipv4_copy, &manage.dns_ipv4_copy, 4); memset(request->dns_ipv6, 0, 16); memset(request->dns_ipv6_copy, 0, 16); return (IHPAPI_ETHER_MAX_LEN/2); }