@@ -268,15 +268,79 @@ static int lcp_nak_mru(struct ppp_context *ctx, struct net_pkt *pkt,
268
268
269
269
return 0 ;
270
270
}
271
+ #endif
272
+
273
+ #define ASYNC_MAP_OPTION_LEN 6
274
+
275
+ static int lcp_add_async_map (struct ppp_context * ctx , struct net_pkt * pkt )
276
+ {
277
+ net_pkt_write_u8 (pkt , ASYNC_MAP_OPTION_LEN );
278
+ return net_pkt_write_be32 (pkt , ctx -> lcp .my_options .async_map );
279
+ }
280
+
281
+ static int lcp_ack_async_map (struct ppp_context * ctx , struct net_pkt * pkt ,
282
+ uint8_t oplen )
283
+ {
284
+ int ret ;
285
+ uint32_t async_map ;
286
+
287
+ /* Handle ACK : */
288
+ if (oplen != sizeof (async_map )) {
289
+ return - EINVAL ;
290
+ }
291
+
292
+ ret = net_pkt_read (pkt , & async_map , sizeof (async_map ));
293
+ if (ret ) {
294
+ return ret ;
295
+ }
296
+ if (async_map != ctx -> lcp .my_options .async_map ) {
297
+ /* Didn't acked our ASYNC_MAP: */
298
+ return - EINVAL ;
299
+ }
300
+
301
+ return 0 ;
302
+ }
303
+
304
+ static int lcp_nak_async_map (struct ppp_context * ctx , struct net_pkt * pkt ,
305
+ uint8_t oplen )
306
+ {
307
+ int ret ;
308
+ uint16_t async_map ;
309
+
310
+ /* Handle NAK: accept only equal to ours */
311
+ if (oplen != sizeof (async_map )) {
312
+ return - EINVAL ;
313
+ }
314
+
315
+ ret = net_pkt_read (pkt , & async_map , sizeof (async_map ));
316
+ if (ret ) {
317
+ return ret ;
318
+ }
319
+
320
+ if (async_map != ctx -> lcp .my_options .async_map ) {
321
+ return - EINVAL ;
322
+ }
323
+
324
+ return 0 ;
325
+ }
326
+
271
327
272
328
static const struct ppp_my_option_info lcp_my_options [] = {
329
+ #if defined(CONFIG_NET_L2_PPP_OPTION_MRU )
273
330
PPP_MY_OPTION (LCP_OPTION_MRU , lcp_add_mru , lcp_ack_mru , lcp_nak_mru ),
331
+ #endif
332
+ PPP_MY_OPTION (LCP_OPTION_ASYNC_CTRL_CHAR_MAP , lcp_add_async_map ,
333
+ lcp_ack_async_map , lcp_nak_async_map ),
274
334
};
275
335
BUILD_ASSERT (ARRAY_SIZE (lcp_my_options ) == LCP_NUM_MY_OPTIONS );
276
336
277
337
static struct net_pkt * lcp_config_info_add (struct ppp_fsm * fsm )
278
338
{
279
- return ppp_my_options_add (fsm , MRU_OPTION_LEN );
339
+ #if defined(CONFIG_NET_L2_PPP_OPTION_MRU )
340
+ return ppp_my_options_add (fsm , MRU_OPTION_LEN + ASYNC_MAP_OPTION_LEN );
341
+ #else
342
+ return ppp_my_options_add (fsm , ASYNC_MAP_OPTION_LEN );
343
+ #endif
280
344
}
281
345
282
346
static int lcp_config_info_nack (struct ppp_fsm * fsm , struct net_pkt * pkt ,
@@ -297,7 +361,6 @@ static int lcp_config_info_nack(struct ppp_fsm *fsm, struct net_pkt *pkt,
297
361
298
362
return 0 ;
299
363
}
300
- #endif
301
364
302
365
static void lcp_init (struct ppp_context * ctx )
303
366
{
@@ -311,8 +374,8 @@ static void lcp_init(struct ppp_context *ctx)
311
374
ppp_fsm_name_set (& ctx -> lcp .fsm , ppp_proto2str (PPP_LCP ));
312
375
313
376
ctx -> lcp .my_options .mru = net_if_get_mtu (ctx -> iface );
377
+ ctx -> lcp .my_options .async_map = 0xffffffff ;
314
378
315
- #if defined(CONFIG_NET_L2_PPP_OPTION_MRU )
316
379
ctx -> lcp .fsm .my_options .info = lcp_my_options ;
317
380
ctx -> lcp .fsm .my_options .data = ctx -> lcp .my_options_data ;
318
381
ctx -> lcp .fsm .my_options .count = ARRAY_SIZE (lcp_my_options );
@@ -321,7 +384,6 @@ static void lcp_init(struct ppp_context *ctx)
321
384
ctx -> lcp .fsm .cb .config_info_req = lcp_config_info_req ;
322
385
ctx -> lcp .fsm .cb .config_info_nack = lcp_config_info_nack ;
323
386
ctx -> lcp .fsm .cb .config_info_rej = ppp_my_options_parse_conf_rej ;
324
- #endif
325
387
326
388
ctx -> lcp .fsm .cb .up = lcp_up ;
327
389
ctx -> lcp .fsm .cb .down = lcp_down ;
0 commit comments