linux与应用层通信方式 之nf_sock_opt

本文详细介绍了如何在Linux内核中实现自定义网络套接字选项的设置与获取,包括内核模块的编写、注册及用户空间与内核空间的数据交互过程。通过具体的代码示例,展示了如何使用setsockopt和getsockopt系统调用来配置和读取内核中的特定选项。
  1. //内核部分代码。大家可以COPY ipt_sockopts

[cpp] view plain copy

  1. //#include <linux/config.h>
  2. #include <linux/module.h>
  3. #include <linux/moduleparam.h>
  4. #include <linux/init.h>
  5. #include "hello_sock_opt.h"
  6. #include <linux/kmod.h>
  7. #include <linux/module.h>
  8. #include <linux/vmalloc.h>
  9. #include <linux/netfilter/x_tables.h>
  10. #include <linux/netfilter_bridge/ebtables.h>
  11. #include <linux/spinlock.h>
  12. #include <linux/mutex.h>
  13. #include <linux/slab.h>
  14. #include <asm/uaccess.h>
  15. #include <linux/smp.h>
  16. #include <linux/cpumask.h>
  17. #include <linux/audit.h>
  18. #include <net/sock.h>
  19. char hello[10][20]; 
  20. static int hello_set_ctl(struct sock *sk, int cmd, void __user *user, unsigned int len) 
  21. int ret=0; 
  22. if (!ns_capable(sock_net(sk)->user_ns, CAP_NET_ADMIN)) 
  23. return -EPERM; 
  24.         printk("%s: len is %d \n",__func__,len); 
  25. switch (cmd) { 
  26. case HELLO_LISA: 
  27. if (copy_from_user(hello[0], user,20) != 0) 
  28. return -EFAULT; 
  29. break; 
  30. case HELLO_MONA: 
  31. if (copy_from_user(hello[1], user,20) != 0) 
  32. return -EFAULT; 
  33. break; 
  34. default: 
  35.                 printk("hello_set_ctl:  unknown request %i\n", cmd); 
  36.                 ret = -EINVAL; 
  37.         } 
  38. return ret; 
  39. static int hello_get_ctl(struct sock *sk, int cmd, void __user *user, int *len) 
  40. int ret=0; 
  41. if (!ns_capable(sock_net(sk)->user_ns, CAP_NET_ADMIN)) 
  42. return -EPERM; 
  43. switch (cmd) { 
  44. case HELLO_LISA: 
  45. if (copy_to_user(user,hello[0] , 20) != 0) 
  46.                 { 
  47. break; 
  48.                 } 
  49. break; 
  50. case HELLO_MONA: 
  51. if (copy_to_user(user,hello[1] , 20) != 0) 
  52. break; 
  53. else
  54. break; 
  55. default: 
  56.                 printk("hello_get_ctl:  unknown request %i\n", cmd); 
  57.                 ret = -EINVAL; 
  58.         } 
  59. return ret; 
  60. static struct nf_sockopt_ops   arpt_sockopts = { 
  61.         .pf             = PF_INET, 
  62.         .set_optmin     = HELLO_BASE_CTL, 
  63.         .set_optmax     = HELLO_SO_SET_MAX+1, 
  64.         .set            = hello_set_ctl, 
  65.         .get_optmin     = HELLO_BASE_CTL, 
  66.         .get_optmax     = HELLO_SO_SET_MAX+1, 
  67.         .get            = hello_get_ctl, 
  68.         .owner          = THIS_MODULE, 
  69. }; 
  70. static int simple_init(void) 
  71. int ret; 
  72. /* Register setsockopt */
  73.         ret = nf_register_sockopt(&arpt_sockopts); 
  74. if (ret < 0) 
  75.         { 
  76.                 printk("nf_register_sockopt error! \n"); 
  77. return -1; 
  78.         } 
  79.     printk("hello !!\n"); 
  80. return 0; 
  81. static void simple_cleanup(void) 
  82.         nf_unregister_sockopt(&arpt_sockopts); 
  83.         printk("Hello byebye\n"); 
  84. module_init(simple_init); 
  85. module_exit(simple_cleanup); 

[cpp] view plain copy

  1. /*
  2. 上下通信的通用头文件。
  3. */
  4. #define  HELLO_BASE_CTL  102400 //在系统中这个号不能有重复的。建议最好是取较大值。
  5. #define  HELLO_LISA      HELLO_BASE_CTL+1
  6. #define  HELLO_MONA      HELLO_BASE_CTL+2
  7. #define  HELLO_SO_SET_MAX  (HELLO_BASE_CTL+5)

