POX 控制器 API (一)——基础篇

全网都找不到详尽的 API 介绍,自己试着从各处总结一些。

一种开始构建自己的 POX 模块的常用方法是将现有模块(例如 forwarding/l2_learning.py)复制到 ext 目录(例如 ext/my_component.py)。然后,可以修改新文件并将 POX 调用为 ./pox.py my_component

POX 有一个名为 “core” 的对象,它作为 POX 大部分 API 的核心。POX 中的许多模块都会希望访问 core 对象。一般通过导入 core 即可:

from pox.core import core

注册组件

core.register() 接受两个参数。第二个是我们想要在核心上注册的对象,第一个是我们给它起的名字。下例是一个非常简单的组件,它有一个 launch() 函数,注册后就可以通过 core 来调用 thing 里面的 foo 函数了:

class MyComponent (object):
  def __init__ (self, an_arg):
    self.arg = an_arg
    print "MyComponent instance registered with arg:", self.arg
 
  def foo (self):
    print "MyComponent with arg:", self.arg


def launch ():
  component = MyComponent("spam")
  core.register("thing", component)
  core.thing.foo()    # prints "MyComponent with arg: spam"

处理地址:pox.lib.addresses

POX 中的 IPv4、IPv6 和以太网地址由 pox.lib.addresses 的 IPAddr、IPAddr6 和 EthAddr 类表示。在某些情况下,其他地址格式可能有效(例如,点分四个数字的 IP 地址),但使用地址类应该始终有效。

例如,使用 IP 地址时:

from pox.lib.addresses import IPAddr, IPAddr6, EthAddr
 
ip = IPAddr("192.168.1.1")
print str(ip)    # Prints "192.168.1.1"
print ip.toUnsignedN()    # Convert to network-order unsigned integer -- 16885952
print ip.raw    # Returns a length-four bytes object (a four byte string, more or less)
 
ip = IPAddr(16885952, networkOrder=True)
print str(ip)    # Also prints "192.168.1.1" !

pox.lib.addresses 还包含各种实用工具函数,用于解析网络掩码、CIDR 表示法、检查IP是否在特定子网内,等等。

处理数据包:pox.lib.packet

POX 中的许多应用程序与数据包交互(例如,你可能希望构造数据包并将其发送出交换机,或者你可以通过 ofp_packet_in OpenFlow 消息从交换机接收数据包)。为此,POX 有一个用于解析和构造数据包的库。该库支持许多不同的数据包类型。

大多数数据包都有某种头部和某种有效载荷。有效载荷通常是另一种类型的包。例如在 POX 中,通常使用以太网数据包,这些数据包通常包含 ipv4 数据包(ipv4 数据包通常又包含 tcp 数据包......)。POX 支持的一些数据包类型是:

  • ethernet
  • ARP
  • IPv4
  • ICMP
  • TCP
  • UDP
  • DHCP
  • DNS
  • LLDP
  • VLAN

POX 中的所有数据包类都可以在 pox/lib/packet 中找到。可以简单地通过 import 导入:

import pox.lib.packet as pkt

可以通过两种方式解析封装的数据包:使用数据包对象的 payload 属性,或使用 find() 方法。例如,以下是使用 payload 属性解析 ICMP 消息的方法:

def parse_icmp (eth_packet):
    if eth_packet.type == pkt.IP_TYPE:
        ip_packet = eth_packet.payload
        src_ip = ip_packet.srcip    # 源 IP
        if ip_packet.protocol == pkt.ICMP_PROTOCOL:
            icmp_packet = ip_packet.payload
            icmp_code = icmp_packet.code    # ICMP sequence number
...

分组对象的 find() 方法可用于通过所需类型名称(例如 “icmp”)或其类(例如 pkt.ICMP)来查找特定的封装分组。如果数据包对象未封装所请求类型的数据包,则返回 None。 例如:

def handle_IP_packet (packet):
    ip = packet.find('ipv4')
    if ip is None:
        # This packet isn't IP!
        return
    print "Source IP:", ip.srcip

接下来介绍一些支持的数据包类型的一些有用的属性/方法/常量。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容

  • 目标 执行上面的命令,就能够播放谢安琪的音乐,当播放完一首,可以接下去播放下一首。 参考 在写这个项目的过程中,我...
    bigtom阅读 1,269评论 0 0
  • 看到这美丽的花,想到了自己,花到了季节就努力展现自己的,漂亮的花给人的感觉是心花怒放的!可是谁有想过,她的美丽是一...
    单只蜜蜂阅读 253评论 1 1