? compile/CALLISTO ? i386/conf/CALLISTO ? modules/linux/linux_assym.h ? modules/linux/opt_compat.h ? modules/linux/opt_linux.h ? modules/linux/opt_vmpage.h ? modules/linux/vnode_if.h ? modules/linux/linux.kld ? modules/linux/setdefs.h ? modules/linux/setdef0.c ? modules/linux/setdef1.c ? modules/linux/linux.ko Index: compat/linux/linux_ioctl.c =================================================================== RCS file: /home/ncvs/src/sys/compat/linux/linux_ioctl.c,v retrieving revision 1.62 diff -u -r1.62 linux_ioctl.c --- compat/linux/linux_ioctl.c 2001/02/16 16:40:41 1.62 +++ compat/linux/linux_ioctl.c 2001/05/27 20:54:58 @@ -985,7 +985,54 @@ return (ENOIOCTL); } +#define isdigit(x) ((x) >= '0' && (x) <= '9') +#define isupper(x) (((unsigned)(x) >= 'A') && ((unsigned)(x) <= 'Z')) +#define islower(x) (((unsigned)(x) >= 'a') && ((unsigned)(x) <= 'z')) +#define isalpha(x) (isupper(x) || islower(x)) +#define toupper(x) (isupper(x) ? (x) : (x) - 'a' + 'A') +#define tonumeric(x) (isdigit(x) ? (x) - '0' : isalpha(x) ? toupper(x) - 'A' + 10 : 0) + +/* XXX WAY OUT OF PLACE */ +int +convert_lladdr(char *lladdr_human, char *lladdr) { + int num = 0; + int a,b; + int len = strlen(lladdr_human); + + printf("Convert a human readable lladdr into a machine readable.\n"); + + if (len == 12) { + for (num = 0; num < 6; num++) { + printf("lladdr[%d] = %d << 4 + %d\n", num, tonumeric(lladdr_human[num * 2]), tonumeric(lladdr_human[(num * 2) + 1])); + lladdr[num] = (tonumeric(lladdr_human[num*2]) << 4) + tonumeric(lladdr_human[(num*2)+1]); + } + return 0; + } + return -1; /* + for (num = 0; num < len; num++) { + printf("laddr_human[%d] : %c -> %d\n", num, lladdr_human[num], tonumeric(lladdr_human[num])); +n if (lladdr_human[num]) + printf("laddr_human : %c\n", *lladdr_human); + printf("laddr_human+1 : %c\n", *(lladdr_human+1)); + a = tonumeric(*(lladdr_human++)); + b = tonumeric(*(lladdr_human++)); + *(lladdr++) = a; + *(lladdr++) = b; + printf("a = %d, b = %d\n", a, b); + + } + + printf("convert_lladdr : %s\n", lladdr_human); + + printf("Decimal version of lladdr : 0x%x\n", (uint32_t)*lladdr); + + printf("convert returned : %d\n", convert_lladdr(lladdr_human, &lladdr)); */ + return 0; +} + + +/* * Sound related ioctls */ @@ -1380,10 +1427,13 @@ struct ifaddr *ifa; struct sockaddr_dl *sdl; struct linux_ifreq *ifr = (struct linux_ifreq *)args->arg; + char *lladdr_human = linux_get_lladdr(p); + char lladdr[6]; /* Note that we don't actually respect the name in the ifreq * structure, as Linux interface names are all different. */ + printf("IN LINUX_SIOCFIGHWADDR! (%s)\n", lladdr_human); for (ifn = 0; ifn < if_index; ifn++) { ifp = ifnet_addrs[ifn]->ifa_ifp; if (ifp->if_type == IFT_ETHER) { @@ -1393,6 +1443,19 @@ if (sdl != NULL && (sdl->sdl_family == AF_LINK) && (sdl->sdl_type == IFT_ETHER)) { + printf("We're copyingout (linuxmac sdl_data) : %s\n", sdl->sdl_data); + if (!convert_lladdr(lladdr_human, (char *)&lladdr)) + printf("lladdr :"); + if (strlen(lladdr) == 12) { + /* Valid lladdr override sysctl */ + printf("Valid override lladdr found!\n"); + +/* printf("LLADDR(sdl) : %s\n", LLADDR(sdl));*/ + } + +/* Here we should query the state of the linux.lladdr_override and if + it's not 0, use that! We've got the proc struct word. */ + return (copyout(LLADDR(sdl), &ifr->ifr_hwaddr.sa_data, LINUX_IFHWADDRLEN)); Index: compat/linux/linux_mib.c =================================================================== RCS file: /home/ncvs/src/sys/compat/linux/linux_mib.c,v retrieving revision 1.10 diff -u -r1.10 linux_mib.c --- compat/linux/linux_mib.c 2001/02/21 06:39:54 1.10 +++ compat/linux/linux_mib.c 2001/05/27 20:55:13 @@ -36,18 +36,76 @@ #include #include +#include + #include #include struct linux_prison { char pr_osname[LINUX_MAX_UTSNAME]; char pr_osrelease[LINUX_MAX_UTSNAME]; + struct ether_addr *eth0_mac; int pr_oss_version; }; SYSCTL_NODE(_compat, OID_AUTO, linux, CTLFLAG_RW, 0, "Linux mode"); +/* + * Convert an ASCII representation of an ethernet address to + * binary form. + */ +struct ether_addr *ether_aton(a) + const char *a; +{ + int i; + static struct ether_addr o; + unsigned int o0, o1, o2, o3, o4, o5; + + i = sscanf(a, "%x:%x:%x:%x:%x:%x", &o0, &o1, &o2, &o3, &o4, &o5); + + if (i != 6) + return (NULL); + + o.octet[0]=o0; + o.octet[1]=o1; + o.octet[2]=o2; + o.octet[3]=o3; + o.octet[4]=o4; + o.octet[5]=o5; + + return ((struct ether_addr *)&o); +} + + +static char linux_eth0_lladdr_override[13] = ""; + + + +/* #define SYSCTL_HANDLER_ARGS struct sysctl_oid *oidp, void *arg1, int arg2, \ + struct sysctl_req *req */ + +static int +linux_sysctl_lladdr_override(SYSCTL_HANDLER_ARGS) +{ + char lladdr[13]; + int error; + + /* This takes a proc structure and gets the osname for this + linux prison */ + strcpy(lladdr, linux_get_lladdr(req->p)); + error = sysctl_handle_string(oidp, lladdr, 13, req); + if (error || req->newptr == NULL) + return (error); + error = linux_set_lladdr(req->p, lladdr); + return (error); +} + +SYSCTL_PROC(_compat_linux, OID_AUTO, lladdr_override, + CTLTYPE_STRING | CTLFLAG_RW | CTLFLAG_PRISON, + 0, 0, linux_sysctl_lladdr_override, "A", + "Linux mac address for eth0"); + static char linux_osname[LINUX_MAX_UTSNAME] = "Linux"; static int @@ -129,6 +187,38 @@ } return (pr->pr_linux); +} + +char * +linux_get_lladdr(p) + struct proc *p; +{ + register struct prison *pr; + register struct linux_prison *lpr; + + pr = p->p_ucred->cr_prison; + if (pr != NULL && pr->pr_linux != NULL) { + lpr = pr->pr_linux; + if (lpr->pr_eth0_lladdr[0]) + return (lpr->pr_eth0_lladdr); + } + + return (linux_eth0_lladdr_override); +} + +int +linux_set_lladdr(p, lladdr) + struct proc *p; + char *lladdr; +{ + register struct linux_prison *lpr; + + lpr = get_prison(p); + if (lpr != NULL) + strcpy(lpr->pr_eth0_lladdr, lladdr); + else + strcpy(linux_eth0_lladdr_override, lladdr); + return (0); } char * Index: compat/linux/linux_mib.h =================================================================== RCS file: /home/ncvs/src/sys/compat/linux/linux_mib.h,v retrieving revision 1.3 diff -u -r1.3 linux_mib.h --- compat/linux/linux_mib.h 2000/08/25 07:31:13 1.3 +++ compat/linux/linux_mib.h 2001/05/27 20:55:13 @@ -40,4 +40,7 @@ int linux_get_oss_version __P((struct proc *p)); int linux_set_oss_version __P((struct proc *p, int oss_version)); +char* linux_get_lladdr __P((struct proc *p)); +int linux_set_lladdr __P((struct proc *p, char *lladdr)); + #endif /* _LINUX_MIB_H_ */