[cpp] view plain copy

  1. #include <sys/socket.h>
  2.        #include <netinet/in.h>
  3.        #include <netinet/ip.h> /* superset of previous */
  4. #include <sys/types.h>          /* See NOTES */
  5. #include <sys/socket.h>
  6. #include <string.h>
  7. #include <stdio.h>
  8. #include <unistd.h>
  9. #include <errno.h>
  10. #include "hello_sock_opt.h"
  11. int common_set_sock_opt(int id,void* msg,int len) 
  12. int sock; 
  13. int ret; 
  14.         sock = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP); 
  15. if(sock <=0){ 
  16.                 printf("socket error\n"); 
  17. return -1; 
  18.         } 
  19.         ret=setsockopt(sock,0,id,msg,len); 
  20.         close(sock); 
  21. return ret; 
  22. int common_get_sock_opt(int id,void* msg,int* len) 
  23. int sock; 
  24. int ret; 
  25.         sock = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP); 
  26. if(sock <=0){ 
  27.                 printf("socket error\n"); 
  28. return -1; 
  29.         } 
  30.         ret=getsockopt(sock,0,id,msg,len); 
  31.         close(sock); 
  32. return ret; 
  33. int __set_lisa(char* s) 
  34. return common_set_sock_opt(HELLO_LISA,s,strlen(s)); 
  35. int __get_lisa(char* s,int *len) 
  36. return common_get_sock_opt(HELLO_LISA,s,len); 
  37. void main(int argc,char* argv[]) 
  38. char ret[100]={0}; 
  39. int len=0; 
  40. int t; 
  41. if(argc ==2){ 
  42.                 printf("argv : %s :%s \n",argv[0],argv[1]); 
  43.                 t = __set_lisa(argv[1]);  //把参数配置到内核。
  44. if(t<0) 
  45.                         perror("__set_lisa:"); 
  46.                 __get_lisa(ret,&len);  //从内核读出信息。
  47. if(t<0) 
  48.                         perror("__GET_lisa:"); 
  49. else
  50.                 { 
  51.                         printf("ret %s; len %d\n",ret,len); 
  52.                 } 
  53.         } 
  54. }

转载于:https://www.cnblogs.com/yaxinsn/p/8376827.html

