В очень очень старых моделях свитчей использовался такой метод расчета CRC, проверь может подойдет и в нашем случае.
Код:
/* Образ PROM на старых свичах не упакован, но защищен */
/* суммой. После правки PROM его надо обработать этой */
/* программой чтобы правильно выставить checksum */
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
int main(int argc, char **argv)
{
int ifile = 0;
int check_size = 0;
int check_word = 0;
int bufsize = 0;
int buf_idx = 0;
int checksum = 0;
unsigned char fbuf[2048];
int paddword = 0;
/* Now it is time to open db file... :) */
ifile = open(argv[1], O_RDWR | O_EXCL);
if (ifile == -1)
{
printf("Error: Can't open img file %s\n", argv[1]);
printf("Error: \'%s\'\n", strerror(errno));
exit(-1);
}
lseek(ifile, 0x10010, SEEK_SET);
fbuf[1] = 0;
fbuf[0] = 0;
write(ifile, fbuf, 2);
check_size = lseek(ifile, 0, SEEK_END);
lseek(ifile, 0, SEEK_SET);
for (int i=0; check_size > 0; i++)
{
if (bufsize <= 0)
{
bufsize = read(ifile, fbuf, 1024); buf_idx = 0;
if ((bufsize == 0) && (check_size > 0)) break;
}
if (bufsize != 0)
{
check_word = fbuf[buf_idx] + (fbuf[buf_idx+1] << 8);
checksum += check_word;
buf_idx += 2;
bufsize -= 2;
check_size -= 2;
}
}
printf ("> Image checksum: %08X\n", checksum);
paddword = 0x10000 - (checksum & 0xffff);
printf ("> Image paddword: %08X\n", paddword);
lseek(ifile, 0x10010, SEEK_SET);
fbuf[1] = (paddword >> 8) & 0xff;
fbuf[0] = paddword & 0xff;
write(ifile, fbuf, 2);
}
А в новых свитчах типа 3526:
Код:
size = lseek(ofile, 0, SEEK_END);
insize = lseek(ifile, 0, SEEK_END);
size -= 512;
lseek(ofile, 12, SEEK_SET);
hdrBuf[0] = size >> 24;
hdrBuf[1] = (size >> 16) & 0xff;
hdrBuf[2] = (size >> 8) & 0xff;
hdrBuf[3] = size & 0xff;
write(ofile, hdrBuf, 4);
lseek(ofile, hdrSize, SEEK_SET);
hdrBuf[0] = insize >> 24;
hdrBuf[1] = (insize >> 16) & 0xff;
hdrBuf[2] = (insize >> 8) & 0xff;
hdrBuf[3] = insize & 0xff;
hdrBuf[4] = ztype >> 8;
hdrBuf[5] = ztype & 0xff;
write(ofile, hdrBuf, 6);
// now time to calc checksum and write paddword
check_size = size + 512;
lseek(ofile, 0, SEEK_SET);
for (int i=0; check_size > 0; i++)
{
if (bufsize <= 0)
{
bufsize = read(ofile, fbuf, 1024); buf_idx = 0;
if ((bufsize == 0) && (check_size > 0)) break;
}
if (bufsize != 0)
{
check_word = fbuf[buf_idx+1] + (fbuf[buf_idx] << 8);
checksum += check_word;
buf_idx += 2;
bufsize -= 2;
check_size -= 2;
}
}
checksum = checksum & 0xffff;
paddword = 0x10000 - checksum;
printf("Chksum/paddword: 0x%08X/0x%04X\n", (int)checksum, (int)paddword);