aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPau Espin Pedrol <pespin@sysmocom.de>2023-07-26 20:20:53 +0200
committerPau Espin Pedrol <pespin@sysmocom.de>2023-07-28 13:48:25 +0200
commit9b5002819207129d79b487ca2e35ddbba6c6d4cd (patch)
treea5ea5e6a48fc4d92db03dbcbcfb0d213c295dcb2
parent6e1a35bab76ecf6fbd9b41454593aadf3ff556cf (diff)
sndcp: Update n201_u & n201_i indicatd by LLC layer
-rw-r--r--include/osmocom/gprs/sndcp/sndcp_private.h9
-rw-r--r--src/sndcp/sndcp.c18
-rw-r--r--src/sndcp/sndcp_prim.c2
3 files changed, 23 insertions, 6 deletions
diff --git a/include/osmocom/gprs/sndcp/sndcp_private.h b/include/osmocom/gprs/sndcp/sndcp_private.h
index 43ea7ca..21c6a40 100644
--- a/include/osmocom/gprs/sndcp/sndcp_private.h
+++ b/include/osmocom/gprs/sndcp/sndcp_private.h
@@ -171,7 +171,6 @@ struct gprs_sndcp_entity {
* originated XID-Request from peer. NULL if not existing (and l3xid_req_len = 0) */
struct llist_head *l3_xid_comp_fields_req_from_peer;
- /* TODO: taken from lle.params and not yet set ever in code! */
uint16_t n201_u;
uint16_t n201_i;
};
@@ -220,8 +219,12 @@ int gprs_sndcp_sne_submit_llc_ll_xid_req(struct gprs_sndcp_entity *sne);
int gprs_sndcp_sne_submit_snsm_activate_rsp(struct gprs_sndcp_entity *sne);
int gprs_sndcp_sne_handle_llc_ll_unitdata_ind(struct gprs_sndcp_entity *sne,
struct sndcp_common_hdr *sch, uint16_t len);
-int gprs_sndcp_snme_handle_llc_ll_xid_ind(struct gprs_sndcp_mgmt_entity *snme, uint32_t sapi, uint8_t *l3params, unsigned int l3params_len);
-int gprs_sndcp_snme_handle_llc_ll_xid_cnf(struct gprs_sndcp_mgmt_entity *snme, uint32_t sapi, uint8_t *l3params, unsigned int l3params_len);
+int gprs_sndcp_snme_handle_llc_ll_xid_ind(struct gprs_sndcp_mgmt_entity *snme, uint32_t sapi,
+ uint16_t n201_u, uint16_t n201_i,
+ uint8_t *l3params, unsigned int l3params_len);
+int gprs_sndcp_snme_handle_llc_ll_xid_cnf(struct gprs_sndcp_mgmt_entity *snme, uint32_t sapi,
+ uint16_t n201_u, uint16_t n201_i,
+ uint8_t *l3params, unsigned int l3params_len);
int gprs_sndcp_sne_handle_sn_unitdata_req(struct gprs_sndcp_entity *sne, uint8_t *npdu, unsigned int npdu_len);
int gprs_sndcp_sne_handle_sn_xid_req(struct gprs_sndcp_entity *sne, const struct osmo_gprs_sndcp_prim *sndcp_prim);
int gprs_sndcp_sne_handle_sn_xid_rsp(struct gprs_sndcp_entity *sne, const struct osmo_gprs_sndcp_prim *sndcp_prim);
diff --git a/src/sndcp/sndcp.c b/src/sndcp/sndcp.c
index 4b54be3..5decfac 100644
--- a/src/sndcp/sndcp.c
+++ b/src/sndcp/sndcp.c
@@ -979,7 +979,9 @@ static int gprs_sndcp_snme_handle_dcomp_entities(struct gprs_sndcp_mgmt_entity *
}
/* 5.1.2.10 SN-XID.indication */
-int gprs_sndcp_snme_handle_llc_ll_xid_ind(struct gprs_sndcp_mgmt_entity *snme, uint32_t sapi, uint8_t *l3params, unsigned int l3params_len)
+int gprs_sndcp_snme_handle_llc_ll_xid_ind(struct gprs_sndcp_mgmt_entity *snme, uint32_t sapi,
+ uint16_t n201_u, uint16_t n201_i,
+ uint8_t *l3params, unsigned int l3params_len)
{
int rc;
int compclass;
@@ -1005,10 +1007,15 @@ int gprs_sndcp_snme_handle_llc_ll_xid_ind(struct gprs_sndcp_mgmt_entity *snme, u
return -EINVAL;
}
+ sne->n201_u = n201_u;
+ sne->n201_i = n201_i;
+
/* Some phones send zero byte length SNDCP frames
* and do require a confirmation response. */
if (l3params_len == 0) {
- /* TODO: send empty (len=0) SN-XID.response? */
+ /* TS 44.065 6.8: "If the SNDCP entity receives an LL-XID.indication without
+ * an SNDCP XID block, it shall not respond with the LL-XID.response primitive."
+ */
return 0;
}
@@ -1057,7 +1064,9 @@ int gprs_sndcp_snme_handle_llc_ll_xid_ind(struct gprs_sndcp_mgmt_entity *snme, u
/* 5.1.2.12 SN-XID.confirm
* (See also: TS 144 065, Section 6.8 XID parameter negotiation)
*/
-int gprs_sndcp_snme_handle_llc_ll_xid_cnf(struct gprs_sndcp_mgmt_entity *snme, uint32_t sapi, uint8_t *l3params, unsigned int l3params_len)
+int gprs_sndcp_snme_handle_llc_ll_xid_cnf(struct gprs_sndcp_mgmt_entity *snme, uint32_t sapi,
+ uint16_t n201_u, uint16_t n201_i,
+ uint8_t *l3params, unsigned int l3params_len)
{
/* Note: This function handles an incoming SNDCP-XID confirmation.
* Since the confirmation fields may lack important parameters we
@@ -1092,6 +1101,9 @@ int gprs_sndcp_snme_handle_llc_ll_xid_cnf(struct gprs_sndcp_mgmt_entity *snme, u
return -EINVAL;
}
+ sne->n201_u = n201_u;
+ sne->n201_i = n201_i;
+
if (sne->l3xid_req && sne->l3xid_req_len > 0) {
/* Parse SNDCP-CID XID-Field */
comp_fields_req = gprs_sndcp_parse_xid(NULL, sne, sne->l3xid_req, sne->l3xid_req_len, NULL);
diff --git a/src/sndcp/sndcp_prim.c b/src/sndcp/sndcp_prim.c
index 80dff8f..e371416 100644
--- a/src/sndcp/sndcp_prim.c
+++ b/src/sndcp/sndcp_prim.c
@@ -514,6 +514,7 @@ static int gprs_sndcp_prim_handle_llc_ll_xid_ind(struct osmo_gprs_llc_prim *llc_
}
rc = gprs_sndcp_snme_handle_llc_ll_xid_ind(snme, llc_prim->ll.sapi,
+ llc_prim->ll.xid.n201_u, llc_prim->ll.xid.n201_i,
llc_prim->ll.l3_pdu, llc_prim->ll.l3_pdu_len);
return rc;
}
@@ -532,6 +533,7 @@ static int gprs_sndcp_prim_handle_llc_ll_xid_cnf(struct osmo_gprs_llc_prim *llc_
}
rc = gprs_sndcp_snme_handle_llc_ll_xid_cnf(snme, llc_prim->ll.sapi,
+ llc_prim->ll.xid.n201_u, llc_prim->ll.xid.n201_i,
llc_prim->ll.l3_pdu, llc_prim->ll.l3_pdu_len);
return rc;
}