Skip to content

safety: fwd hook config #1954

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 39 commits into from
Closed
Show file tree
Hide file tree
Changes from 5 commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
d885b0c
move toyota fwd to tx config
sshane Mar 8, 2025
09b6ecb
don't love this
sshane Mar 8, 2025
bff5121
oh nice
sshane Mar 8, 2025
4803ade
closer to top
sshane Mar 8, 2025
649cdd6
Rivian is nice and clean
sshane Mar 8, 2025
4d82389
Nissan is also nice diff
sshane Mar 8, 2025
9d790a8
do GM
sshane Mar 8, 2025
8a3d636
Chrysler
sshane Mar 8, 2025
c3933e1
Mazda
sshane Mar 8, 2025
9b72aa2
VW PQ
sshane Mar 8, 2025
db7ec1e
sweet wins
sshane Mar 8, 2025
cf5aa8b
small wins
sshane Mar 8, 2025
66d489f
hyundai not too bad
sshane Mar 8, 2025
8f9179e
elm and alloutput
sshane Mar 8, 2025
27695a5
ah an actual ford test bug
sshane Mar 8, 2025
1c2c045
forgot to remove these & body
sshane Mar 8, 2025
5d68c09
do subaru. we can't block what is sent on bus 1, so check that
sshane Mar 8, 2025
2fb7103
misra!
sshane Mar 8, 2025
e3d4039
forgot to remove these
sshane Mar 8, 2025
125dd29
for now pass tests
sshane Mar 8, 2025
e641d0f
use a bool for this
sshane Mar 8, 2025
956071b
Do part of Tesla
sshane Mar 8, 2025
b221a68
Merge remote-tracking branch 'upstream/master' into fwd-config
sshane Mar 10, 2025
00e8cfc
fix
sshane Mar 10, 2025
50ab9fb
fix
sshane Mar 10, 2025
28ded4e
Merge remote-tracking branch 'upstream/master' into fwd-config
sshane Mar 14, 2025
9ae80c3
remove
sshane Mar 14, 2025
e7bbdfe
whoops
sshane Mar 14, 2025
c5bf64f
woo
sshane Mar 14, 2025
c0c0b2d
first
sshane Mar 14, 2025
087a8c4
Merge remote-tracking branch 'upstream/master' into fwd-config
sshane Mar 14, 2025
4da0129
more
sshane Mar 14, 2025
06245ec
more
sshane Mar 14, 2025
7dd8098
more
sshane Mar 14, 2025
9d0ad08
these are the same now!
sshane Mar 14, 2025
ef02a3e
rm addr check
sshane Mar 14, 2025
73167f1
fix rivian
sshane Mar 14, 2025
f91efec
fix gm
sshane Mar 14, 2025
1bd3f89
more
sshane Mar 14, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 32 additions & 1 deletion opendbc/safety/safety.h
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,20 @@ static bool tx_msg_safety_check(const CANPacket_t *to_send, const CanMsg msg_lis
return allowed;
}

int get_fwd_bus(int bus_num, const safety_config *cfg) {
const FwdBus *fwd_buses = (cfg->fwd_buses == NULL) ? DEFAULT_FWD_BUS_LOOKUP : cfg->fwd_buses;
const int fwd_buses_len = (cfg->fwd_buses == NULL) ? DEFAULT_FWD_BUS_LEN : cfg->fwd_buses_len;

int destination_bus = -1;
for (int i = 0; i < fwd_buses_len; i++) {
if (fwd_buses[i].source_bus == bus_num) {
destination_bus = fwd_buses[i].destination_bus;
break;
}
}
return destination_bus;
}

