node-beaglebone-usbboot
Version:
Transforms BeagleBone to mass storage device
296 lines • 8.57 kB
JavaScript
"use strict";
/* tslint:disable */
Object.defineProperty(exports, "__esModule", { value: true });
const util_1 = require("./util");
const bp = require('binary-parser-encoder'); // Binary parser module
const Parser = bp.Parser;
const sp = require('schemapack');
// BOOTP packet
const bootp1 = sp.build([
{ opcode: 'uint8' },
{ hw: 'uint8' },
{ hw_length: 'uint8' },
{ hopcount: 'uint8' },
{ xid: 'uint32' },
{ secs: 'uint16' },
{ flags: 'uint16' },
{ ciaddr: { 0: 'uint8', 1: 'uint8', 2: 'uint8', 3: 'uint8' } },
{ pad: 'string' },
]);
const bootp2 = sp.build([
{ yiaddr: { 0: 'uint8', 1: 'uint8', 2: 'uint8', 3: 'uint8' } },
{ server_ip: { 0: 'uint8', 1: 'uint8', 2: 'uint8', 3: 'uint8' } },
{ bootp_gw_ip: { 0: 'uint8', 1: 'uint8', 2: 'uint8', 3: 'uint8' } },
{ hwaddr: { 0: 'uint8', 1: 'uint8', 2: 'uint8', 3: 'uint8', 4: 'uint8', 5: 'uint8' } },
{ pad: 'string' },
]);
const bootpServername = sp.build([
{
servername: {
0: 'uint8',
1: 'uint8',
2: 'uint8',
3: 'uint8',
4: 'uint8',
5: 'uint8',
6: 'uint8',
7: 'uint8',
8: 'uint8',
9: 'uint8',
},
},
{ pad: 'string' },
]);
const bootpBootfile = sp.build([
// Name of File (max 72 char here) to boot, splitted in 8 parts as max object size supported is 9
{
bootfile1: {
0: 'uint8',
1: 'uint8',
2: 'uint8',
3: 'uint8',
4: 'uint8',
5: 'uint8',
6: 'uint8',
7: 'uint8',
8: 'uint8',
},
},
{
bootfile2: {
0: 'uint8',
1: 'uint8',
2: 'uint8',
3: 'uint8',
4: 'uint8',
5: 'uint8',
6: 'uint8',
7: 'uint8',
8: 'uint8',
},
},
{
bootfile3: {
0: 'uint8',
1: 'uint8',
2: 'uint8',
3: 'uint8',
4: 'uint8',
5: 'uint8',
6: 'uint8',
7: 'uint8',
8: 'uint8',
},
},
{
bootfile4: {
0: 'uint8',
1: 'uint8',
2: 'uint8',
3: 'uint8',
4: 'uint8',
5: 'uint8',
6: 'uint8',
7: 'uint8',
8: 'uint8',
},
},
{
bootfile5: {
0: 'uint8',
1: 'uint8',
2: 'uint8',
3: 'uint8',
4: 'uint8',
5: 'uint8',
6: 'uint8',
7: 'uint8',
8: 'uint8',
},
},
{
bootfile6: {
0: 'uint8',
1: 'uint8',
2: 'uint8',
3: 'uint8',
4: 'uint8',
5: 'uint8',
6: 'uint8',
7: 'uint8',
8: 'uint8',
},
},
{
bootfile7: {
0: 'uint8',
1: 'uint8',
2: 'uint8',
3: 'uint8',
4: 'uint8',
5: 'uint8',
6: 'uint8',
7: 'uint8',
8: 'uint8',
},
},
{
bootfile8: {
0: 'uint8',
1: 'uint8',
2: 'uint8',
3: 'uint8',
4: 'uint8',
5: 'uint8',
6: 'uint8',
7: 'uint8',
8: 'uint8',
},
},
{ pad: 'string' },
]);
// Max array size supported is 9, splitting vendor field in two parts
const bootpVendor1 = sp.build([
// Vendor extensions (4 Byte MAGIC COOKIE and DHCP OPTIONS)
{
vendor1: {
0: 'uint8',
1: 'uint8',
2: 'uint8',
3: 'uint8',
4: 'uint8',
5: 'uint8',
6: 'uint8',
7: 'uint8',
8: 'uint8',
},
},
{ pad: 'string' },
]);
const bootpVendor2 = sp.build([
{
vendor2: {
0: 'uint8',
1: 'uint8',
2: 'uint8',
3: 'uint8',
4: 'uint8',
5: 'uint8',
6: 'uint8',
7: 'uint8',
8: 'uint8',
},
},
{ pad: 'string' },
]);
const bootpVendor3 = sp.build([
{
vendor3: {
0: 'uint8',
1: 'uint8',
2: 'uint8',
3: 'uint8',
4: 'uint8',
5: 'uint8',
6: 'uint8',
7: 'uint8',
8: 'uint8',
},
},
{ pad: 'string' },
]);
const bootpVendor4 = sp.build([
{ vendor4: { 0: 'uint8', 1: 'uint8', 2: 'uint8', 3: 'uint8', 4: 'uint8' } },
{ pad: 'string' },
]);
class BOOTP {
parseBOOTP(buff) {
// BOOTP packet
const bootp = new Parser()
.uint8('opcode')
.uint8('hw')
.uint8('hwlength')
.uint8('hopcount')
.uint32be('xid')
.uint16be('secs')
.uint16be('flags')
.array('ciaddr', {
length: 4,
type: 'uint8',
})
.array('yiaddr', {
length: 4,
type: 'uint8',
})
.array('server_ip', {
length: 4,
type: 'uint8',
})
.array('bootp_gw_ip', {
length: 4,
type: 'uint8',
})
.array('hwaddr', {
length: 16,
type: 'uint8',
})
.array('servername', {
length: 64,
type: 'uint8',
})
.array('bootfile', {
length: 128,
type: 'uint8',
})
.array('vendor', {
length: 64,
type: 'uint8',
});
return bootp.parse(buff);
}
// Function for BOOTP packet
makeBOOTP(server_name, file_name, xid_, hw_dest, BB_ip, serverIP) {
const bootp_1 = [
{ opcode: 2 },
{ hw: 1 },
{ hw_length: 6 },
{ hopcount: 0 },
{ xid: xid_ },
{ secs: 0 },
{ flags: 0 },
{ ciaddr: [0, 0, 0, 0] },
];
const bootp_2 = [{ yiaddr: BB_ip }, { server_ip: serverIP }, { bootp_gw_ip: serverIP }, { hwaddr: hw_dest }];
const servername = [{ servername: server_name }];
const filename = util_1.stringToAscii(file_name);
const bootfile = [
{ bootfile1: filename.slice(0, 9) },
{ bootfile2: filename.slice(9, 18) },
{ bootfile3: filename.slice(18, 27) },
{ bootfile4: filename.slice(27, 36) },
{ bootfile5: filename.slice(36, 45) },
{ bootfile6: filename.slice(45, 54) },
{ bootfile7: filename.slice(54, 63) },
{ bootfile8: filename.slice(63, 72) },
];
const vendor1 = [{ vendor1: [99, 130, 83, 99, 53, 1, 5, 1, 4] }]; // 4 Byte MAGIC COOKIE and DHCP OPTIONS
const vendor2 = [{ vendor2: [225, 255, 255, 0, 3, 4, 192, 168, 1] }];
const vendor3 = [{ vendor3: [9, 51, 4, 255, 255, 255, 255, 54, 4] }];
const vendor4 = [{ vendor4: [192, 168, 1, 9, 0xff] }];
const buf1 = util_1.fixBuff(bootp1.encode(bootp_1));
const buf2 = util_1.fixBuff(bootp2.encode(bootp_2));
const buf2_ = Buffer.alloc(10); // Remaining 10 bytes out of 16 of hwaddr
const buf3 = util_1.fixBuff(bootpServername.encode(servername));
const buf3_ = Buffer.alloc(54); // Remaining 54 bytes out of 64 of servername
const buf4 = util_1.fixBuff(bootpBootfile.encode(bootfile));
const buf4_ = Buffer.alloc(56); // Remaining 56 bytes out of 128 of bootfile
const buf5 = util_1.fixBuff(bootpVendor1.encode(vendor1));
const buf5a = util_1.fixBuff(bootpVendor2.encode(vendor2));
const buf5b = util_1.fixBuff(bootpVendor3.encode(vendor3));
const buf5c = util_1.fixBuff(bootpVendor4.encode(vendor4));
const buf5d = Buffer.alloc(32); // Remaining 32 bytes out of 64 of vendor
return Buffer.concat([buf1, buf2, buf2_, buf3, buf3_, buf4, buf4_, buf5, buf5a, buf5b, buf5c, buf5d], 300);
}
}
exports.BOOTP = BOOTP;
//# sourceMappingURL=bootp.js.map