34 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
			
		
		
	
	
			34 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
| PPPoL2TP-Android plugin
 | |
| =======================
 | |
| 
 | |
| This PPPoL2TP-Android plugin was written for AOSP project from scratch. It has
 | |
| nothing to do with pppol2tp plugin from upstream ppp project [1].
 | |
| 
 | |
| This plugin adds support for upstream kernel L2TP implementation in pppd
 | |
| daemon. Only LAC part of L2TP is implemented, as we don't use Android devices
 | |
| in LNS mode.
 | |
| 
 | |
| In general case, the execution flow for VPN startup on Android devices is:
 | |
|  1. Run IPSec client (racoon)
 | |
|  2. Run L2TP client (mtpd)
 | |
|  3. mtpd obtains "remote tunnel ID" and "remote session ID" from L2TP server
 | |
|  4. mtpd creates L2TP sockets (see [2] for details):
 | |
|     - tunnel management PPPoX socket
 | |
|     - session PPPoX data socket
 | |
|  5. mtpd runs pppd, passing arguments for pppol2tp-android plugin
 | |
|  6. pppd dlopen() pppol2tp-android plugin (because it receives corresponding\
 | |
|     arguments from mtpd)
 | |
| 
 | |
| Main task of this plugin is to obtain session_fd socket from mtpd and pass it
 | |
| back to pppd when .connect() callback is executed. In this respect it's similar
 | |
| to old pppox.c implementation. The differences are next:
 | |
|  1. pppol2tp-android also obtains the second socket (for tunnel management)
 | |
|     which allows us to handle it properly
 | |
|  2. pppol2tp-android handles the setting of MTU/MRU size (which can be passed
 | |
|     to the plugin with pppd parameters) via kernel L2TP implementation
 | |
|  3. pppol2tp-android plugin is actually loaded dynamically with dlopen(),
 | |
|     as opposed to pppox.c which is hard-coded into pppd code
 | |
| 
 | |
| [1] https://github.com/paulusmack/ppp
 | |
| [2] https://www.kernel.org/doc/Documentation/networking/l2tp.txt
 |