bool safety_tx_hook(CANPacket_t *to_send) {
bool allowed = tx_msg_safety_check(to_send, current_safety_config.tx_msgs, current_safety_config.tx_msgs_len);
if ((current_safety_mode == SAFETY_ALLOUTPUT) || (current_safety_mode == SAFETY_ELM327)) {
Expand All @@ -253,7 +267,20 @@ bool safety_tx_hook(CANPacket_t *to_send) {
}

int safety_fwd_hook(int bus_num, int addr) {
return (relay_malfunction ? -1 : current_hooks->fwd(bus_num, addr));
const int destination_bus = get_fwd_bus(bus_num, &current_safety_config);

bool blocked = false;
for (int i = 0; i < current_safety_config.tx_msgs_len; i++) {
const CanMsg *m = &current_safety_config.tx_msgs[i];
if ((m->addr == addr) && m->blocked) {
if (m->bus == destination_bus) {
blocked = true;
break;
}
}
}

return (relay_malfunction || blocked) ? -1 : destination_bus;
}

bool get_longitudinal_allowed(void) {
Expand Down Expand Up @@ -431,6 +458,8 @@ int set_safety_hooks(uint16_t mode, uint16_t param) {
current_safety_config.rx_checks_len = 0;
current_safety_config.tx_msgs = NULL;
current_safety_config.tx_msgs_len = 0;
current_safety_config.fwd_buses = NULL;
current_safety_config.fwd_buses_len = 0;

int set_status = -1; // not set
int hook_config_count = sizeof(safety_hook_registry) / sizeof(safety_hook_config);
Expand All @@ -448,6 +477,8 @@ int set_safety_hooks(uint16_t mode, uint16_t param) {
current_safety_config.rx_checks_len = cfg.rx_checks_len;
current_safety_config.tx_msgs = cfg.tx_msgs;
current_safety_config.tx_msgs_len = cfg.tx_msgs_len;
current_safety_config.fwd_buses = cfg.fwd_buses;
current_safety_config.fwd_buses_len = cfg.fwd_buses_len;
// reset all dynamic fields in addr struct
for (int j = 0; j < current_safety_config.rx_checks_len; j++) {
current_safety_config.rx_checks[j].status = (RxStatus){0};
Expand Down
46 changes: 4 additions & 42 deletions opendbc/safety/safety/safety_rivian.h
Original file line number Diff line number Diff line change
Expand Up @@ -91,50 +91,13 @@ static bool rivian_tx_hook(const CANPacket_t *to_send) {
return tx;
}

static int rivian_fwd_hook(int bus, int addr) {
int bus_fwd = -1;
bool block_msg = false;

if (bus == 0) {
// SCCM_WheelTouch: for hiding hold wheel alert
if (addr == 0x321) {
block_msg = true;
}

// VDM_AdasSts: for canceling stock ACC
if ((addr == 0x162) && !rivian_longitudinal) {
block_msg = true;
}

if (!block_msg) {
bus_fwd = 2;
}
}

if (bus == 2) {
// ACM_lkaHbaCmd: lateral control message
if (addr == 0x120) {
block_msg = true;
}

// ACM_longitudinalRequest: longitudinal control message
if (rivian_longitudinal && (addr == 0x160)) {
block_msg = true;
}

if (!block_msg) {
bus_fwd = 0;
}
}

return bus_fwd;
}

static safety_config rivian_init(uint16_t param) {
// Block SCCM_WheelTouch: for hiding hold wheel alert
// Block VDM_AdasSts: for canceling stock ACC
// 0x120 = ACM_lkaHbaCmd, 0x321 = SCCM_WheelTouch, 0x162 = VDM_AdasSts
static const CanMsg RIVIAN_TX_MSGS[] = {{0x120, 0, 8}, {0x321, 2, 7}, {0x162, 2, 8}};
static const CanMsg RIVIAN_TX_MSGS[] = {{0x120, 0, 8, .blocked = true}, {0x321, 2, 7, .blocked = true}, {0x162, 2, 8, .blocked = true}};
// 0x160 = ACM_longitudinalRequest
static const CanMsg RIVIAN_LONG_TX_MSGS[] = {{0x120, 0, 8}, {0x321, 2, 7}, {0x160, 0, 5}};
static const CanMsg RIVIAN_LONG_TX_MSGS[] = {{0x120, 0, 8, .blocked = true}, {0x321, 2, 7, .blocked = true}, {0x160, 0, 5, .blocked = true}};

static RxCheck rivian_rx_checks[] = {
{.msg = {{0x208, 0, 8, .frequency = 50U, .ignore_checksum = true, .ignore_counter = true}, { 0 }, { 0 }}}, // ESP_Status (speed)
Expand All @@ -158,5 +121,4 @@ const safety_hooks rivian_hooks = {
.init = rivian_init,
.rx = rivian_rx_hook,
.tx = rivian_tx_hook,
.fwd = rivian_fwd_hook,
};
42 changes: 12 additions & 30 deletions opendbc/safety/safety/safety_toyota.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,27 @@
#include "safety_declarations.h"

// Stock longitudinal
// block stock lkas messages and stock acc messages (if OP is doing ACC)
// in TSS2, 0x191 is LTA which we need to block to avoid controls collision
#define TOYOTA_BASE_TX_MSGS \
{0x191, 0, 8}, {0x412, 0, 8}, {0x343, 0, 8}, {0x1D2, 0, 8}, /* LKAS + LTA + ACC & PCM cancel cmds */ \
{0x191, 0, 8, .blocked = true}, {0x412, 0, 8, .blocked = true}, {0x1D2, 0, 8}, /* LKAS + LTA + PCM cancel cmds */ \

#define TOYOTA_COMMON_TX_MSGS \
TOYOTA_BASE_TX_MSGS \
{0x2E4, 0, 5}, \
{0x343, 0, 8}, /* ACC cancel cmd */ \
{0x2E4, 0, 5, .blocked = true}, /* LKAS */ \

// on SecOC cars 0x131 is also LTA
#define TOYOTA_COMMON_SECOC_TX_MSGS \
TOYOTA_BASE_TX_MSGS \
{0x2E4, 0, 8}, {0x131, 0, 8}, \
{0x343, 0, 8}, /* ACC cancel cmd */ \
{0x2E4, 0, 8, .blocked = true}, {0x131, 0, 8, .blocked = true}, \

// in TSS2 the camera does ACC as well, so filter 0x343
#define TOYOTA_COMMON_LONG_TX_MSGS \
TOYOTA_COMMON_TX_MSGS \
TOYOTA_BASE_TX_MSGS \
{0x343, 0, 8, .blocked = true}, /* ACC cancel cmd */ \
{0x2E4, 0, 5, .blocked = true}, /* LKAS */ \
{0x283, 0, 7}, {0x2E6, 0, 8}, {0x2E7, 0, 8}, {0x33E, 0, 7}, {0x344, 0, 8}, {0x365, 0, 7}, {0x366, 0, 7}, {0x4CB, 0, 8}, /* DSU bus 0 */ \
{0x128, 1, 6}, {0x141, 1, 4}, {0x160, 1, 8}, {0x161, 1, 7}, {0x470, 1, 4}, /* DSU bus 1 */ \
{0x411, 0, 8}, /* PCS_HUD */ \
Expand Down Expand Up @@ -391,36 +399,10 @@ static safety_config toyota_init(uint16_t param) {
return ret;
}

static int toyota_fwd_hook(int bus_num, int addr) {

int bus_fwd = -1;

if (bus_num == 0) {
bus_fwd = 2;
}

if (bus_num == 2) {
// block stock lkas messages and stock acc messages (if OP is doing ACC)
// in TSS2, 0x191 is LTA which we need to block to avoid controls collision
bool is_lkas_msg = ((addr == 0x2E4) || (addr == 0x412) || (addr == 0x191));
// on SecOC cars 0x131 is also LTA
is_lkas_msg |= toyota_secoc && (addr == 0x131);
// in TSS2 the camera does ACC as well, so filter 0x343
bool is_acc_msg = (addr == 0x343);
bool block_msg = is_lkas_msg || (is_acc_msg && !toyota_stock_longitudinal);
if (!block_msg) {
bus_fwd = 0;
}
}

return bus_fwd;
}

const safety_hooks toyota_hooks = {
.init = toyota_init,
.rx = toyota_rx_hook,
.tx = toyota_tx_hook,
.fwd = toyota_fwd_hook,
.get_checksum = toyota_get_checksum,
.compute_checksum = toyota_compute_checksum,
.get_quality_flag_valid = toyota_get_quality_flag_valid,
Expand Down
16 changes: 16 additions & 0 deletions opendbc/safety/safety_declarations.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,14 @@
do { \
(config).rx_checks = (rx); \
(config).rx_checks_len = sizeof((rx)) / sizeof((rx)[0]); \
(config).fwd_buses = NULL; \
} while (0);

#define SET_TX_MSGS(tx, config) \
do { \
(config).tx_msgs = (tx); \
(config).tx_msgs_len = sizeof((tx)) / sizeof((tx)[0]); \
(config).fwd_buses = NULL; \
} while(0);

#define UPDATE_VEHICLE_SPEED(val_ms) (update_sample(&vehicle_speed, ROUND((val_ms) * VEHICLE_SPEED_FACTOR)))
Expand All @@ -27,6 +29,7 @@ uint32_t GET_BYTES(const CANPacket_t *msg, int start, int len);

extern const int MAX_WRONG_COUNTERS;
#define MAX_ADDR_CHECK_MSGS 3U
#define DEFAULT_FWD_BUS_LEN 2U
#define MAX_SAMPLE_VALS 6
// used to represent floating point vehicle speed in a sample_t
#define VEHICLE_SPEED_FACTOR 1000.0
Expand All @@ -49,8 +52,19 @@ typedef struct {
int addr;
int bus;
int len;
bool blocked;
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
bool blocked;
bool block_fwding; // or no_fwding

makes this more clear

} CanMsg;

typedef struct {
int source_bus;
int destination_bus;
} FwdBus;

const FwdBus DEFAULT_FWD_BUS_LOOKUP[DEFAULT_FWD_BUS_LEN] = {
{0, 2},
{2, 0},
};

typedef enum {
TorqueMotorLimited, // torque steering command, limited by EPS output torque
TorqueDriverLimited, // torque steering command, limited by driver's input torque
Expand Down Expand Up @@ -151,6 +165,8 @@ typedef struct {
int rx_checks_len;
const CanMsg *tx_msgs;
int tx_msgs_len;
const FwdBus *fwd_buses;
int fwd_buses_len;
} safety_config;

typedef uint32_t (*get_checksum_t)(const CANPacket_t *to_push);
Expand Down
Loading