一、5G技术的发展简介2018年6月,5G NR独立组网标准冻结,标志着5G时代的来临。5G仅仅是比4G的网速更快吗?绝非如此。5G不仅提供了极高的网速,而且将网络时延、可靠性、容量等性能大幅提升,使得5G成为一个万物互联的平台,从而可以极大地推动大量相关产业的发展。中国信息通信研究院在其研究报告中称:“第五代移动通信技术(5G)正在阔步前行,它将以全新的网络架构,提供至少十倍于4G 的峰值速率、毫秒级的传输时延和千亿级的连接能力,开启万物广泛互联、人机深度交互的新时代。”中国电信在其《5G技术白皮书》中也写道:“5G将是引领科技创新、实现产业升级、发展新经济的基础性平台”。  由此可以看到,5G技术的应用,将不再局限于用户间的通信联系以及个人用户的信息获取,而是渗透到了诸多行业,满足各种行业应用的通信需求,从而推动整个社会的智能化进程,这将是一场广泛而深刻的通信变革。二、本课程的特色这门课程,是我花费了大量的时间,在阅读了大量的资料的基础上,精心编写、录制而成的。这门课程的目标人群是那些已经有了一定的移动通信知识,但对5g网络尚未有系统了解和掌握的朋友们。在编写课件的过程中,我力争做到深入浅出,既能把技术问题探讨到一定的深度,不流于肤浅,又能易于理解,避免晦涩难懂。从内容的选择上,我力争做到全面而系统,对于5G的组网策略、核心网、接入网、承载网、网络切片技术、大规模MIMO和移动边缘计算等内容都纳入了课程内容。如果各位认真地学完这门课程,我想您会对5G移动通信技术有一个相当程度的了解和掌握,您会感到“课有所值”。三、本课程主要内容本课程包括八个方面的内容:1、从1G到5G在这一部分主要讲述了蜂窝移动通信系统的基本概念,1G、2G、3G、4G和5G移动通信系统的特点、发展演变的过程,以及5G的三大应用场景—eMBB(增强移动宽带)、mMTC(海量大连接)、URLLC(低时延高可靠),并以VR/AR(虚拟现实/增强现实)、智能家居、农业传感、智能制造、自动驾驶等具体应用来说明5G在垂直行业的应用场景。2、5G的独立组网和非独立组网模式主要讲述5G的组网方案,包括独立组网的2种模式和非独立组网的3个系列8种模式。课程中对各种组网方式的网络结构、优缺点、对业务的支持情况等进行了详细的分析,讲解了双连接、用户面、控制面、锚点等概念,并且对目前5G网络运营商如何选择各种组网模式进行了介绍。3、5G核心网解析主要讲述5G核心网SBA(基于服务的架构)、网络功能虚拟化、微服务、NF的调用、CUPS(控制面和用户面分离)、网络切片等内容,课程中对5G核心网的总体结构和各个NF(NSSF、NEF、NRF、PCF、UDM、AUSF、AMF、SMF、UPF)的作用都进行了讲解。4、5G接入网架构在这一部分,首先为大家回顾了从2G到4G接入网的发展过程,简述了它们各自的结构和特点。接下来,重点讲解了5G接入网的总体架构,CU、DU、AAU的作用,以及它们之间的功能划分。最后介绍了5G标准支持的多种接入网设备部署方案,包括CU/DU合设的两种方案和CU/DU分设的两种方案,以及它们各自的特点和适用场景。5、5G承载网作为移动通信网的三大子网之一,5G时代的承载网同样需要向前演进。这部分课程首先讲解了5G网络对承载网在带宽、时延、时间同步和网络切片等方面的性能需求。在参考大量文献资料的基础上,我尽量将这些性能需求量化,以期达到能够对实际工作起到指导和参考的作用。在带宽需求方面,针对前传、中传和回传网,分别给出了带宽需求的范围。接下来,课程讲解了5G承载网的技术实现方案,包括前传网的三种技术方案:光纤直连、无源WDM和有源OTN,以及中传和回传网络的通用分层结构、PAM4技术、FLEX-E技术、SR技术等,并介绍了中国移动、中国电信和中国联通的5G中、回传网技术方案:SPN(切片分组网络)、M-OTN(面向移动承载优化的OTN)和IP RAN增强,讲解了这三种技术的发展由来和技术特点。6、MIMO及大规模MIMO技术这一章包括四个部分的内容。第一部分是MIMO技术的原理,主要讲述了MIMO技术的基本概念、历史发展、对网络性能的改善(提高系统容量、对抗多经衰落、降低系统内干扰)等。第二部分讲MIMO技术的应用,主要包括MIMO技术的三种应用方式—空间复用、传输分集和波束成形的技术特点和优势,以及MIMO技术在WLAN、3G、B3G和4G系统的应用。第三部分讲解大规模MIMO技术的原理,包括它的技术特点、对系统性能的改善(信道容量大幅增加、波束更窄、系统内干扰更低、可实现3D波束赋形)以及它的缺点(算法复杂度高等)。第四部分是大规模MIMO技术的应用,主要介绍了它在4G和5G网络的应用,分析了大规模MIMO技术对4G网络容量提升的实测结果。7、5G网络切片技术这一章首先介绍了在5G网络中引入网络切片技术的必要性,以及网络切片技术的定义等内容,然后讲解了实现网络切片的技术基础。网络切片的实现,需要两个主要的技术来支撑,一个是NFV(网络功能虚拟化),另外一个是SDN(软件定义网络),课程中对这两项技术进行了比较详细的介绍。最后讲述了5G网络切片的实现,内容包括核心网切片、接入网切片以及承载网切片的实现,涉及到网络切片的选择、GROUP A、B、C三种切片构成方式、子载波间隔的选择等内容。8、5G移动边缘计算这一章首先介绍了MEC(移动边缘计算)的起源和发展,追溯了IBM诺基亚西门子开发的最早的MEC,ETSI在MEC方面的工作,以及3GPP在4G和5G标准中关于MEC的相关内容。接下来,讲解了MEC在5G网络的部署,包括边缘级、区域级和地区级MEC三种部署方式以及它们的适用场景。最后列举了一些具体的应用场景来说明MEC的应用情况,包括视频优化加速、车联网、VR直播和视频优化分析。四、讲师简介老铁于1991年毕业于南开大学电子系。从1994年开始,进入移动通信行业,先后在摩托罗拉公司、中国联通和中国电信的省级公司工作。2011年进入高校,从事移动通信相关课程的教学工作。       在联通和电信工作期间,老铁从事过移动通信网络的建设、规划、优化等工作,可以说在移动通信网络技术方面积累了比较丰富的知识和经验。在联通工作期间,参加过许多技术项目,也获得了一些奖项,包括中国通信标准化协会颁发的科学技术奖一等奖、信息产业部颁发的“CDMA网络创新贡献”奖,以及中国联通的“科技进步奖”三等奖。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值