@@ -723,10 +723,12 @@ static int j1939_session_tx_rts(struct j1939_session *session)
723
723
return ret ;
724
724
725
725
session -> last_txcmd = dat [0 ];
726
- if (dat [0 ] == J1939_TP_CMD_BAM )
726
+ if (dat [0 ] == J1939_TP_CMD_BAM ) {
727
727
j1939_tp_schedule_txtimer (session , 50 );
728
-
729
- j1939_tp_set_rxtimeout (session , 1250 );
728
+ j1939_tp_set_rxtimeout (session , 250 );
729
+ } else {
730
+ j1939_tp_set_rxtimeout (session , 1250 );
731
+ }
730
732
731
733
netdev_dbg (session -> priv -> ndev , "%s: 0x%p\n" , __func__ , session );
732
734
@@ -1074,9 +1076,9 @@ static void __j1939_session_cancel(struct j1939_session *session,
1074
1076
lockdep_assert_held (& session -> priv -> active_session_list_lock );
1075
1077
1076
1078
session -> err = j1939_xtp_abort_to_errno (priv , err );
1079
+ session -> state = J1939_SESSION_WAITING_ABORT ;
1077
1080
/* do not send aborts on incoming broadcasts */
1078
1081
if (!j1939_cb_is_broadcast (& session -> skcb )) {
1079
- session -> state = J1939_SESSION_WAITING_ABORT ;
1080
1082
j1939_xtp_tx_abort (priv , & session -> skcb ,
1081
1083
!session -> transmission ,
1082
1084
err , session -> skcb .addr .pgn );
@@ -1673,8 +1675,12 @@ static void j1939_xtp_rx_rts(struct j1939_priv *priv, struct sk_buff *skb,
1673
1675
return ;
1674
1676
}
1675
1677
session = j1939_xtp_rx_rts_session_new (priv , skb );
1676
- if (!session )
1678
+ if (!session ) {
1679
+ if (cmd == J1939_TP_CMD_BAM && j1939_sk_recv_match (priv , skcb ))
1680
+ netdev_info (priv -> ndev , "%s: failed to create TP BAM session\n" ,
1681
+ __func__ );
1677
1682
return ;
1683
+ }
1678
1684
} else {
1679
1685
if (j1939_xtp_rx_rts_session_active (session , skb )) {
1680
1686
j1939_session_put (session );
@@ -1683,11 +1689,15 @@ static void j1939_xtp_rx_rts(struct j1939_priv *priv, struct sk_buff *skb,
1683
1689
}
1684
1690
session -> last_cmd = cmd ;
1685
1691
1686
- j1939_tp_set_rxtimeout (session , 1250 );
1687
-
1688
- if (cmd != J1939_TP_CMD_BAM && !session -> transmission ) {
1689
- j1939_session_txtimer_cancel (session );
1690
- j1939_tp_schedule_txtimer (session , 0 );
1692
+ if (cmd == J1939_TP_CMD_BAM ) {
1693
+ if (!session -> transmission )
1694
+ j1939_tp_set_rxtimeout (session , 750 );
1695
+ } else {
1696
+ if (!session -> transmission ) {
1697
+ j1939_session_txtimer_cancel (session );
1698
+ j1939_tp_schedule_txtimer (session , 0 );
1699
+ }
1700
+ j1939_tp_set_rxtimeout (session , 1250 );
1691
1701
}
1692
1702
1693
1703
j1939_session_put (session );
@@ -1738,6 +1748,7 @@ static void j1939_xtp_rx_dat_one(struct j1939_session *session,
1738
1748
int offset ;
1739
1749
int nbytes ;
1740
1750
bool final = false;
1751
+ bool remain = false;
1741
1752
bool do_cts_eoma = false;
1742
1753
int packet ;
1743
1754
@@ -1813,14 +1824,20 @@ static void j1939_xtp_rx_dat_one(struct j1939_session *session,
1813
1824
j1939_cb_is_broadcast (& session -> skcb )) {
1814
1825
if (session -> pkt .rx >= session -> pkt .total )
1815
1826
final = true;
1827
+ else
1828
+ remain = true;
1816
1829
} else {
1817
1830
/* never final, an EOMA must follow */
1818
1831
if (session -> pkt .rx >= session -> pkt .last )
1819
1832
do_cts_eoma = true;
1820
1833
}
1821
1834
1822
1835
if (final ) {
1836
+ j1939_session_timers_cancel (session );
1823
1837
j1939_session_completed (session );
1838
+ } else if (remain ) {
1839
+ if (!session -> transmission )
1840
+ j1939_tp_set_rxtimeout (session , 750 );
1824
1841
} else if (do_cts_eoma ) {
1825
1842
j1939_tp_set_rxtimeout (session , 1250 );
1826
1843
if (!session -> transmission )
@@ -1865,6 +1882,13 @@ static void j1939_xtp_rx_dat(struct j1939_priv *priv, struct sk_buff *skb)
1865
1882
else
1866
1883
j1939_xtp_rx_dat_one (session , skb );
1867
1884
}
1885
+
1886
+ if (j1939_cb_is_broadcast (skcb )) {
1887
+ session = j1939_session_get_by_addr (priv , & skcb -> addr , false,
1888
+ false);
1889
+ if (session )
1890
+ j1939_xtp_rx_dat_one (session , skb );
1891
+ }
1868
1892
}
1869
1893
1870
1894
/* j1939 main intf */
@@ -1956,7 +1980,7 @@ static void j1939_tp_cmd_recv(struct j1939_priv *priv, struct sk_buff *skb)
1956
1980
if (j1939_tp_im_transmitter (skcb ))
1957
1981
j1939_xtp_rx_rts (priv , skb , true);
1958
1982
1959
- if (j1939_tp_im_receiver (skcb ))
1983
+ if (j1939_tp_im_receiver (skcb ) || j1939_cb_is_broadcast ( skcb ) )
1960
1984
j1939_xtp_rx_rts (priv , skb , false);
1961
1985
1962
1986
break ;
@@ -2020,7 +2044,7 @@ int j1939_tp_recv(struct j1939_priv *priv, struct sk_buff *skb)
2020
2044
{
2021
2045
struct j1939_sk_buff_cb * skcb = j1939_skb_to_cb (skb );
2022
2046
2023
- if (!j1939_tp_im_involved_anydir (skcb ))
2047
+ if (!j1939_tp_im_involved_anydir (skcb ) && ! j1939_cb_is_broadcast ( skcb ) )
2024
2048
return 0 ;
2025
2049
2026
2050
switch (skcb -> addr .pgn ) {
0 commit comments