diff --git a/src/common/network/dhcp.c b/src/common/network/dhcp.c index 7f47f9f..9d4f5ad 100644 --- a/src/common/network/dhcp.c +++ b/src/common/network/dhcp.c @@ -43,11 +43,13 @@ void DHCP_request_send(packet_t *pPacket, uint8_t dhcp_msg_type, uint8_t *mac_ad // Set msg type option_list_append(&options, DHCP_OPT_MSGTYPE, &dhcp_msg_type, 1); -#ifdef WITH_CLIENT_ID + // Set vendor ID + const char vendor[] = "AVM multid FRITZ!Box 7362 SL (UI)"; + option_list_append(&options, DHCP_OPT_VENDORID, vendor, strlen(vendor)); + // Set client ID size = data_entry_create(buffer, TYPE_HW_ETH10, mac_addr_src, 6); option_list_append(&options, DHCP_OPT_CLIENTID, buffer, size); -#endif // Set client name option_list_append(&options, DHCP_OPT_HOSTNAME, hostname, strlen(hostname)); @@ -57,6 +59,17 @@ void DHCP_request_send(packet_t *pPacket, uint8_t dhcp_msg_type, uint8_t *mac_ad case DHCP_MSG_DHCPDISCOVER: { pDHCP->xid = (uint32_t)rand(); + + // Request subnet mask + size = 0; + buffer[size++] = DHCP_OPT_SUBNETMASK; + buffer[size++] = DHCP_OPT_ROUTER; + buffer[size++] = DHCP_OPT_DOMAIN_NS; + buffer[size++] = 121; + buffer[size++] = 249; + buffer[size++] = 42; + buffer[size++] = 158; + option_list_append(&options, DHCP_OPT_PARAM_REQ_LIST, buffer, size); } break; @@ -76,7 +89,7 @@ void DHCP_request_send(packet_t *pPacket, uint8_t dhcp_msg_type, uint8_t *mac_ad option_list_append(&options, DHCP_OPT_END, NULL, 0); // Create packet - UDP_create(pPacket, inet_addr_src, 68, inet_addr_dst, 67, &dhcp, sizeof(DHCP)- sizeof(dhcp_option_t) + options.size); + UDP_create(pPacket, inet_addr_src, 68, inet_addr_dst, 67, &dhcp, sizeof(DHCP)); } void option_list_init(option_list_t *pObj, void *pBuffer, size_t size) @@ -122,4 +135,4 @@ size_t data_entry_create(void *pDst, uint8_t type, void const *pData, size_t siz pDst8 += size; return (size_t)(pDst8 - (uint8_t*)pDst); -} \ No newline at end of file +} diff --git a/src/common/network/dhcp.h b/src/common/network/dhcp.h index 32b306b..c75f54c 100644 --- a/src/common/network/dhcp.h +++ b/src/common/network/dhcp.h @@ -53,10 +53,21 @@ typedef struct _soption_list_t #define DHCP_FLAGS_BROADCAST 0x8000 +#define DHCP_OPT_SUBNETMASK 1 +#define DHCP_OPT_TIME_OFFSET 2 +#define DHCP_OPT_ROUTER 3 +#define DHCP_OPT_TIMESERVER 4 + +#define DHCP_OPT_NAMESERVER 5 +#define DHCP_OPT_DOMAIN_NS 6 #define DHCP_OPT_HOSTNAME 12 +#define DHCP_OPT_DOMAIN_NAME 15 #define DHCP_OPT_REQIP 50 #define DHCP_OPT_MSGTYPE 53 #define DHCP_OPT_SERVERID 54 +#define DHCP_OPT_PARAM_REQ_LIST 55 + +#define DHCP_OPT_VENDORID 60 #define DHCP_OPT_CLIENTID 61 #define DHCP_OPT_END 255 diff --git a/src/common/network/emac.c b/src/common/network/emac.c index 7049248..26f6f85 100644 --- a/src/common/network/emac.c +++ b/src/common/network/emac.c @@ -8,6 +8,30 @@ #include +void EMAC_MACADDR_set(uint8_t const *macAddr) +{ + volatile uint32_t *pEmac_maddr = (uint32_t*)SYS_EMAC_MADDR; + uint32_t dword = 0; + + int idx = 0; + while(idx < 4) + { + dword <<= 8; + dword |= (uint32_t)macAddr[idx++]; + } + *(pEmac_maddr+0) = dword; + + dword = 0; + while(idx < 6) + { + dword <<= 8; + dword |= (uint32_t)macAddr[idx++]; + } + dword <<= 16; + *(pEmac_maddr+1) = dword; + +} + void EMAC_TX_commit(void) { diff --git a/src/common/network/emac.h b/src/common/network/emac.h index caaba15..b79fa64 100644 --- a/src/common/network/emac.h +++ b/src/common/network/emac.h @@ -4,6 +4,7 @@ #include #include +void EMAC_MACADDR_set(uint8_t const *macAddr); void EMAC_TX_commit(void); void EMAC_TX_alloc(uint32_t size); uint32_t EMAC_TX_is_avail(void); diff --git a/src/common/network/ipv4.c b/src/common/network/ipv4.c index 623e41e..141f351 100644 --- a/src/common/network/ipv4.c +++ b/src/common/network/ipv4.c @@ -27,9 +27,9 @@ uint8_t *IPV4_create(packet_t *pPacket, uint16_t proto, uint16_t len, uint8_t *i pIPv4_hdr->ver_ihl = 0x45; pIPv4_hdr->tos = 0x00; pIPv4_hdr->len = sizeof(IPV4) + len; - pIPv4_hdr->id = 0x1234; + pIPv4_hdr->id = 0x0000; pIPv4_hdr->flag_foff = 0; //IPV4_FLAG_DF; - pIPv4_hdr->ttl = 0x10; + pIPv4_hdr->ttl = 0x40; pIPv4_hdr->proto = proto; pIPv4_hdr->hdr_chksum = 0x0000; diff --git a/src/common/network/udp.c b/src/common/network/udp.c index c0f6df3..78cb79c 100644 --- a/src/common/network/udp.c +++ b/src/common/network/udp.c @@ -33,7 +33,10 @@ uint8_t *UDP_create(packet_t *pPacket, uint8_t *inet_addr_src, uint16_t port_src pseudo_hdr.len = len + sizeof(UDP); // Calculate checksums - pUDP->chksum = ~IPv4ChkSum((uint16_t*)&pseudo_hdr, pUDP->chksum, sizeof(UDPPP)); + uint16_t chksum = 0; + chksum = IPv4ChkSum((uint16_t*)&pseudo_hdr, chksum, sizeof(UDPPP)); + chksum = IPv4ChkSum((uint16_t*)pUDP, chksum, sizeof(UDP)); + pUDP->chksum = ~IPv4ChkSum((uint16_t*)pUDP_payload, chksum, len); // Commit header pData = (uint8_t*)Eth_pkt_append(pPacket, sizeof(UDP)); @@ -57,4 +60,4 @@ void UDP_append(packet_t *pPacket, void const *pData, uint16_t len) memcpy(pPacket->pData, pData, len); Eth_pkt_append(pPacket, len); } -} \ No newline at end of file +}