荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: jjksam (UNIX+C+XML+??), 信区: Linux
标  题: Re: Linux下如何修改mac地址?(转寄)[转载]
发信站: 荔园晨风BBS站 (Wed Apr 17 15:14:09 2002), 转信

【 以下文字转载自 jjksam 的信箱 】
【 原文由 jjksam@smth.org 所发表 】
发信人: Luther (Luther), 信区: KernelTech
标  题: Re: Linux下如何修改mac地址?
发信站: BBS 水木清华站 (Sun Jan 13 10:35:00 2002)


【 在 truecolor (英雄本色) 的大作中提到: 】
: 用ifconfig可以改变MAC地址
: 可以man一下ifconfig。
/*
 * Copyright (C) 1995 by Louis P. Kruger <lpkruger@cs.princeton.edu> and
 *                       Andrew C. Myers <acmyers@cs.princeton.edu>
 * -----------------------------------------------------------------------
 * File    : modifymac.c
 * Kernel  : 2.2.16 or 2.2.14
 * Rewriten: scz < mailto: scz@nsfocus.com >
 *         : http://www.nsfocus.com
 * Complie : gcc -O3 -DMODULE -D__KERNEL__ -c -Wall modifymac.c
 * Date    : 2000-10-13 20:52
 */
/*
 * Kernel  : 2.4.2-2
 * Rewriten: Luther < mailto: Luther@pku.edu >
 * Date    : 2001-09-29 11:55
 */
/*
 * 如果不是在console上加载模块,比如远程加载,需要注意一个问题,ARP地址解
 * 析需要重新进行,所以暂时会出现通信异常,此时立即arp -d迫使发生新的ARP地
 * 址解析,通信将恢复正常
 */
#include <linux/config.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/version.h>
#include <linux/netdevice.h>
#include <linux/if_ether.h>
#include <linux/if_packet.h>
#include <linux/skbuff.h>
#include <linux/ip.h>
#include <linux/tcp.h>
/*
 * 2.2.16内核的/usr/include/linux/version.h文件里定义了这个宏
 * 但2.0.35内核里没有定义
 */
#ifndef KERNEL_VERSION
#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
#endif
#if LINUX_VERSION_CODE > KERNEL_VERSION(2,2,0)
#include <asm/uaccess.h>
#endif
static u_char orig_mac[]  = { 0x00, 0x10, 0x51, 0xEE, 0xEE, 0xEE };
static u_char mac[6]   = { 0x00, 0x00, 0x00, 0x22, 0x22, 0x22 };
static struct net_device * modifymac_dev = NULL;
rwlock_t dev_base_lock   = RW_LOCK_UNLOCKED;
const char *          dev  = NULL;
/* 定义insmod命令行参数 */
#if LINUX_VERSION_CODE > KERNEL_VERSION(2,2,0)
MODULE_PARM( dev, "s" );
MODULE_PARM( mac, "1-6b" );
#endif
int init_module ( void )  /* 模块初始化 */
{
 int i;
 if ( dev != NULL ) {
  read_lock(&dev_base_lock);
  modifymac_dev = (struct net_device *)__dev_get_by_name( dev );
  read_unlock(&dev_base_lock);
  if ( NULL == modifymac_dev ) {
   printk( "Did not find device %s\n", dev );
   return( -ENXIO );
  }
 } else {
  printk( "Missing dev.\n" );
  return -ENXIO;
 }
 printk( "mac -> " );
 /*start_bh_atomic(); */
 for ( i = 0; i < 6 ; i++ ) {
  printk( "%02x:", mac[i] );
  orig_mac[i]                = modifymac_dev->dev_addr[i];
  modifymac_dev->dev_addr[i] = mac[i];
 }
 /*end_bh_atomic(); */
 printk( "\n" );
 EXPORT_NO_SYMBOLS;
 return 0;
}  /* end of init_module */
void cleanup_module ( void )  /* 模块卸载 */
{
 int i;
 printk( "orig_mac -> " );
 /*start_bh_atomic();*/
 for ( i = 0; i < 6 ; i++ ) {
  printk( "%02x:", orig_mac[i] );
  modifymac_dev->dev_addr[i] = orig_mac[i];
 }
 /*end_bh_atomic();*/
 printk( "\n" );
 return;
}  /* end of cleanup_module */


--

    Keep It Simple and Stupid!


※ 来源:·BBS 水木清华站 smth.org·[FROM: 166.111.160.6]
--
※ 转载:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.0.146]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店