if (skb->len != 8) {
netdev_notice(priv->ndev, "tx address claim with dlc %i\n",
skb->len); return -EPROTO;
}
if (skcb->addr.src_name != j1939_skb_to_name(skb)) {
netdev_notice(priv->ndev, "tx address claim with different name\n"); return -EPROTO;
}
if (skcb->addr.sa == J1939_NO_ADDR) {
netdev_notice(priv->ndev, "tx address claim with broadcast sa\n"); return -EPROTO;
}
/* ac must always be a broadcast */ if (skcb->addr.dst_name || skcb->addr.da != J1939_NO_ADDR) {
netdev_notice(priv->ndev, "tx address claim with dest, not broadcast\n"); return -EPROTO;
} return0;
}
int j1939_ac_fixup(struct j1939_priv *priv, struct sk_buff *skb)
{ struct j1939_sk_buff_cb *skcb = j1939_skb_to_cb(skb); int ret;
u8 addr;
ret = j1939_ac_verify_outgoing(priv, skb); /* return both when failure & when successful */ if (ret < 0) return ret;
ecu = j1939_ecu_get_by_name(priv, skcb->addr.src_name); if (!ecu) return -ENODEV;
if (ecu->addr != skcb->addr.sa) /* hold further traffic for ecu, remove from parent */
j1939_ecu_unmap(ecu);
j1939_ecu_put(ecu);
} elseif (skcb->addr.src_name) { /* assign source address */
addr = j1939_name_to_addr(priv, skcb->addr.src_name); if (!j1939_address_is_unicast(addr) &&
!j1939_ac_msg_is_request(skb)) {
netdev_notice(priv->ndev, "tx drop: invalid sa for name 0x%016llx\n",
skcb->addr.src_name); return -EADDRNOTAVAIL;
}
skcb->addr.sa = addr;
}
/* assign destination address */ if (skcb->addr.dst_name) {
addr = j1939_name_to_addr(priv, skcb->addr.dst_name); if (!j1939_address_is_unicast(addr)) {
netdev_notice(priv->ndev, "tx drop: invalid da for name 0x%016llx\n",
skcb->addr.dst_name); return -EADDRNOTAVAIL;
}
skcb->addr.da = addr;
} return0;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.