multichannel code is done! (only basic testing completed though)

1.2-legacy
Kevin Hester 2021-02-23 10:45:03 +08:00
rodzic 2761c85564
commit ae6b7e7259
4 zmienionych plików z 51 dodań i 40 usunięć

Wyświetl plik

@ -5,8 +5,8 @@ You probably don't care about this section - skip to the next one.
1.2 cleanup & multichannel support:
* DONE call RouterPlugin for *all* packets - not just Router packets
* generate channel hash from the name of the channel+the psk (not just one or the other)
* send a hint that can be used to select which channel to try and hash against with each message
* DONE generate channel hash from the name of the channel+the psk (not just one or the other)
* DONE send a hint that can be used to select which channel to try and hash against with each message
* DONE remove deprecated
* DONE fix setchannel in phoneapi.cpp
* DONE set mynodeinfo.max_channels
@ -15,7 +15,9 @@ You probably don't care about this section - skip to the next one.
* DONE enable remote setttings access by moving settings operations into a regular plugin (move settings ops out of PhoneAPI)
* DONE move portnum up?
* DONE remove region specific builds from the firmware
* restrict settings operations to the admin channel
* test single channel
* test multi channel
* restrict gpio & serial & settings operations to the admin channel (unless local to the current node)
* add gui in android app for setting region
* make an alpha channel for the python API
* "FIXME - move the radioconfig/user/channel READ operations into SettingsMessage as well"

Wyświetl plik

@ -192,7 +192,7 @@ void Channels::setChannel(const Channel &c)
// if this is the new primary, demote any existing roles
if (c.role == Channel_Role_PRIMARY)
for (int i = 0; i < devicestate.channels_count; i++)
for (int i = 0; i < getNumChannels(); i++)
if (devicestate.channels[i].role == Channel_Role_PRIMARY)
devicestate.channels[i].role = Channel_Role_SECONDARY;
@ -271,11 +271,18 @@ const char *Channels::getPrimaryName()
*
* This method is called before decoding inbound packets
*
* @return -1 if no suitable channel could be found, otherwise returns the channel index
* @return false if the channel hash or channel is invalid
*/
int16_t Channels::setActiveByHash(ChannelHash channelHash)
bool Channels::decryptForHash(ChannelIndex chIndex, ChannelHash channelHash)
{
// fixme cant work;
if(chIndex > getNumChannels() || getHash(chIndex) != channelHash) {
DEBUG_MSG("Skipping channel %d due to invalid hash/index\n", chIndex);
return false;
}
else {
setCrypto(chIndex);
return true;
}
}
/** Given a channel index setup crypto for encoding that channel (or the primary channel if that channel is unsecured)

Wyświetl plik

@ -1,16 +1,17 @@
#pragma once
#include "CryptoEngine.h"
#include "NodeDB.h"
#include "mesh-pb-constants.h"
#include <Arduino.h>
#include "CryptoEngine.h"
/** A channel number (index into the channel table)
*/
typedef uint8_t ChannelIndex;
/** A low quality hash of the channel PSK and the channel name. created by generateHash(chIndex)
/** A low quality hash of the channel PSK and the channel name. created by generateHash(chIndex)
* Used as a hint to limit which PSKs are considered for packet decoding.
*/
*/
typedef uint8_t ChannelHash;
/** The container/on device API for working with channels */
@ -22,7 +23,7 @@ class Channels
/** The channel index that was requested for sending/receving. Note: if this channel is a secondary
channel and does not have a PSK, we will use the PSK from the primary channel. If this channel is disabled
no sending or receiving will be allowed */
ChannelIndex activeChannelIndex = 0;
ChannelIndex activeChannelIndex = 0;
/// the precomputed hashes for each of our channels, or -1 for invalid
int16_t hashes[MAX_NUM_CHANNELS];
@ -43,6 +44,8 @@ class Channels
/** The index of the primary channel */
ChannelIndex getPrimaryIndex() const { return primaryIndex; }
ChannelIndex getNumChannels() { return devicestate.channels_count; }
/**
* Generate a short suffix used to disambiguate channels that might have the same "name" entered by the human but different
PSKs.
@ -72,9 +75,9 @@ class Channels
*
* This method is called before decoding inbound packets
*
* @return -1 if no suitable channel could be found, otherwise returns the channel index
* @return false if the channel hash or channel is invalid
*/
int16_t setActiveByHash(ChannelHash channelHash);
bool decryptForHash(ChannelIndex chIndex, ChannelHash channelHash);
/** Given a channel index setup crypto for encoding that channel (or the primary channel if that channel is unsecured)
*
@ -86,7 +89,7 @@ class Channels
private:
/** Given a channel index, change to use the crypto key specified by that index
*
*
* @eturn the (0 to 255) hash for that channel - if no suitable channel could be found, return -1
*/
int16_t setCrypto(ChannelIndex chIndex);
@ -96,7 +99,7 @@ class Channels
/** Given a channel number, return the (0 to 255) hash for that channel
* If no suitable channel could be found, return -1
*
*
* called by fixupChannel when a new channel is set
*/
int16_t generateHash(ChannelIndex channelNum);
@ -114,11 +117,10 @@ class Channels
void initDefaultChannel(ChannelIndex chIndex);
/**
* Return the key used for encrypting this channel (if channel is secondary and no key provided, use the primary channel's PSK)
* Return the key used for encrypting this channel (if channel is secondary and no key provided, use the primary channel's
* PSK)
*/
CryptoKey getKey(ChannelIndex chIndex);
};
/// Singleton channel table

