linux内核根据skb获取目的mac地址

工作笔记 工作笔记 linux编程

  1. 直接通过skb里面的信息获取mac,如下
1.struct ethhdr *eth_hdr = (struct ethhdr *)skb_mac_header(skb);2.if(skb_mac_header_was_set(skb))3.{4.    memcpy(dmac, eth_hdr->h_dest, ETH_ALEN);5.}

注意:需要先通过skb_mac_header_was_set函数判断是否已经设置了mac头,如果没有设置依然调用memcpy将会卡住或者报内存未对齐的错误。

由于自己在iptables的OUTPUT链上挂载了一个target,这个时候捕获到的数据包是3层的,还没有mac地址头,因此上面的方法行不通。

  1. 根据内核arp.c的arp_find函数写一个查询arp的函数,如下:
1.2./* 从内核arp.c扣的arp_find函数,把skb->dev改为了dst->dev */3.int arp_find_local(unsigned char *haddr, struct sk_buff *skb)4.{5.    struct dst_entry *dst = skb_dst(skb);6.    struct net_device *dev = dst->dev;7.    __be32 paddr;8.    struct neighbour *n;9.10.    if (!skb_dst(skb)) {11.        pr_debug("arp_find is called with dst==NULL\n");12.        kfree_skb(skb);13.        return 1;14.    }15.16.    paddr = rt_nexthop(skb_rtable(skb), ip_hdr(skb)->daddr);17.18.    /* 指定create为0,只查找缓存,create = 1时貌似没找到会发arp查询包 */19.    n = __neigh_lookup(&arp_tbl, &paddr, dev, 0);20.21.    if (n) {22.        n->used = jiffies;23.        if (n->nud_state & NUD_VALID || neigh_event_send(n, skb) == 0) {24.            neigh_ha_snapshot(haddr, n, dev);25.            neigh_release(n);26.            return 0;27.        }28.        neigh_release(n);29.    } else30.        kfree_skb(skb);31.    return 1;32.}

linux内核根据skb获取目的mac地址相关推荐

  1. chrome web获取mac地址_老鬼傻瓜式讲解网络知识:网络设备如何通过IP地址获取设备MAC地址...

    导读:在前面老鬼向各位好友介绍一些关于网络的基础知识,同时针对ICMP协议(常见使用的Ping测试网络就是使用该协议)进行了详细介绍.具体可参见<Ping是你经常测试工业智能制造网络的工具,但你 ...

  2. 【瑞芯微Rockchip Linux平台】SoftAp需求实现(3)动态获取BT Mac地址并更新beacon帧中的mac信息

    [瑞芯微Rockchip Linux平台]SoftAp需求实现(3)动态获取BT Mac地址并更新beacon帧中的mac信息 1. 获取本机的蓝牙mac地址 __get_bt_mac_addr() ...

  3. linux c 获取mac地址吗,Linux系统下用C语言获取MAC地址

    最近在做一个小程序,需要用到在linux系统里编写C程序从而获取MAC地址,从网上搜了一遍,想总结一下.如果你就只需要单个功能的程序,可以采用方法一,见代码1,一般最好能够封装起来,写成获取MAC地址 ...

  4. kotlin获取属性_Kotlin程序获取系统MAC地址

    kotlin获取属性 The task is to get system MAC address. 任务是获取系统MAC地址. package com.includehelp import java. ...

  5. php获取网卡mac地址吗,php获取网卡MAC地址步骤详解

    这次给大家带来php获取网卡MAC地址步骤详解,php获取网卡MAC地址的注意事项有哪些,下面就是实战案例,一起来看一下. php获取网卡的物理地址,即mac地址.<?php /** 获取网卡的 ...

  6. 通过WMI获取网卡MAC地址、硬盘序列号、主板序列号、CPU ID、BIOS序列号

    开发语言:C/C++ 支持平台:Windows 实现功能: 通过WMI获取网卡MAC地址.硬盘序列号.主板序列号.CPU ID.BIOS序列号 下载地址: WMI_DeviceQuery.zip 版本 ...

  7. android 获取网卡mac_在安卓6.0(及以上)设备上无法获取无线网卡MAC地址的解决方案...

    在安卓6.0以下的设备上,通过WifiManager.getConnectionInfo().getMacAddress()即可获取WLAN物理地址, 而在6.0及以上,以此方式获取到的MAC地址为固 ...

  8. ARP原理概述——基于WinPcap发送ARP请求数据包获取远程MAC地址

    ARP原理概述--基于WinPcap发送ARP请求数据包获取远程MAC地址 ARP协议 ARP概述 ARP工作原理 ARP数据包格式 编写程序发送ARP请求获取本机和远程IP的MAC 注意: ARP协 ...

  9. 利用UDP(NetBIOS Name Service)来快速获取远程主机MAC地址的方法

    利用UDP(NetBIOS Name Service)来快速获取远程主机MAC地址的方法 import java.io.IOException; import java.net.DatagramPac ...

最新文章

  1. java人工洗牌窗口程序_求解,用JAVA写洗牌与发牌模拟程序
  2. Luogu P1087 FBI树
  3. 两款轻量级服务器 Http-server SimpleHTTPServer
  4. 解决mysql“Access denied for user root@localhost”
  5. JMeter扩展JMeter插件获取更多监听器
  6. 【树形区间DP】加分二叉树(ssl 1033/luogu 1040)
  7. java customerservlet_顾客管理系统java+servlet
  8. 获取url参数值(可解码中文值)
  9. Oracle性能监控脚本(sql)
  10. 一些常见的iOS面试问题,一眼就能看出 初级和高级工程师的区别
  11. 安装Jenkins后 启动时失败的问题解决
  12. [原创]Ajax UpLoadFile 多个大文件上传控件及应用范例
  13. python自动化--接口请求及封装
  14. oracle学习-数据迁移
  15. Atitit 软件方法论法典概论 attilax著作 目录 1. 基本法通则总则 2 2. 流程方法 3 2.1. 工具链建设法 4 2.2. 代码编写法 4 2.3. 注释法 4 2.4. 文档法
  16. 矩阵运算中的trick
  17. 太极周易罗盘计算机器人图片,周易八卦--罗盘的使用
  18. html文件下载时的header设置
  19. 多种Map简单使用和测试
  20. 神秘的罗斯柴尔德家族

热门文章

  1. Linux下的进程内存结构
  2. python字符串查找的四种方法_Python中的字符串查找操作方法总结
  3. 根据varchar排列是怎么比大小的_骨架大小怎么看?肩宽、胸腔宽、胯宽是关键,加码大骨架穿搭技巧...
  4. php日期数组,关于php日期数组的用法汇总
  5. css实现圆球旋像水波波动_手机拍屏幕烦人的“水波纹”小米10靠它给解决掉了...
  6. LucasExlucas
  7. js动态创建元素和删除
  8. java调用支付宝接口代码介绍
  9. HDUOJ 不容易系列之(4)——考新郎
  10. 【iCore4 双核心板_ARM】例程十一:DMA实验——存储器到存储器的传输