|
|
1.1 root 1: /******************************************************************************
2: * Copyright (c) 2004, 2008 IBM Corporation
3: * All rights reserved.
4: * This program and the accompanying materials
5: * are made available under the terms of the BSD License
6: * which accompanies this distribution, and is available at
7: * http://www.opensource.org/licenses/bsd-license.php
8: *
9: * Contributors:
10: * IBM Corporation - initial implementation
11: *****************************************************************************/
12:
13: #include <netlib/tftp.h>
14: #include <netlib/dhcp.h>
15: #include <netlib/ethernet.h>
16: #include <netlib/ipv4.h>
17: #include <rtas.h>
18: #include <stdio.h>
19: #include <string.h>
20: #include <stdlib.h>
21: #include <sys/socket.h>
22:
23: int netflash(int argc, char * argv[])
24: {
25: char buf[256];
26: int rc;
27: int manage_mode = 0;
28: static int len = 0x800000; //max flash size
29: char * buffer = NULL;
30: short arp_failed = 0;
31: filename_ip_t fn_ip;
32: int fd_device;
33: tftp_err_t tftp_err;
34: char * ptr;
35: uint8_t own_mac[6];
36:
37: printf("\n Flasher 1.4 \n");
38: memset(&fn_ip, 0, sizeof(filename_ip_t));
39:
40: if (argc == 3 && argv[2][0] == '-' && argv[2][1] == 'c' && argv[2][2] == 0)
41: manage_mode = 1;
42: else if (argc == 3 &&
43: argv[2][0] == '-' && argv[2][1] == 'r' && argv[2][2] == 0)
44: manage_mode = 1;
45: else if (argc == 4 &&
46: argv[2][0] == '-' && argv[2][1] == 'f' && argv[2][2] == 0)
47: {
48: manage_mode = 0;
49: buffer = (char *)strtol(argv[1],0,16);
50: if ((long)buffer == -1) {
51: printf(" Bad buffer address. Exiting...\n");
52: return -1;
53: }
54: }
55: else
56: {
57: printf(" Usage: netflash [options] [<filename>]\n");
58: printf(" Options:\n");
59: printf(" -f <filename> flash temporary image\n");
60: printf(" -c commit temporary image\n");
61: printf(" -r reject temporary image\n");
62: printf(" Bad arguments. Exiting...\n\n");
63: return -1;
64: }
65:
66: if (manage_mode == 1) {
67: if (argv[2][1] == 99)
68: return rtas_ibm_manage_flash(1);
69: else
70: return rtas_ibm_manage_flash(0);
71: }
72:
73: /* Get mac_addr from device */
74: printf(" Reading MAC address from device: ");
75: fd_device = socket(0, 0, 0, (char *) own_mac);
76: if (fd_device == -1) {
77: printf("\nE3000: Could not read MAC address\n");
78: return -100;
79: }
80: else if (fd_device == -2) {
81: printf("\nE3006: Could not initialize network device\n");
82: return -101;
83: }
84:
85: printf("%02x:%02x:%02x:%02x:%02x:%02x\n",
86: own_mac[0], own_mac[1], own_mac[2],
87: own_mac[3], own_mac[4], own_mac[5]);
88:
89: // init ethernet layer
90: set_mac_address(own_mac);
91:
92: // identify the BOOTP/DHCP server via broadcasts
93: // don't do this, when using DHCP !!!
94: // fn_ip.server_ip = 0xFFFFFFFF;
95: // memset(fn_ip.server_mac, 0xff, 6);
96:
97: /* Get ip address for our mac address */
98: printf(" Requesting IP address via DHCP: ");
99: arp_failed = dhcp(0, &fn_ip, 30);
100:
101: if(arp_failed >= 0) {
102: // reinit network stack
103: set_ipv4_address(fn_ip.own_ip);
104: }
105:
106: if (arp_failed == -1) {
107: printf("\n DHCP: Could not get ip address\n");
108: return 1;
109: }
110:
111: if (arp_failed == -2) {
112: sprintf
113: (buf,"\n ARP request to TFTP server (%d.%d.%d.%d) failed",
114: ((fn_ip.server_ip >> 24) & 0xFF), ((fn_ip.server_ip >> 16) & 0xFF),
115: ((fn_ip.server_ip >> 8) & 0xFF), ( fn_ip.server_ip & 0xFF));
116: return 1;
117: }
118:
119: printf("%d.%d.%d.%d\n",
120: ((fn_ip.own_ip >> 24) & 0xFF), ((fn_ip.own_ip >> 16) & 0xFF),
121: ((fn_ip.own_ip >> 8) & 0xFF), (fn_ip.own_ip & 0xFF));
122:
123: /* Load file via TFTP into buffer provided by OpenFirmware */
124:
125: for(ptr = argv[3]; *ptr != 0; ++ptr)
126: if(*ptr == '\\')
127: *ptr = '/';
128:
129: printf(" Requesting file \"%s\" via TFTP\n",argv[3]);
130:
131: strcpy((char *) fn_ip.filename,argv[3]);
132:
133: rc = tftp(&fn_ip, (unsigned char*) buffer, len, 20, &tftp_err, 0, 512, 4);
134:
135: dhcp_send_release();
136:
137: if (rc > 0)
138: {
139: printf (" TFTP: Received %s (%d KBytes)\n", fn_ip.filename, rc/1024);
140: printf (" Now flashing:\n");
141: rc = rtas_ibm_update_flash_64((long long)buffer, rc);
142: return rc;
143: }
144: else if (rc == -1)
145: {
146: printf (" Tftp: Could not load file %s\n", fn_ip.filename);
147: return 1;
148: }
149: else if (rc == -2)
150: {
151: printf (" Tftp: Buffer to small for %s\n", fn_ip.filename);
152: return 1;
153: }
154: else if (rc <= -10 && rc >= -15)
155: {
156: printf("\n ICMP ERROR: Destination unreachable: ");
157: switch(rc) {
158: case -ICMP_NET_UNREACHABLE-10:
159: printf("net unreachable");
160: break;
161: case -ICMP_HOST_UNREACHABLE-10:
162: printf("host unreachable");
163: break;
164: case -ICMP_PROTOCOL_UNREACHABLE-10:
165: printf("protocol unreachable");
166: break;
167: case -ICMP_PORT_UNREACHABLE-10:
168: printf("port unreachable");
169: break;
170: case -ICMP_FRAGMENTATION_NEEDED-10:
171: printf("fragmentation needed and DF set");
172: break;
173: case -ICMP_SOURCE_ROUTE_FAILED-10:
174: printf("source route failed");
175: break;
176: default:
177: printf(" UNKNOWN: this should not happen!");
178: break;
179: }
180: printf("\n");
181: return 1;
182: }
183: else if(rc < 0)
184: printf(" UNKNOWN: rc = %d!", rc);
185:
186: return 0;
187: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.