Wyświetl plik

@ -215,31 +215,31 @@ bool Router::perhapsDecode(MeshPacket *p)
assert(p->which_payloadVariant == MeshPacket_encrypted_tag);
ChannelHash chHash = p->channel;
int16_t chIndex = channels.setActiveByHash(chHash);
if (chIndex < 0) {
DEBUG_MSG("No suitable channel found for decoding, hash was 0x%x!\n", chHash);
return false;
} else {
p->channel = chIndex;
// Try to find a channel that works with this hash
for (ChannelIndex chIndex = 0; chIndex < channels.getNumChannels(); chIndex++) {
// Try to use this hash/channel pair
if (channels.decryptForHash(chIndex, p->channel)) {
// Try to decrypt the packet if we can
static uint8_t bytes[MAX_RHPACKETLEN];
memcpy(bytes, p->encrypted.bytes,
p->encrypted
.size); // we have to copy into a scratch buffer, because these bytes are a union with the decoded protobuf
crypto->decrypt(p->from, p->id, p->encrypted.size, bytes);
// Try to decrypt the packet if we can
static uint8_t bytes[MAX_RHPACKETLEN];
memcpy(bytes, p->encrypted.bytes,
p->encrypted
.size); // we have to copy into a scratch buffer, because these bytes are a union with the decoded protobuf
crypto->decrypt(p->from, p->id, p->encrypted.size, bytes);
// Take those raw bytes and convert them back into a well structured protobuf we can understand
if (!pb_decode_from_bytes(bytes, p->encrypted.size, Data_fields, &p->decoded)) {
DEBUG_MSG("Invalid protobufs in received mesh packet!\n");
return false;
} else {
// parsing was successful
p->which_payloadVariant = MeshPacket_decoded_tag;
return true;
// Take those raw bytes and convert them back into a well structured protobuf we can understand
if (!pb_decode_from_bytes(bytes, p->encrypted.size, Data_fields, &p->decoded)) {
DEBUG_MSG("Invalid protobufs in received mesh packet (bad psk?!\n");
} else {
// parsing was successful
p->channel = chIndex; // change to store the index instead of the hash
p->which_payloadVariant = MeshPacket_decoded_tag;
return true;
}
}
}
DEBUG_MSG("No suitable channel found for decoding, hash was 0x%x!\n", p->channel);
return false;
}
NodeNum Router::getNodeNum()