View | Details | Raw Unified | Return to bug 66225
Collapse All | Expand All

(-)share/man/man4/ng_eiface.4 (-16 / +12 lines)
Lines 65-89 Link Here
65
.Sh CONTROL MESSAGES
65
.Sh CONTROL MESSAGES
66
This node type supports the generic control messages, plus the following:
66
This node type supports the generic control messages, plus the following:
67
.Bl -tag -width indent
67
.Bl -tag -width indent
68
.It Dv NGM_EIFACE_SET
68
.It Dv NGM_EIFACE_GET_IFNAME Pq Li getifname
69
Set link-level address of the interface.
69
Returns the name of the associated interface as a
70
Requires
71
.Vt "struct ether_addr"
72
as an argument.
73
This message also has an
74
.Tn ASCII
75
version, called
76
.Dq Li set ,
77
which requires as an argument an
78
.Tn ASCII
79
string consisting of 6 colon-separated hex digits.
80
.It Dv NGM_EIFACE_GET_IFNAME
81
Return the name of the associated interface as a
82
.Dv NUL Ns -terminated
70
.Dv NUL Ns -terminated
83
.Tn ASCII
71
.Tn ASCII
84
string.
72
string.
85
.It Dv NGM_EIFACE_GET_IFADDRS
73
.It DV NGM_EIFACE_GET_IFINDEX Pq Li getifindex
86
Return the list of link-level addresses associated with the node.
74
Returns the global index of the associated inteface as a 32-bit integer.
75
.It DV NGM_EIFACE_GET_ENADDR Pq Li getenaddr
76
Returns the associated interface's unique six-byte Ethernet address.
77
.It Dv NGM_EIFACE_SET_ENADDR Pq Li setenaddr
78
Sets the associated interface's unique six-byte Ethernet address.
79
This control message is equivalent to using the
80
.Dv SIOCIFLLADDR
81
.Xr ioctl 2
82
system call.
87
.El
83
.El
88
.Sh SHUTDOWN
84
.Sh SHUTDOWN
89
This node shuts down upon receipt of a
85
This node shuts down upon receipt of a
(-)sys/netgraph/ng_eiface.c (-60 / +43 lines)
Lines 60-67 Link Here
60
static const struct ng_cmdlist ng_eiface_cmdlist[] = {
60
static const struct ng_cmdlist ng_eiface_cmdlist[] = {
61
	{
61
	{
62
	  NGM_EIFACE_COOKIE,
62
	  NGM_EIFACE_COOKIE,
63
	  NGM_EIFACE_SET,
63
	  NGM_EIFACE_GET_IFNAME,
64
	  "set",
64
	  "getifname",
65
	  NULL,
66
	  &ng_parse_string_type
67
	},
68
	{
69
	  NGM_EIFACE_COOKIE,
70
	  NGM_EIFACE_GET_IFINDEX,
71
	  "getifindex",
72
	  NULL,
73
	  &ng_parse_int32_type
74
	},
75
	{
76
	  NGM_EIFACE_COOKIE,
77
	  NGM_EIFACE_GET_ENADDR,
78
	  "getenaddr",
79
	  NULL,
80
	  &ng_parse_enaddr_type
81
	},
82
	{
83
	  NGM_EIFACE_COOKIE,
84
	  NGM_EIFACE_SET_ENADDR,
85
	  "setenaddr",
65
	  &ng_parse_enaddr_type,
86
	  &ng_parse_enaddr_type,
66
	  NULL
87
	  NULL
67
	},
88
	},
Lines 486-565 Link Here
486
	switch		(msg->header.typecookie) {
507
	switch		(msg->header.typecookie) {
487
	case NGM_EIFACE_COOKIE:
508
	case NGM_EIFACE_COOKIE:
488
		switch (msg->header.cmd) {
509
		switch (msg->header.cmd) {
489
		case NGM_EIFACE_SET:
510
		case NGM_EIFACE_GET_IFNAME:
490
		{
511
			NG_MKRESPONSE(resp, msg, IFNAMSIZ + 1, M_NOWAIT);
491
			struct ether_addr *eaddr;
512
			if (resp == NULL) {
492
			struct ifaddr *ifa;
513
				error = ENOMEM;
493
			struct sockaddr_dl *sdl;
494
495
			if (msg->header.arglen != sizeof(struct ether_addr)){
496
				error = EINVAL;
497
				break;
514
				break;
498
			}
515
			}
499
			eaddr = (struct ether_addr *)(msg->data);
516
			strlcpy(resp->data, ifp->if_xname, IFNAMSIZ + 1);
500
			bcopy(eaddr, priv->arpcom.ac_enaddr, ETHER_ADDR_LEN);
501
502
			/* And put it in the ifaddr list */
503
			TAILQ_FOREACH(ifa, &(ifp->if_addrhead), ifa_link) {
504
				sdl = (struct sockaddr_dl *)ifa->ifa_addr;
505
				if (sdl->sdl_type == IFT_ETHER) {
506
					bcopy((IFP2AC(ifp))->ac_enaddr,
507
						LLADDR(sdl), ifp->if_addrlen);
508
					break;
509
				}
510
			}
511
			break;
517
			break;
512
		}
513
518
514
		case NGM_EIFACE_GET_IFNAME:
519
		case NGM_EIFACE_GET_IFINDEX:
515
		{
520
			NG_MKRESPONSE(resp, msg, sizeof(u_int32_t), M_NOWAIT);
516
			struct ng_eiface_ifname *arg;
517
518
			NG_MKRESPONSE(resp, msg, sizeof(*arg), M_NOWAIT);
519
			if (resp == NULL) {
521
			if (resp == NULL) {
520
				error = ENOMEM;
522
				error = ENOMEM;
521
				break;
523
				break;
522
			}
524
			}
523
			arg = (struct ng_eiface_ifname *)resp->data;
525
			*((u_int32_t *)resp->data) = ifp->if_index;
524
			strlcpy(arg->ngif_name, ifp->if_xname,
525
			    sizeof(arg->ngif_name));
526
			break;
526
			break;
527
		}
528
527
529
		case NGM_EIFACE_GET_IFADDRS:
528
		case NGM_EIFACE_GET_ENADDR:
530
		{
529
			NG_MKRESPONSE(resp, msg, ETHER_ADDR_LEN, M_NOWAIT);
531
			struct ifaddr  *ifa;
532
			caddr_t		ptr;
533
			int		buflen;
534
535
#define SA_SIZE(s)	((s)->sa_len<sizeof(*(s))? sizeof(*(s)):(s)->sa_len)
536
537
			/* Determine size of response and allocate it */
538
			buflen = 0;
539
			TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link)
540
			buflen += SA_SIZE(ifa->ifa_addr);
541
			NG_MKRESPONSE(resp, msg, buflen, M_NOWAIT);
542
			if (resp == NULL) {
530
			if (resp == NULL) {
543
				error = ENOMEM;
531
				error = ENOMEM;
544
				break;
532
				break;
545
			}
533
			}
546
			/* Add addresses */
534
			bcopy((IFP2AC(ifp))->ac_enaddr,
547
			ptr = resp->data;
535
				resp->data, ETHER_ADDR_LEN);
548
			TAILQ_FOREACH(ifa, &ifp->if_addrhead, ifa_link) {
536
			break;
549
				const int       len = SA_SIZE(ifa->ifa_addr);
537
550
538
		case NGM_EIFACE_SET_ENADDR:
551
				if (buflen < len) {
539
			if (msg->header.arglen != ETHER_ADDR_LEN){
552
					log(LOG_ERR, "%s: len changed?\n",
540
				error = EINVAL;
553
					ifp->if_xname);
541
				break;
554
					break;
555
				}
556
				bcopy(ifa->ifa_addr, ptr, len);
557
				ptr += len;
558
				buflen -= len;
559
			}
542
			}
543
			error = if_setlladdr(ifp,
544
				(u_char *)msg->data, ETHER_ADDR_LEN);
560
			break;
545
			break;
561
#undef SA_SIZE
562
		}
563
546
564
		default:
547
		default:
565
			error = EINVAL;
548
			error = EINVAL;
(-)sys/netgraph/ng_eiface.h (-9 / +5 lines)
Lines 38-62 Link Here
38
38
39
/* Interface base name */
39
/* Interface base name */
40
#define NG_EIFACE_EIFACE_NAME		"ngeth"
40
#define NG_EIFACE_EIFACE_NAME		"ngeth"
41
#define NG_EIFACE_EIFACE_NAME_MAX	15
42
41
43
/* My hook names */
42
/* My hook names */
44
#define NG_EIFACE_HOOK_ETHER		"ether"
43
#define NG_EIFACE_HOOK_ETHER		"ether"
45
44
46
/* MTU bounds */
45
/* MTU bounds */
47
#define NG_EIFACE_MTU_MIN		72
46
#define NG_EIFACE_MTU_MIN		72
48
#define NG_EIFACE_MTU_MAX		2312
47
#define NG_EIFACE_MTU_MAX		9000
49
#define NG_EIFACE_MTU_DEFAULT		1500
48
#define NG_EIFACE_MTU_DEFAULT		1500
50
49
51
/* Netgraph commands */
50
/* Netgraph commands */
52
enum {
51
enum {
53
	NGM_EIFACE_GET_IFNAME = 1,	/* returns struct ng_eiface_ifname */
52
	NGM_EIFACE_GET_IFNAME = 1,	/* get the interface name */
54
	NGM_EIFACE_GET_IFADDRS,		/* returns list of addresses */
53
	NGM_EIFACE_GET_IFINDEX,		/* get the interface global index # */
55
	NGM_EIFACE_SET,			/* set ethernet address */
54
	NGM_EIFACE_GET_ENADDR,		/* get Ethernet address */
56
};
55
	NGM_EIFACE_SET_ENADDR,		/* set Ethernet address */
57
58
struct ng_eiface_ifname {
59
	char    ngif_name[NG_EIFACE_EIFACE_NAME_MAX + 1];
60
};
56
};
61
57
62
#endif /* _NETGRAPH_NG_EIFACE_H_ */
58
#endif /* _NETGRAPH_NG_EIFACE_H_ */

Return to bug 66225