Differences

This shows you the differences between two versions of the page.

toh:d-link:dir-825 [2013/01/30 12:42]
toh:d-link:dir-825 [2014/10/12 13:01] (current)
theoradicus tag phy->nic
Line 3: Line 3:
===== Known Hardware Versions ===== ===== Known Hardware Versions =====
^ Revision ^ OpenWrt Version Supported ^ Model Specific Notes ^ ^ Revision ^ OpenWrt Version Supported ^ Model Specific Notes ^
-| A1       | **not supported** | |+| <color red> A1 </color> | **not supported** | |
| B1      | Kamikaze trunk    | working with trunk as of r18621 | | B1      | Kamikaze trunk    | working with trunk as of r18621 |
| B2      | Kamikaze trunk    | working with trunk as of r25121 | | B2      | Kamikaze trunk    | working with trunk as of r25121 |
-| B1/2    | Attitude Adjustment trunk    | Newer revisions (FW 2.05EU) store mac-addresses differently,\\ which leads to non-working wlan0/1. Working with trunk as of r29119| +| B1/2    | Attitude Adjustment trunk    | Newer revisions (FW 2.05EU) store mac-addresses differently,\\ which leads to non-working wlan0/1. Working with trunk as \\ of r29119| 
-| C1      | Barrier Breaker trunk [[https://dev.openwrt.org/changeset/35403|r35403]]    | See [[https://dev.openwrt.org/changeset/35401|r35401]], [[https://dev.openwrt.org/changeset/35402|r35402]], [[https://dev.openwrt.org/changeset/35403|r35403]] |+| C1      | Barrier Breaker trunk [[https://dev.openwrt.org/changeset/35403|r35403]]    | See [[https://dev.openwrt.org/changeset/35401|r35401]], [[https://dev.openwrt.org/changeset/35402|r35402]], [[https://dev.openwrt.org/changeset/35403|r35403]], Also see [[toh:d-link:dir-835|DIR-835]] | 
 +| <color red> D1 </color> | **not supported** | See [[https://forum.openwrt.org/viewtopic.php?id=46774|Forum]] |
-**NOTE:** B2 appears to only be different in labeling. The default firmware claims B1 and even ''/proc/cpuinfo'' claim to be B1 revisions even though the packaging and the sticker say B2.+**''Note:''** B2 appears to only be different in labeling. The default firmware claims B1 and even ''/proc/cpuinfo'' claim to be B1 revisions even though the packaging and the sticker say B2.
===== Hardware Highlights ===== ===== Hardware Highlights =====
^ HW Rev ^ CPU ^ Ram ^ Flash ^ Network ^ Gigabit ^ USB ^ Serial ^ JTag ^ ^ HW Rev ^ CPU ^ Ram ^ Flash ^ Network ^ Gigabit ^ USB ^ Serial ^ JTag ^
 +| <color red> A1 </color> | <color red> Ubicom IP5170U@? </color> | 16MB | ? | 4x1 | Yes | Yes | ? | ? |
| B1/B2 | Atheros AR7161@680MHz| 64MB | 8MB | 4x1 | Yes | Yes | Yes | Yes | | B1/B2 | Atheros AR7161@680MHz| 64MB | 8MB | 4x1 | Yes | Yes | Yes | Yes |
| C1 | Atheros AR9344@560MHz| 128MB | 16MB | 4x1 | Yes | Yes | Yes | Yes | | C1 | Atheros AR9344@560MHz| 128MB | 16MB | 4x1 | Yes | Yes | Yes | Yes |
 +| <color red> D1 </color> | <color red> Realtek RTL8197D@? </color> | ? | ? | 4x1 | Yes | Yes | ? | ? |
 +
 +**''Note:''** Although C1 has SoC of AR9344 but it's categorized under "target" of **ar71xx**. So you should find its related source code in 'trunk/target/linux/ar71xx' and its builds under [[http://downloads.openwrt.org/snapshots/trunk/ar71xx/|ar71xx/]] folder.
==== Switch Ports  ==== ==== Switch Ports  ====
Line 37: Line 42:
(worked on a B2 revision with Ubuntu's Firefox in 2.05NA and 2.06NA) (worked on a B2 revision with Ubuntu's Firefox in 2.05NA and 2.06NA)
It looks like Firmware 2.01EU behaves the same way. Please use the firmware recovery mode instead. It looks like Firmware 2.01EU behaves the same way. Please use the firmware recovery mode instead.
 +
 +**''Note:''** This method works for revision C2 with Firmware 3.00 using Ubuntu's Firefox. I used [[http://downloads.openwrt.org/snapshots/trunk/ar71xx/openwrt-ar71xx-generic-dir-825-c1-squashfs-factory.bin|openwrt-ar71xx-generic-dir-825-c1-squashfs-factory.bin]]
  - Login into the factory D-Link firmware web-interface as usual. Default procedure for the freshly purchased router is:   - Login into the factory D-Link firmware web-interface as usual. Default procedure for the freshly purchased router is:
Line 50: Line 57:
==== Installation using firmware recovery mode ==== ==== Installation using firmware recovery mode ====
 +=== Phase 1: OS specific quirks ===
<color red>**''Note:''** The firmware recovery mode has following quirks:</color> <color red>**''Note:''** The firmware recovery mode has following quirks:</color>
  * If you have a Windows machine available you can use Microsoft Internet Explorer 7 (a Windows running on a VM, like VMware, does not work)   * If you have a Windows machine available you can use Microsoft Internet Explorer 7 (a Windows running on a VM, like VMware, does not work)
    * Windows 8: Firefox cannot be used to update firmware (presumably applies to other versions of Windows).     * Windows 8: Firefox cannot be used to update firmware (presumably applies to other versions of Windows).
    * Windows 8: Use Internet Explorer 10. Press F12. Select Browser Mode: IE8. Leave the compatibility setting at IE5 Quirks.     * Windows 8: Use Internet Explorer 10. Press F12. Select Browser Mode: IE8. Leave the compatibility setting at IE5 Quirks.
 +    * Windows 7: try to turn off ipv6
  * If you are running Linux you can:   * If you are running Linux you can:
 +    * Ideally use C program below, otherwise:
    * Set your interface to 100Mbps using ''sudo ethtool -s eth0 speed 100 autoneg off'', install [[http://appdb.winehq.org/objectManager.php?sClass=version&iId=4195|IE7 in Wine]] and use it to flash.     * Set your interface to 100Mbps using ''sudo ethtool -s eth0 speed 100 autoneg off'', install [[http://appdb.winehq.org/objectManager.php?sClass=version&iId=4195|IE7 in Wine]] and use it to flash.
    * Later models (or some hardware combinations) may need ''sudo ethtool -s eth0 speed 100 duplex half autoneg off'' (e.g. B2, FW ver 2.05EU).     * Later models (or some hardware combinations) may need ''sudo ethtool -s eth0 speed 100 duplex half autoneg off'' (e.g. B2, FW ver 2.05EU).
Line 60: Line 70:
    * firmware 2.02EU should still be available on ftp.dlink.de and it doesn't require IE, nor Mac.     * firmware 2.02EU should still be available on ftp.dlink.de and it doesn't require IE, nor Mac.
    * 2.05EUB09_7 can't be downgraded to 2.04 but fortunately can be downgraded to 2.02EU     * 2.05EUB09_7 can't be downgraded to 2.04 but fortunately can be downgraded to 2.02EU
 +    * I had to disable both avahi, cups and IPv6 to get it working. (B2 FW ver 2.01EU)
  * If you are running MacOS you can use <del>Google Chrome</del> Opera   * If you are running MacOS you can use <del>Google Chrome</del> Opera
  * FW version 2.05EU seems very difficult to flash, there may be timing issues (that's just a guess). After downgrading to 2.04EU (get it from ftp.dlink.de) it worked the first time, using IE7 on a virtualbox Win XP "guest". YMMV.   * FW version 2.05EU seems very difficult to flash, there may be timing issues (that's just a guess). After downgrading to 2.04EU (get it from ftp.dlink.de) it worked the first time, using IE7 on a virtualbox Win XP "guest". YMMV.
 +=== Phase 2: General steps ===
  - Get into the D-Link recovery console with the steps below:   - Get into the D-Link recovery console with the steps below:
    - While powering up the router, press and hold the //reset button// until the power LED starts blinking orange (usually takes around 45 (forty-five) seconds )     - While powering up the router, press and hold the //reset button// until the power LED starts blinking orange (usually takes around 45 (forty-five) seconds )
Line 68: Line 80:
    - connect to http://192.168.0.1, mind the quirks!     - connect to http://192.168.0.1, mind the quirks!
  - Click "Browse" and select your OpenWrt image file (**openwrt-ar71xx-dir-825-b1-squashfs-factory.bin**, this binary image is available in the Backfire 10.03.1rc1 download directory and above)   - Click "Browse" and select your OpenWrt image file (**openwrt-ar71xx-dir-825-b1-squashfs-factory.bin**, this binary image is available in the Backfire 10.03.1rc1 download directory and above)
-  - Click "Update" and let router flash the image (don't worry if it reboots before it reaches 100%). The page should display "Device is Upgrading the Firmware" in blue letters with the current percentage in red (with an incompatible Browser it doesn't).+  - Click "Update" and let router flash the image (don't worry if it reboots before it reaches 100%). The page should display "Device is Upgrading the Firmware" in blue letters with the current percentage in red (with an incompatible Browser it doesn't). Look at the screenshot at the end of this section.
  - The router's power LED should blink orange during bootup, as soon as it stops flashing, you can connect to it   - The router's power LED should blink orange during bootup, as soon as it stops flashing, you can connect to it
  - Tip! Note that default DHCP will allocate on 192.168.**1**.x, which is different subnet to the address you allocated above. This is why you can't connect until you change your IP address.   - Tip! Note that default DHCP will allocate on 192.168.**1**.x, which is different subnet to the address you allocated above. This is why you can't connect until you change your IP address.
  - obtain new IP from the router via DHCP and follow [[doc:howto:firstlogin]]   - obtain new IP from the router via DHCP and follow [[doc:howto:firstlogin]]
 +{{:media:d-link.dir-825.b2.firmware.recovery.mode.using.ie7.on.wine.in.linux.png?400x384|D-Link DIR-825 B2 after clicking "Update" in Firmware Recovery Mode, using IE7 on Wine in Linux}}
 +
 +
 +==== Flash Layout ====
 +
 +First, for familiarity you can look at the concept of [[doc/techref/Flash Layout]]. It is also recommended that you know flash layout of DIR-825 before [[doc/howto/generic.sysupgrade]], [[doc/howto/generic.backup]], [[doc/howto/generic.debrick]] or [[doc/howto/generic.failsafe]].
 +
 +^  D-Link DIR-825 Rev B  Flash Layout  ^^^^^^^^^
 +^ Layer0 |  m25p80 [[wp>Serial Peripheral Interface Bus|spi]]0.0: s25sl064a 8192KiB  ||||||||
 +^ Layer1 |  mtd0 **//u-boot//** 256KiB  |  mtd1 **//config//** 64KiB  |  mtd7 **//firmware//** 6208KiB  |||  mtd5 **//caldata//** 64KiB  |  mtd6 **//unkown//** 1600KiB  ||
 +^ Layer2 | | |  mtd2 **//kernel//** 1024KiB  |  mtd3 **//rootfs//** 5184KiB  || | |  mtd8 **//caldata_copy//** 64KiB  |
 +^ <color magenta>mountpoint</color> | | | |  <color magenta>''/''</color>  || | | |
 +^ filesystem | | | |  [[doc:techref:filesystems#overlayfs|overlayfs]]  || | | |
 +^ Layer3 | | | | |  mtd4 **//rootfs_data//** 3328KiB  | | | |
 +^ Size in KiB |  256KiB  |  64KiB  |  1024KiB  |  1856KiB  |  3328KiB  |  64KiB  |  1536KiB  |  64KiB  |
 +^ Name |  **//u-boot//**  |  **//config//**  |  **//kernel//**  | |  **//rootfs_data//**  |  **//caldata//**  | |  **//caldata_copy//**  |
 +^ <color magenta>mountpoint</color> |  //none//  |  //none//  |  //none//  |  <color magenta>''/rom''</color>  |  <color magenta>''/overlay''</color>  |  //none//  |  //none//  |  //none//  |
 +^ filesystem |  //none//  |  //none//  |  //none//  |  [[doc:techref:filesystems#SquashFS]]  |  [[doc:techref:filesystems#JFFS2]]  |  //none//  |  //none//  |  //none//  |
 +
 +***Note*** The partitions "mtd1 **//config//**", "mtd5 **//caldata//**", "mtd6 **//unkown//**" and "mtd8 **//caldata_copy//**" contain vendor specific raw (without filesystem) config values about your router, like WiFi calibration data, MAC addresses, etc. It's a good idea to [[doc/howto/generic.backup|make a backup from them]]. Similarly, "mtd0 **//u-boot//**" has some specific codes for Dir-825 (e.g. its "firmware recovery mode"); So you can backup that partition too.
 +
 +***Note2*** You can check mtd partitions of your router yourself by using commands "''cat /proc/mtd''" and "''dmesg''". Refer to [[https://www.mail-archive.com/kernelnewbies@nl.linux.org/msg02774.html|this link]].
==== Upgrading OpenWrt ==== ==== Upgrading OpenWrt ====
->[[doc:howto:generic.sysupgrade]] ->[[doc:howto:generic.sysupgrade]]
- 
-==== Firmware recovery ==== 
-->[[doc:howto:generic.debrick]] 
==== OpenWrt failsafe mode ==== ==== OpenWrt failsafe mode ====
->[[doc:howto:generic.failsafe]] ->[[doc:howto:generic.failsafe]]
 +==== Firmware recovery ====
 +->[[doc:howto:generic.debrick]]
===== Basic configuration ===== ===== Basic configuration =====
Line 110: Line 143:
{{:toh:d-link:dir825-b2-soldered-bridges-for-second-usb-port.jpg?400x258|D-Link DIR-825 with bridges soldered to enable second USB port.}} {{:toh:d-link:dir825-b2-soldered-bridges-for-second-usb-port.jpg?400x258|D-Link DIR-825 with bridges soldered to enable second USB port.}}
{{:toh:d-link:dir825-b2-second-usb-in-action.jpg?400x251|D-Link DIR-825 B2 with second USB port in use.}} {{:toh:d-link:dir825-b2-second-usb-in-action.jpg?400x251|D-Link DIR-825 B2 with second USB port in use.}}
 +{{:media:dir-825.b2.2nd.usb.wires.order.low.res.jpg?400x300|DIR-825 B2 2nd USB Wires Order}}
{{:toh:d-link:dir825-c1-board.jpg?400x251|D-Link DIR-825 C1 board.}} {{:toh:d-link:dir825-c1-board.jpg?400x251|D-Link DIR-825 C1 board.}}
{{:toh:d-link:dir825-c1-ar9344.jpg?400x300|D-Link DIR-825 C1 Atheros chipset.}} {{:toh:d-link:dir825-c1-ar9344.jpg?400x300|D-Link DIR-825 C1 Atheros chipset.}}
Line 206: Line 240:
==== Second USB port ==== ==== Second USB port ====
It was reported that in order to enable second USB port it is sufficient to solder in two straight bridges in place of L66 (take a look to the corresponding photo in the "Photos" section). After that you will need to solder in second USB header or - easier way - to solder in short-tailed female USB type A connector (sample photo is also available in the "Photos" section). It was reported that in order to enable second USB port it is sufficient to solder in two straight bridges in place of L66 (take a look to the corresponding photo in the "Photos" section). After that you will need to solder in second USB header or - easier way - to solder in short-tailed female USB type A connector (sample photo is also available in the "Photos" section).
 +
 +In the stock firmware, after you have soldered the bridges and USB head, if you connect a USB device (e.g. a USB Flash Drive) to the second USB head, the USB LED will turn blue.
Discussion and more information can be found in this [[https://forum.openwrt.org/viewtopic.php?id=24399|thread]]. Discussion and more information can be found in this [[https://forum.openwrt.org/viewtopic.php?id=24399|thread]].
Line 237: Line 273:
Besides flashing in recovery mode from a MacBook Pro using Google Chrome and the default Gigabit plug worked just fine! Besides flashing in recovery mode from a MacBook Pro using Google Chrome and the default Gigabit plug worked just fine!
 +
 +I had installed the openwrt-ar71xx-generic-dir-825-b1-squashfs-factory.bin using a Ubuntu system with Chrome using the original firmware update page in a DI-825 Rev B1 with FW 2.07NA
----- -----
Line 454: Line 492:
Now hit the **Save & Apply** button Now hit the **Save & Apply** button
-==== 4) Setup a machine connected to VLAN ===+==== 4) Setup machine connected to VLAN ===
This are the settings of your machine (ex. FTP): This are the settings of your machine (ex. FTP):
Line 468: Line 506:
----- -----
 +
 +===== A C Program to flash DIR-825 =====
 +The following program allows you to flash the DIR-825 from Linux without need of a VM with Windows with IE6.
 +
 +The DIR-825 requires some rather peculiar TCP settings, and relies on some broken IE6 behaviour, which is why flashing with Firefox on Linux (or Firefox on Windows) doesn't work.  The ruby script on the next section does *NOT* always work for this reason (perhaps due to different versions of ruby or underlying OS having different defaults).
 +
 +I therefore have hacked on (it's not nearly my best work) a basic 'C' program that flashes the DIR-825 (and probably DIR-600/601 as well).  It uses the HTTP headers as IE6 and uses the required TCP settings under Linux.
 +
 +To use this program save as dlinkflash.c and do
 +
 +<code>
 +gcc -o dlinkflash dlinkflash.c
 +</code>
 +
 +Then copy dlinkflash to some location in your PATH, or do ./dlinkflash <firmware-filenname>
 +
 +<code c>
 +/* dlinkflash - Tool flash older d-link routers via emergency web interface
 + *
 + * You must have 192.168.0.x/24 (where X=2-254) IP address on the
 + * interface connected to the d-link and use the emergency flashing interface
 + *
 + * Copyright 2014 Daniel Dickinson
 + *
 + * This program is free software: you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
 + * the Free Software Foundation, either version 3 of the License, or
 + * (at your option) any later version.
 + *
 + * This program is distributed in the hope that it will be useful,
 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 + * GNU General Public License for more details.
 + *
 + * You should have received a copy of the GNU General Public License
 + * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 + */
 +
 +#include <sys/types.h>
 +#include <sys/socket.h>
 +#include <unistd.h>
 +#include <stdlib.h>
 +#include <regex.h>
 +#include <stdint.h>
 +#include <string.h>
 +#include <stdio.h>
 +#include <netinet/in.h>
 +#include <netinet/tcp.h>
 +#include <arpa/inet.h>
 +#include <errno.h>
 +
 +void build_post_bin(uint8_t **post, size_t *post_len, uint8_t *newdata, size_t datalen) {
 +    uint8_t *newpost = NULL;
 +   
 +    newpost = malloc((*post_len + datalen) * sizeof(uint8_t));
 +    if (*post) {
 + memcpy(newpost, *post, *post_len);
 +    } else {
 +        *post_len = 0;
 +    }
 +    memcpy(newpost + *post_len, newdata, datalen);
 +    *post_len += datalen;   
 +    if (*post)
 + free(*post);   
 +    *post = newpost;
 +}
 +
 +void build_post(uint8_t **post, size_t *post_len, char *newchar, size_t *content_len) {
 +    uint8_t *newpost = NULL;
 +    size_t nlen;
 +    build_post_bin(post, post_len, newchar, strlen(newchar));
 +    if (content_len) {
 +        *content_len += strlen(newchar);
 +    }
 +}
 +
 +void usage(char *exename) {
 +    printf("Usage: %s <filename> [-d]\n", exename);
 +    printf("  Interface attached to d-link must have IP addres 192.168.0.x/24 where x != 1\n");
 +    exit(1);
 +}
 +
 +int open_socket(void) {
 +    int sock = socket(AF_INET, SOCK_STREAM, 0);
 +    unsigned int tcpflush = 1;
 +    unsigned int recvbufsz = 512;
 +    unsigned int smallwindow = 512;
 +    unsigned int mss = 1024;
 +
 +    setsockopt(sock, SOL_SOCKET, SO_RCVBUF, &recvbufsz, sizeof(recvbufsz));
 +    setsockopt(sock, SOL_SOCKET, SO_SNDBUF, &recvbufsz, sizeof(recvbufsz));
 +    setsockopt(sock, IPPROTO_IP, TCP_NODELAY, &tcpflush, sizeof(tcpflush));
 +    setsockopt(sock, IPPROTO_IP, TCP_MAXSEG, &mss, sizeof(mss));
 +    setsockopt(sock, IPPROTO_IP, TCP_WINDOW_CLAMP, &smallwindow, sizeof(smallwindow));
 +
 +    struct sockaddr_in ipaddr;
 +    in_addr_t hostip = inet_addr("192.168.0.1");
 +    ipaddr.sin_family = AF_INET;
 +    ipaddr.sin_port = htons(80);
 +    ipaddr.sin_addr.s_addr = hostip;
 +    if (connect(sock, (struct sockaddr *)&ipaddr, sizeof(struct sockaddr)) < 0) {
 +        return -1;
 +    }
 +    return sock;
 +}
 +
 +void send_get(int *sock, uint8_t *get, size_t getlen, uint8_t *post, int debug) {
 +    size_t socksent = 0;
 +    size_t curpos = 0;
 +    *sock = open_socket();
 +    if (*sock < 0) {
 +        perror("send_get");
 +        free(get);
 +        if (post)
 +            free(post);
 +        exit(7);
 +    }
 +    while (curpos < getlen) {
 +        if ((getlen - curpos) >= 512) {
 +     socksent = send(*sock, get + curpos, 512, 0);
 +            if (debug)
 +                fprintf(stderr, "Sent %d bytes\n", socksent);
 +     if (socksent < 0) {
 +         perror("send_get");
 + close(*sock);
 + free(get);
 +                if (post)
 +     free(post);
 + exit(7);
 +            }
 + } else {
 +     socksent = send(*sock, get + curpos, getlen - curpos, 0);
 +            if (debug)
 +                fprintf(stderr, "Sent %d bytes\n", socksent);
 +     if (socksent < 0) {
 +         perror("send_get");
 + close(*sock);
 + free(get);
 +                if (post)
 +     free(post);
 + exit(7);
 +            }
 +        }
 +        curpos += socksent;
 +        printf("\r%d/%d Bytes written: GET %g%% complete                          ", curpos, getlen, ((float)curpos / (float)getlen) * (float)100);
 + fflush(stdout);
 +    }
 +    printf("\nFinished sending GET. Waiting for response.\n");
 +}
 +
 +int main(int argc, char *argv[]) {
 +    uint8_t *firmware = NULL; 
 +    uint8_t *post = NULL;
 +    size_t postlen = 0;
 +    uint8_t *get = NULL;
 +    size_t getlen = 0;
 +    uint8_t *content = NULL;
 +    size_t contentlen = 0;
 +    size_t nonnllen = 0;
 +    size_t firmwarelen = 0;
 +    char contentlenstr[1024];
 +    size_t curpos = 0;
 +    contentlenstr[0] = 0;
 +    int debug = 0;
 + 
 +    if (argc < 2) {
 + usage(argv[0]);
 +    }
 + 
 +  if (argc == 3) {
 +        if (!strncmp(argv[2], "-d", 2)) {
 +     debug = 1;
 +        } else {
 +     usage(argv[0]);
 +        }
 +    } else if (argc > 2) {
 + usage(argv[0]);
 +    }
 +
 +    printf("Load firmware file %s\n", argv[1]);
 +
 +    int firmwarefd = open(argv[1], 0);
 +    if (firmwarefd < 0) {
 + perror(argv[1]);
 + exit(1);
 +    }
 +
 +    size_t len = 0;
 +    uint8_t buf[1024];
 +    uint8_t *newfw = NULL;
 +    int sock;
 +
 +    do {
 +        len = read(firmwarefd, &buf[0], 1024);
 +        if (len < 0) {
 + perror(argv[1]);
 + close(firmwarefd);
 +        if (firmware)
 +     free(firmware);
 +            exit(2);
 + }
 +        if (len > 0) {
 +     newfw = malloc((firmwarelen + len) * sizeof(uint8_t));
 +     if (firmware)
 + memcpy(newfw, firmware, firmwarelen);
 +     memcpy(newfw + firmwarelen, &buf[0], len);
 +     firmwarelen += len;
 +     if (firmware)
 + free(firmware);
 +     firmware = newfw;
 +        }
 +    } while (len > 0);
 +    close(firmwarefd);
 +    printf("Firmware %u bytes long\n", firmwarelen);
 +
 +    build_post(&content, &contentlen, "---------------------------7de1fe13304\r\n", NULL);   
 +    nonnllen += 2;
 +    build_post(&content, &contentlen, "Content-Disposition: form-data; name=\"files\"; filename=\"C:\\My Documents\\firmware.bin\"\r\n", &nonnllen);
 +    build_post(&content, &contentlen, "Content-Type: application/octet-stream\r\n", &nonnllen);
 +    build_post(&content, &contentlen, "\r\n", &nonnllen);
 +    build_post_bin(&content, &contentlen, firmware, firmwarelen);
 +    build_post(&content, &contentlen, "\r\n---------------------------7de1fe13304--\r\n", NULL);
 +    nonnllen += 4;
 +
 +    /* IE6 off-by-one content-length error? */
 +    sprintf(contentlenstr, "%d\r\n", nonnllen + firmwarelen + 1);
 +
 +    build_post(&get, &getlen, "GET / HTTP/1.1\r\n", NULL);
 +    build_post(&get, &getlen, "Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*\r\n", NULL);
 +    build_post(&get, &getlen, "Accept-Language: en-ca\r\n", NULL);
 +    build_post(&get, &getlen, "Accept-Encoding: gzip, deflate\r\n", NULL);
 +    build_post(&get, &getlen, "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; .NET CLR 1.1.4322)\r\n", NULL);
 +    build_post(&get, &getlen, "Host: 192.168.0.1\r\n", NULL);
 +    build_post(&get, &getlen, "Connection: Keep-Alive\r\n", NULL);
 +    build_post(&get, &getlen, "\r\n", NULL);
 +
 +    build_post(&post, &postlen, "POST /cgi/index HTTP/1.1\r\n", NULL);
 +    build_post(&post, &postlen, "Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*\r\n", NULL);
 +    build_post(&post, &postlen, "Referer: http://192.168.0.1\r\n", NULL);
 +    build_post(&post, &postlen, "Accept-Language: en-ca\r\n", NULL);
 +    build_post(&post, &postlen, "Content-Type: multipart/form-data; boundary=---------------------------7de1fe13304\r\n", NULL);
 +    build_post(&post, &postlen, "Accept-Encoding: gzip, deflate\r\n", NULL);
 +    build_post(&post, &postlen, "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; .NET CLR 1.1.4322)\r\n", NULL);
 +    build_post(&post, &postlen, "Host: 192.168.0.1\r\n", NULL);
 +    build_post(&post, &postlen, "Content-Length: ", NULL);
 +    build_post(&post, &postlen, contentlenstr, NULL);
 +    build_post(&post, &postlen, "Connection: Keep-Alive\r\n", NULL);
 +    build_post(&post, &postlen, "Cache-Control: no-cache\r\n", NULL);
 +    build_post(&post, &postlen, "\r\n", NULL);
 +    build_post_bin(&post, &postlen, content, contentlen);
 +    free(content);
 +    free(firmware);
 +   
 +    printf("Initiating GET so that router is in state to receive POST....");
 +    fflush(stdout);
 +    send_get(&sock, get, getlen, post, debug);
 +    int gotlen = 0;
 +    char recvbuf[1024];
 +    int recvlen = recv(sock, &recvbuf[0], 512, MSG_WAITALL);
 +    int newrecvlen;
 +    if (debug)
 +        fprintf(stderr, "Got %d bytes\n", recvlen);
 +    if (debug) {
 +        fprintf(stderr, "%s", &recvbuf[0]);
 +    }
 +    do {
 +      if (recvlen < 0) {
 +          perror(argv[1]);
 +   close(sock);
 +      free(get);
 +   free(post);
 +   exit(8);
 +      }
 +      if (recvlen > 0) {
 +          recvlen = recv(sock, &recvbuf[0], 512, MSG_WAITALL);
 +          if (debug) {
 +       fprintf(stderr, "Got %d bytes data\n", recvlen);
 +              if (recvlen > 0)
 +                  fprintf(stderr, "%s", &recvbuf[0]);
 +          }
 +      }
 +    } while (recvlen > 0);
 +    printf("Got page from which upload is done.\n");
 +    shutdown(sock, SHUT_RDWR);
 +    close(sock);
 +    printf("Initiating transfer....");
 +    fflush(stdout);
 +    sock = open_socket();
 +    if (sock < 0) {
 +        perror(argv[1]);
 +        free(get);
 +        free(post);
 +    }
 +    size_t socksent = 0;
 +    curpos = 0;
 +    while (curpos < postlen) {
 +        if ((postlen - curpos) >= 512) {
 +     socksent = send(sock, post + curpos, 512, 0);
 +            if (debug)
 +                fprintf(stderr, "Sent %d bytes\n", socksent);
 +     if (socksent < 0) {
 +         perror(argv[1]);
 + close(sock);
 + free(post);
 + exit(5);
 +            }
 + } else {
 +     socksent = send(sock, post + curpos, postlen - curpos, 0);
 +            if (debug)
 +                fprintf(stderr, "Sent %d bytes\n", socksent);
 +     if (socksent < 0) {
 +         perror(argv[1]);
 +    free(get);
 + close(sock);
 + free(post);
 + exit(5);
 +            }
 +        }
 +        curpos += socksent;
 +        printf("\r%d/%d Bytes written: Upload %g%% complete        ", curpos, postlen, ((float)curpos / (float)postlen) * (float)100);
 + fflush(stdout);
 +    }
 +    printf("\nFinished sending post. Waiting for response.\n");
 +    free(post);
 +    regex_t pattern;
 +    if (regcomp(&pattern, "count_down", REG_NOSUB)) {
 + printf("Error compiling expression to detect success or failure\n");
 +        free(get);
 + close(sock);
 + exit(7);
 +    }
 +    recvbuf[0] = 0;
 +    recvlen = recv(sock, &recvbuf[0], 512, MSG_WAITALL);
 +    if (debug) {
 +        fprintf(stderr, "Got %d bytes\n", recvlen);
 +        fprintf(stderr, "%s", &recvbuf[0]);
 +    }
 +    int firstpacket = 1;
 +    do {
 +      if (recvlen < 0) {
 +          perror(argv[1]);
 +      free(get);
 +   close(sock);
 +   exit(6);
 +      } else if (recvlen > 0) {
 +          if (!regexec(&pattern, &recvbuf[0], 0, NULL, 0)) {
 +              printf("Firmware successfully sent.  Please wait for device to reboot.\n");
 +              break;
 +              if (firstpacket) {
 +           printf("Error sending firmware to device.  Response is:\n");
 +              }
 +       printf("%s", &recvbuf[0]);
 +          }
 +          recvlen = recv(sock, &recvbuf[0], 512, MSG_WAITALL);
 +          if (debug) {
 +       fprintf(stderr, "Got %d data\n", newrecvlen);
 +              if (recvlen > 0)
 +                fprintf(stderr, "%s", &recvbuf[0]);
 +          }
 +      }
 +      firstpacket = 0;
 +    } while (recvlen > 0);
 +    regfree(&pattern);
 +    shutdown(sock, SHUT_RDWR);
 +    close(sock);
 +    return 0;   
 +}
 +
 +</code>
===== A simple script to flash DIR-825 ===== ===== A simple script to flash DIR-825 =====
 +
 +*NB*: The ruby script on the next section does *NOT* always work for the reasons mentioned above (perhaps due to different versions of ruby or underlying OS having different defaults).
 +
We have recently developed a script and performed some correction based on your work you can find it here We have recently developed a script and performed some correction based on your work you can find it here
-http://openwisp.caspur.it/wiki/owf/FlashingDlinkDIR825#notextile-Automatic-flashing-script-notextile+You need to have ruby installed. 
 + 
 + 
 +Script recovered from the WayBackMachine: https://web.archive.org/web/20120418003158/http://openwisp.caspur.it/wiki/owf/FlashingDlinkDIR825#notextile-Automatic-flashing-script-notextile
**With this script it's not necessary to force your NIC to work @ 10/100 Mb/s and it's not necessary using IE7** **With this script it's not necessary to force your NIC to work @ 10/100 Mb/s and it's not necessary using IE7**
-===== Custom IPv6 image for DIR-825 =====+<code ruby>#!/usr/bin/ruby 
 +# Copyright (C) 2011 CASPUR (wifi@caspur.it) 
 +
 +# This program is free software: you can redistribute it and/or modify 
 +# it under the terms of the GNU General Public License as published by 
 +# the Free Software Foundation, either version 3 of the License, or 
 +# (at your option) any later version. 
 +
 +# This program is distributed in the hope that it will be useful, 
 +# but WITHOUT ANY WARRANTY; without even the implied warranty of 
 +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
 +# GNU General Public License for more details. 
 +
 +# You should have received a copy of the GNU General Public License 
 +# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-a custom image with ipv6 support: radvd, wide-dhcpv6, 3g stick support, made for RCS-RDS Fiberlink dual stack PPPoE service+# This script will help you flashing D-LINK DIR-825 devices 'cause  they can be flashed only with IE7 
-but should be okay for static wan settings on other ISPs+# Your ETH Address must be 192.168.0.100/24 
-http://www.ip6.ro/firmware/dir825/+ 
 +require 'socket' 
 + 
 +HOST = "192.168.0.1"  
 +PATH = "/cgi/index"  
 + 
 +if ARGV.count == 0 
 +  puts "Usage #{$0} <filename>"  
 +  exit 1 
 +else 
 +  filename = ARGV[0] 
 +  puts "[#{Time.now}] Using firmware file '#{filename}'"  
 +end 
 + 
 +predata = <<-eopd 
 +-----------------------------7db12928202b8 
 +Content-Disposition: form-data; name="files"; filename="#{filename}"  
 +Content-Type: application/octet-stream 
 + 
 +eopd 
 + 
 +firmware = File.open(filename, "rb") { |io| io.read } 
 + 
 +postdata="\x0d\x0a-----------------------------7db12928202b8--\x0d\x0a"  
 + 
 +# Each line must end with cr/lf characters, and we have to know how many  
 +# data the script will send to the dir-825 this is why we concatenate it before 
 +# creating the header 
 + 
 +buffer = predata.gsub(/\n/,"\x0d\x0a") + firmware + postdata 
 + 
 +header = <<-eoh 
 +POST #{PATH} HTTP/1.1 
 +Accept: image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, */* 
 +Referer: http://#{HOST}/ 
 +Accept-Language: it-IT 
 +User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0) 
 +Content-Type: multipart/form-data; boundary=---------------------------7db12928202b8 
 +Accept-Encoding: gzip, deflate 
 +Host: #{HOST} 
 +Content-Length: #{buffer.length} 
 +Connection: Keep-Alive 
 +Cache-Control: no-cache 
 + 
 +eoh 
 + 
 +begin 
 +  puts "[#{Time.now}] Firmware file laded (#{firmware.length} bytes)"  
 +  http = TCPSocket.new(HOST, 'www') 
 + 
 +  puts "[#{Time.now}] Sending firmware to the device...  "  
 + 
 +  http.print header.gsub(/\n/,"\x0d\x0a") + buffer 
 +  resp = http.recv(1012) 
 + 
 +  # Let's check if it's all ok 
 +  if resp.match /Don't turn the device off before the Upgrade jobs done/ 
 +    puts "\n[#{Time.now}] Finished. Please wait for the device to reboot."  
 +  else 
 +    puts "\n[#{Time.now}] Problem sending firmware to the device. Response from device follows."  
 +    puts resp 
 +  end 
 + 
 +  http.close 
 +  rescue Exception => e 
 +  puts "[#{Time.now}] Problem flashing device. Error: '#{e}'"  
 +end 
 + 
 +exit 0</code> 
 + 
 +===== Custom OpenWrt image with LuCi integrated ===== 
 + 
 +http://www.superwrt.eu/en/firmware/d-link-dir-825/
----- 
-{{tag>GigabitEthernet 5Port 2PHY USB 1USB JTAG 802.11abgn_simultan detachableantenna 2Ant 2Radio ath9k 64RAM 8Flash MIPS MIPS32 24Kc}} 
===== Fat images ===== ===== Fat images =====
Line 494: Line 991:
/dev/mtdblock4            2.1M    328.0K      1.8M  15% /overlay /dev/mtdblock4            2.1M    328.0K      1.8M  15% /overlay
'' ''
 +
 +===== Tags =====
 +----
 +{{tag>GigabitEthernet 5Port 2NIC USB 1USB JTAG 802.11abgn_simultan detachableantenna 2Ant 2WNIC ath9k 64RAM 8Flash MIPS MIPS32 24Kc}}

Back to top

toh/d-link/dir-825.1359546147.txt.bz2 · Last modified: 2013/01/30 12:42 (external edit)