misc/67906: PATCH: rfcomm_pppd can now register as 'serial port profile'

Christian Gusenbauer c47g at gmx.at
Sun Jun 13 15:20:13 GMT 2004


>Number:         67906
>Category:       misc
>Synopsis:       PATCH: rfcomm_pppd can now register as 'serial port profile'
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Sun Jun 13 15:20:11 GMT 2004
>Closed-Date:
>Last-Modified:
>Originator:     Christian Gusenbauer
>Release:        FreeBSD 5.2-CURRENT i386
>Organization:
>Environment:
System: FreeBSD bones.gusis.at 5.2-CURRENT FreeBSD 5.2-CURRENT #7: Sat Jun 5 
16:51:47 CEST 2004 root@:/jail/obj/jail/src/sys/BONES i386


>Description:
        These patches add support to rfcomm_pppd to let the server register a
	LAN or a serial port profile. I added a 'profile' argument to the
	-s option to allow the user to select which profile he wants to be
	registered. Some mobile phones like the Sony/Ericsson P900 use a callback
	mechanism and are searching for a serial port profile to connect to.

>How-To-Repeat:
>Fix:

--- /usr/src/usr.sbin/bluetooth/rfcomm_pppd/rfcomm_pppd.c	Fri Feb 27 16:53:59 2004
+++ /home/cg/tmp/p900/rfcomm_pppd/rfcomm_pppd.c	Sun Jun 13 16:35:13 2004
@@ -63,6 +63,7 @@
 	char			*label = NULL, *unit = NULL, *ep = NULL;
 	bdaddr_t		 addr;
 	int			 s, channel, detach, server, service;
+	int			 lansrv, sppsrv;
 	pid_t			 pid;
 
 	memcpy(&addr, NG_HCI_BDADDR_ANY, sizeof(addr));
@@ -70,9 +71,11 @@
 	detach = 1;
 	server = 0;
 	service = 0;
+	lansrv = 0;
+	sppsrv = 0;
 
 	/* Parse command line arguments */
-	while ((s = getopt(argc, argv, "a:cC:dhl:su:")) != -1) {
+	while ((s = getopt(argc, argv, "a:cC:dhl:s:u:")) != -1) {
 		switch (s) {
 		case 'a': /* BDADDR */
 			if (!bt_aton(optarg, &addr)) {
@@ -115,6 +118,14 @@
 
 		case 's': /* server */
 			server = 1;
+			if (strcasecmp(optarg, "lan") == 0) {
+				lansrv = 1;
+			} else if (strcasecmp(optarg, "sp") == 0) {
+				sppsrv = 1;
+			} else {
+				usage();
+				/* NOT REACHED */
+			}
 			break;
 
 		case 'u': /* PPP -unit option */
@@ -182,6 +193,7 @@
 		struct sigaction	 sa;
 		void			*ss = NULL;
 		sdp_lan_profile_t	 lan;
+		sdp_sp_profile_t	 sp;
 
 		/* Install signal handler */
 		memset(&sa, 0, sizeof(sa));
@@ -247,16 +259,32 @@
 			exit(1);
 		}
 
-		memset(&lan, 0, sizeof(lan));
-		lan.server_channel = channel;
-
-		if (sdp_register_service(ss,
-				SDP_SERVICE_CLASS_LAN_ACCESS_USING_PPP,
-				&addr, (void *) &lan, sizeof(lan), NULL) != 0) {
-			syslog(LOG_ERR, "Unable to register LAN service with " \
-				"local SDP daemon. %s (%d)",
-				strerror(sdp_error(ss)), sdp_error(ss));
-			exit(1);
+		if (sppsrv) {
+			memset(&sp, 0, sizeof(sp));
+			sp.server_channel = channel;
+			
+			if (sdp_register_service(ss, SDP_SERVICE_CLASS_SERIAL_PORT,
+						 &addr, (void *) &sp, sizeof(sp), NULL) != 0) {
+				syslog(LOG_ERR, "Unable to register SP service with " \
+					"local SDP daemon. %s (%d)",
+					strerror(sdp_error(ss)), sdp_error(ss));
+				exit(1);
+			}
+		} else if (lansrv) {
+			memset(&lan, 0, sizeof(lan));
+			lan.server_channel = channel;
+
+			if (sdp_register_service(ss,
+					SDP_SERVICE_CLASS_LAN_ACCESS_USING_PPP,
+					&addr, (void *) &lan, sizeof(lan), NULL) != 0) {
+				syslog(LOG_ERR, "Unable to register LAN service with " \
+					"local SDP daemon. %s (%d)",
+					strerror(sdp_error(ss)), sdp_error(ss));
+				exit(1);
+			}
+		} else {
+			usage();
+			/* NOT REACHED */
 		}
 		
 		for (done = 0; !done; ) {
@@ -398,7 +426,8 @@
 "\t-C channel   RFCOMM channel to listen on or connect to (required)\n" \
 "\t-d           Run in foreground\n" \
 "\t-l label     Use PPP label (required)\n" \
-"\t-s           Act as a server\n" \
+"\t-s (lan|sp)  Act as a server and register either as LAN or as\n" \
+"\t             Serial Port profile\n" \
 "\t-u N         Tell PPP to operate on /dev/tunN (client mode only)\n" \
 "\t-h           Display this message\n", RFCOMM_PPPD);
 


--- /usr/src/usr.sbin/bluetooth/rfcomm_pppd/rfcomm_pppd.8	Sat Jun  5 12:25:30 2004
+++ /home/cg/tmp/p900/rfcomm_pppd/rfcomm_pppd.8	Sun Jun 13 16:58:16 2004
@@ -40,7 +40,7 @@
 .Fl l Ar label
 .Fl u Ar N
 .Nm
-.Fl s
+.Fl s Ar service
 .Op Fl dh
 .Op Fl a Ar BD_ADDR
 .Fl C Ar channel
@@ -126,8 +126,14 @@
 In both client and server modes, this required option specifies which
 .Xr ppp 8
 label will be used.
-.It Fl s
-Act as an RFCOMM server.
+.It Fl s Ar profile
+Act as an RFCOMM server and register a service. Supported service names are
+.Cm LAN
+(for LAN Access using PPP service) and
+.Cm SP
+(for Serial Profile using PPP service). Some mobile phones like the Sony/Ericsson
+P900 use a callback mechanism and are searching for a serial port profile to
+connect to.
 .It Fl u Ar N
 This option maps directly onto
 .Fl unit
>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-bugs mailing list