Module Name:    src
Committed By:   roy
Date:           Wed Sep 14 10:58:38 UTC 2016

Modified Files:
        src/sys/net: if_spppsubr.c if_spppvar.h

Log Message:
Add interface media for sppp consumers.
While there is no actual media to select,
the ioctl is used to query link status from userland.


To generate a diff of this commit:
cvs rdiff -u -r1.149 -r1.150 src/sys/net/if_spppsubr.c
cvs rdiff -u -r1.16 -r1.17 src/sys/net/if_spppvar.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/net/if_spppsubr.c
diff -u src/sys/net/if_spppsubr.c:1.149 src/sys/net/if_spppsubr.c:1.150
--- src/sys/net/if_spppsubr.c:1.149	Tue Sep 13 19:51:12 2016
+++ src/sys/net/if_spppsubr.c	Wed Sep 14 10:58:38 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_spppsubr.c,v 1.149 2016/09/13 19:51:12 joerg Exp $	 */
+/*	$NetBSD: if_spppsubr.c,v 1.150 2016/09/14 10:58:38 roy Exp $	 */
 
 /*
  * Synchronous PPP/Cisco link level subroutines.
@@ -41,7 +41,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_spppsubr.c,v 1.149 2016/09/13 19:51:12 joerg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_spppsubr.c,v 1.150 2016/09/14 10:58:38 roy Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_inet.h"
@@ -861,6 +861,31 @@ sppp_output(struct ifnet *ifp, struct mb
 	return error;
 }
 
+static int
+sppp_mediachange(struct ifnet *ifp)
+{
+
+	return (0);
+}
+
+static void
+sppp_mediastatus(struct ifnet *ifp, struct ifmediareq *imr)
+{
+
+	switch (ifp->if_link_state) {
+	case LINK_STATE_UP:
+		imr->ifm_status = IFM_AVALID | IFM_ACTIVE;
+		break;
+	case LINK_STATE_DOWN:
+		imr->ifm_status = IFM_AVALID;
+		break;
+	default:
+		/* Should be impossible as we set link state down in attach. */
+		imr->ifm_status = 0;
+		break;
+	}
+}
+
 void
 sppp_attach(struct ifnet *ifp)
 {
@@ -897,6 +922,11 @@ sppp_attach(struct ifnet *ifp)
 
 	if_alloc_sadl(ifp);
 
+	/* Lets not beat about the bush, we know we're down. */
+	ifp->if_link_state = LINK_STATE_DOWN;
+	/* There is no media for PPP, but it's needed to report link status. */
+	ifmedia_init(&sp->pp_im, 0, sppp_mediachange, sppp_mediastatus);
+
 	memset(&sp->myauth, 0, sizeof sp->myauth);
 	memset(&sp->hisauth, 0, sizeof sp->hisauth);
 	sppp_lcp_init(sp);
@@ -1101,6 +1131,10 @@ sppp_ioctl(struct ifnet *ifp, u_long cmd
 		error = sppp_params(sp, cmd, data);
 		break;
 
+	case SIOCGIFMEDIA:
+		error = ifmedia_ioctl(ifp, ifr, &sp->pp_im, cmd);
+		break;
+
 	default:
 		error = ifioctl_common(ifp, cmd, data);
 		break;

Index: src/sys/net/if_spppvar.h
diff -u src/sys/net/if_spppvar.h:1.16 src/sys/net/if_spppvar.h:1.17
--- src/sys/net/if_spppvar.h:1.16	Mon Oct  5 21:27:36 2009
+++ src/sys/net/if_spppvar.h	Wed Sep 14 10:58:38 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_spppvar.h,v 1.16 2009/10/05 21:27:36 dyoung Exp $	*/
+/*	$NetBSD: if_spppvar.h,v 1.17 2016/09/14 10:58:38 roy Exp $	*/
 
 #ifndef _NET_IF_SPPPVAR_H_
 #define _NET_IF_SPPPVAR_H_
@@ -26,6 +26,8 @@
  * From: Id: if_sppp.h,v 1.7 1998/12/01 20:20:19 hm Exp
  */
 
+#include <net/if_media.h>
+
 #define IDX_LCP 0		/* idx into state table */
 
 struct slcp {
@@ -79,6 +81,7 @@ struct sauth {
 struct sppp {
 	/* NB: pp_if _must_ be first */
 	struct  ifnet pp_if;    /* network interface data */
+	struct	ifmedia pp_im;	/* interface media, to report link status */
 	struct  ifqueue pp_fastq; /* fast output queue */
 	struct	ifqueue pp_cpq;	/* PPP control protocol queue */
 	struct  sppp *pp_next;  /* next interface in keepalive list */

Reply via email to