CEF (Cisco Express Forwarding)

Hi Alan,

The FIB is built based on information in the RIB.

In the RIB we install routes with the most longest match. When two routes are equal, it’s up to the administrative distance to select the route.

In your example, these three routes will also show up in the FIB.

Rene

1 Like

Hi Rene,

Thanks for the response and sorry for the late reply.

router# show ip route

D 192.168.32.0/26 [90/25789217] via 10.1.1.1
R 192.168.32.0/24 [120/4] via 10.1.1.2
O 192.168.32.0/19 [110/229840] via 10.1.1.3

As per mentioned by you, since the 3 routes will exists in the FIB - let’s say i have a packet to 192.168.32.3, with the longest match ( it will take the 192.168.32.0/24 route).

is this decision to take the longest matched route (192.168.32.0/24 via 10.1.1.2) done using the RIB table or the FIB ?

Regards,
Alan

Hi Alan,

In this example, the longest match will be your 192.168.32.0/26 route for 192.168.32.3 :slight_smile:

The decisions are made by the router, the best routes are installed in the routing table (RIB). The information from the RIB is then copied to the FIB so that forwarding can be done as fast as possible.

Rene

1 Like

Hi Rene,

Thanks for your reply.
Yeap i make a mistake, it should be 192.168.32.0/26.

However, i think you have misunderstood me.
What i meant is, since these 3 routes are all installed in the routing table (RIB) and copied to the FIB table; the router must still select 1 path to use (which is the longest match path - 192.168.32.0/26).

But this selection of the routes out of the 3 available, is done by the router using the RIB or the FIB table ?
Meaning

  1. does the router go to the routing table
    (see that there are 3 routes, and choose the longest match route)

  2. or the router go to the FIB table
    (see that there are 3 routes,entries and choose the longest match route)

Regards,
Alan

Hi Alan,
I believe I understand what you are asking. You are asking whether routing rules, such as “always choose the longest match” require processing at the RIB level or whether this can be done by the FIB. The answer is the FIB.

When CEF is functional, the RIB is simply a control plane mechanism that collects all the best routes from all the routing protocols (or static routes) on the router. A mirror image of all of these is copied to the FIB so that there is a one-to-one ratio between what’s in the RIB and the FIB. The goal of the FIB is to avoid interrupting the main CPU of the router as much as possible. Because of this, more simple decisions like “always use longest matching route” is processed by the FIB.

1 Like

Hi Andrew!,

Glad to see you around and yea! thanks for confirming my doubt.

I have a few more doubts that i have no where to turn to and i hope you will enlightened me…

My coreswitch has ip cef turn on my default.

q1) I have been reading up abit on cisco about IP CEF and it seems like to enable/disable IP CEF, you have to do in at the ingress interface as the decision (e.g. load balance is done there). – is it right ?

Assuming i have “no ip cef” and only wish to turn on ip cef on certain interfaces and ->
q2) if i want to do to packet loadbalancing, should “ip load-share per packet” command be issue on the ingress interface as well ?

q3) Reading How to Verify Cisco Express Forwarding -> “http://www.cisco.com/c/en/us/support/docs/ios-nx-os-software/ios-software-releases-120-mainline/47205-cef-whichpath.html

Use the show interface x/x stat command and determine the number of packets and bytes that the router forwarded through "Processor" instead of "Route cache." Note that "Route cache" includes both fast-switched and CEF-switched packets.
router#show interface stats     
FastEthernet0/0           
Switching path Pkts In  Chars In Pkts Out Chars Out 
Processor 95084 26211621 33493 3386174 
Route cache 24581 1132797 24542 13297583 
Distributed cache 0 0 0 0 
Total  119665 27344418 58035 16683757

Should this command be issue on the ingress or egress interface ?
if it is to be issue on the INGRESS interface -> What does the “Pkts Outs” under Route cache means then ?

Really hope to hear from you soon.

Regards,
Alan

Noticed a typo under the section where you explain the FIB table:

You wrote this 0.0.0.0 /4 instead of 224.0.0.0 /4 and 0.0.0.0 /24 instead 224.0.0.0 /24.

Thanks Shannon, it has been fixed.

Hi Rene, Andrew,

Can i check how to we really verify ip cef are really taking place ?

Following cisco documentation leads to nowhere, as it does not specify which interface (ingress or egress) should we monitor ?

router#show interface stats FastEthernet0/0 Switching path Pkts In Chars In Pkts Out Chars Out Processor 95084 26211621 33493 3386174 Route cache 24581 1132797 24542 13297583 Distributed cache 0 0 0 0 Total 119665 27344418 58035 16683757

On my ingress interface, i am seeing
24581 pkts in (under route-cache) and 24525 pkts out.

So what does it really means ( 24581 inbound packets are cef processed ? - what about the outbound ?)

Really hope someone could shed some light on this.

Regards,
Alan

Thanks Rene!

Hi Alan,

That command does show the number of CEF processed packets:

R1#show interfaces stats                 
GigabitEthernet0/0
          Switching path    Pkts In   Chars In   Pkts Out  Chars Out
               Processor     227073   41570717     668663  108107547
             Route cache       1062     370522          0          0
                   Total     228135   41941239     668663  108107547

Route cache contains both fast-switched and CEF switched packets. You can see incoming and outgoing packets.

Rene

19 posts were merged into an existing topic: CEF (Cisco Express Forwarding)

Hi Rene,

I got one ASR1001X and would like to check what is the maximum IPV4 FIB route can handle and the maximum memory for FIB. when i show cef memory, result as below. I can’t find how much the total memory for the FIB or the maximum IPV4 route can handle. It just show allocated but not show the total. How i can check it?

Below is the show cef memory with 500K IPV4 route in FIB

ASR1001X#show cef memory
  Memory                          in use/allocated         Count
  ------------------------------------------------------------------
  ADJ: GSB                  :       1552/1736       ( 89%) [2]
  ADJ: NULL adjacency       :        436/528        ( 82%) [1]
  ADJ: adj sev context      :        232/416        ( 55%) [2]
  ADJ: adjacency            :      12224/12776      ( 95%) [6]
  ADJ: mcprp_adj_inject_sb  :      16588/16680      ( 99%) [1]
  ADJ: request resolve      :       4688/4872       ( 96%) [2]
  ADJ: sevs                 :        432/616        ( 70%) [2]
  CEF: Brkr Updat           :      10040/10776      ( 93%) [8]
  CEF: Brkr Update Rec      :        328/512        ( 64%) [2]
  CEF: Brkr zone            :       1448/3288       ( 44%) [20]
  CEF: Broker               :       7168/9008       ( 79%) [20]
  CEF: Brokers Array        :        308/400        ( 77%) [1]
  CEF: EVENT msg chunks     :        332/424        ( 78%) [1]
  CEF: FIB LC array         :        452/544        ( 83%) [1]
  CEF: FIB subtree context  :        416/968        ( 42%) [6]
  CEF: FIBHWIDB             :       7556/9672       ( 78%) [23]
  CEF: FIBIDB               :      15112/17688      ( 85%) [28]
  CEF: IPv4 ARP throttle    :       2052/2144       ( 95%) [1]
  CEF: IPv4 process         :        980/1256       ( 78%) [3]
  CEF: IPv6 FIB subblock    :        712/896        ( 79%) [2]
  CEF: OCE get hash callbac :         52/144        ( 36%) [1]
  CEF: Protocol Discard sub :       2364/4480       ( 52%) [23]
  CEF: TABLE msg chunks     :        804/896        ( 89%) [1]
  CEF: Table rate Monitor S :        352/720        ( 48%) [4]
  CEF: arp throttle chunk   :      28168/28352      ( 99%) [2]
  CEF: cover need           :       1864/2232       ( 83%) [4]
  CEF: cover need deagg chu :        344/528        ( 65%) [2]
  CEF: dQ elems             :        360/544        ( 66%) [2]
  CEF: dQ walks             :        480/664        ( 72%) [2]
  CEF: fib                  :  158091136/158520960  ( 99%) [4672]
  CEF: fib GSB              :      23612/24072      ( 98%) [5]
  CEF: fib deps             :        368/552        ( 66%) [2]
  CEF: fib loop sb          :        344/528        ( 65%) [2]
  CEF: fib_fib_co           :        672/856        ( 78%) [2]
  CEF: fib_fib_covered chun :        368/552        ( 66%) [2]
  CEF: fib_fib_rp_bfd_sb    :       2728/2912       ( 93%) [2]
  CEF: fib_fib_sr           :       5248/6536       ( 80%) [14]
  CEF: fib_fib_src_adj_sb   :        376/560        ( 67%) [2]
  CEF: fib_fib_src_adj_sb_a :        320/504        ( 63%) [2]
  CEF: fib_fib_src_interfac :        432/616        ( 70%) [2]
  CEF: fib_fib_src_mcast_sb :        376/560        ( 67%) [2]
  CEF: fib_fib_src_rr_sb    :        376/560        ( 67%) [2]
  CEF: fib_fib_src_special_ :        344/528        ( 65%) [2]
  CEF: fib_head_s           :        720/904        ( 79%) [2]
  CEF: fib_head_sb chunk    :        376/560        ( 67%) [2]
  CEF: fib_member           :       2528/2896       ( 87%) [4]
  CEF: fib_member_sb chunk  :        368/552        ( 66%) [2]
  CEF: fib_rib_route_update :       5200/5384       ( 96%) [2]
  CEF: fib_table_fibswsb_de :        592/776        ( 76%) [2]
  CEF: fibhwidb table       :    1048580/1048672    ( 99%) [1]
  CEF: fibidb plist dq it   :        544/728        ( 74%) [2]
  CEF: fibidb table         :    1048580/1048672    ( 99%) [1]
  CEF: fibswsb ct           :      11696/12064      ( 96%) [4]
  CEF: fibswsb ctl          :       1680/1864       ( 90%) [2]
  CEF: hash table           :     262152/262336     ( 99%) [2]
  CEF: ipv6 feature error c :       7564/7656       ( 98%) [1]
  CEF: ipv6 feature error s :       7564/7656       ( 98%) [1]
  CEF: ipv6 not cef switche :       1276/1368       ( 93%) [1]
  CEF: ipv6 not cef switche :       1276/1368       ( 93%) [1]
  CEF: loadinf16            :        928/1112       ( 83%) [2]
  CEF: loadinfo2            :        432/616        ( 70%) [2]
  CEF: mpls long path exts  :        488/672        ( 72%) [2]
  CEF: mpls path exts       :        368/552        ( 66%) [2]
  CEF: nh entry context     :        344/528        ( 65%) [2]
  CEF: nh entry params      :        360/544        ( 66%) [2]
  CEF: non_ip entry context :        432/616        ( 70%) [2]
  CEF: pathl                :      12848/13584      ( 94%) [8]
  CEF: pathl ifs            :       2160/2712       ( 79%) [6]
  CEF: pathl its            :        648/832        ( 77%) [2]
  CEF: pathloutputchain     :        792/976        ( 81%) [2]
  CEF: paths                :      13656/14392      ( 94%) [8]
  CEF: plist dq it          :        488/672        ( 72%) [2]
  CEF: prefix query msg chu :       2692/2784       ( 96%) [1]
  CEF: subtree context      :       2232/3336       ( 66%) [12]
  CEF: table                :       1736/2104       ( 82%) [4]
  CEF: table GSB            :       1080/1264       ( 85%) [2]
  CEF: table walks          :        432/616        ( 70%) [2]
  CEF: terminal fibs list   :        128/312        ( 41%) [2]
  CEF: test fib entry sbs   :        472/656        ( 71%) [2]
  CEF: up event c           :        784/968        ( 80%) [2]
  CEF: up event chunk       :        232/416        ( 55%) [2]
  CEF: v6 nd discard thrott :       4100/4192       ( 97%) [1]
  CEF: v6 nd throttle chunk :      19368/19552      ( 99%) [2]
  CEF: vrf                  :       2272/2456       ( 92%) [2]
  COLL: coll rec            :        368/552        ( 66%) [2]
  TAL: MTRIE n08            :   46892072/47022896   ( 99%) [1422]
  TAL: control block        :        520/888        ( 58%) [4]
  TAL: item list elem       :        232/416        ( 55%) [2]
  TAL: mtrie control block  :       3560/3744       ( 95%) [2]
  TAL: rtree aux            :        448/816        ( 54%) [4]
  TAL: rtree control block  :        312/680        ( 45%) [4]
  TAL: rtree node           :       1936/2120       ( 91%) [2]
  TAL: rtree nodes          :        848/1032       ( 82%) [2]
  TAL: tree control         :        448/1000       ( 44%) [6]
  ------------------------------------------------------------------
  Totals                    :  207615456/208208120  ( 99%) [6442]

When i disable the BGP peering and leave 41 route in FIB. the result show as below

ASR1001X#show cef fib
41 allocated IPv4 entries, 0 failed allocations
13 allocated IPv6 entries, 0 failed allocations
ASR1001X#  show cef memory
  Memory                          in use/allocated         Count
  ------------------------------------------------------------------
  ADJ: GSB                  :       1552/1736       ( 89%) [2]
  ADJ: NULL adjacency       :        436/528        ( 82%) [1]
  ADJ: adj sev context      :        232/416        ( 55%) [2]
  ADJ: adjacency            :      12224/12776      ( 95%) [6]
  ADJ: mcprp_adj_inject_sb  :      16588/16680      ( 99%) [1]
  ADJ: request resolve      :       4688/4872       ( 96%) [2]
  ADJ: sevs                 :        432/616        ( 70%) [2]
  CEF: Brkr Updat           :      10040/10776      ( 93%) [8]
  CEF: Brkr Update Rec      :        328/512        ( 64%) [2]
  CEF: Brkr zone            :       1448/3288       ( 44%) [20]
  CEF: Broker               :       7168/9008       ( 79%) [20]
  CEF: Brokers Array        :        308/400        ( 77%) [1]
  CEF: EVENT msg chunks     :        332/424        ( 78%) [1]
  CEF: FIB LC array         :        452/544        ( 83%) [1]
  CEF: FIB subtree context  :        416/968        ( 42%) [6]
  CEF: FIBHWIDB             :       7556/9672       ( 78%) [23]
  CEF: FIBIDB               :      15112/17688      ( 85%) [28]
  Memory                          in use/allocated         Count
  ------------------------------------------------------------------

  CEF: IPv4 ARP throttle    :       2052/2144       ( 95%) [1]
  CEF: IPv4 process         :        980/1256       ( 78%) [3]
  CEF: IPv6 FIB subblock    :        712/896        ( 79%) [2]
  CEF: OCE get hash callbac :         52/144        ( 36%) [1]
  CEF: Protocol Discard sub :       2364/4480       ( 52%) [23]
  CEF: TABLE msg chunks     :        804/896        ( 89%) [1]
  CEF: Table rate Monitor S :        352/720        ( 48%) [4]
  CEF: arp throttle chunk   :      28168/28352      ( 99%) [2]
  CEF: cover need           :       1864/2232       ( 83%) [4]
  CEF: cover need deagg chu :        344/528        ( 65%) [2]
  CEF: dQ elems             :        360/544        ( 66%) [2]
  CEF: dQ walks             :        480/664        ( 72%) [2]
  CEF: fib                  :     500048/501888     ( 99%) [20]
  CEF: fib GSB              :      23612/24072      ( 98%) [5]
  CEF: fib deps             :        368/552        ( 66%) [2]
  CEF: fib loop sb          :        344/528        ( 65%) [2]
  CEF: fib_fib_co           :        672/856        ( 78%) [2]
  CEF: fib_fib_covered chun :        368/552        ( 66%) [2]
  CEF: fib_fib_rp_bfd_sb    :       2728/2912       ( 93%) [2]
  Memory                          in use/allocated         Count
  ------------------------------------------------------------------

  CEF: fib_fib_sr           :       5248/6536       ( 80%) [14]
  CEF: fib_fib_src_adj_sb   :        376/560        ( 67%) [2]
  CEF: fib_fib_src_adj_sb_a :        320/504        ( 63%) [2]
  CEF: fib_fib_src_interfac :        432/616        ( 70%) [2]
  CEF: fib_fib_src_mcast_sb :        376/560        ( 67%) [2]
  CEF: fib_fib_src_rr_sb    :        376/560        ( 67%) [2]
  CEF: fib_fib_src_special_ :        344/528        ( 65%) [2]
  CEF: fib_head_s           :        720/904        ( 79%) [2]
  CEF: fib_head_sb chunk    :        376/560        ( 67%) [2]
  CEF: fib_member           :       2528/2896       ( 87%) [4]
  CEF: fib_member_sb chunk  :        368/552        ( 66%) [2]
  CEF: fib_rib_route_update :       5200/5384       ( 96%) [2]
  CEF: fib_table_fibswsb_de :        592/776        ( 76%) [2]
  CEF: fibhwidb table       :    1048580/1048672    ( 99%) [1]
  CEF: fibidb plist dq it   :        544/728        ( 74%) [2]
  CEF: fibidb table         :    1048580/1048672    ( 99%) [1]
  CEF: fibswsb ct           :      11696/12064      ( 96%) [4]
  CEF: fibswsb ctl          :       1680/1864       ( 90%) [2]
  CEF: hash table           :     262152/262336     ( 99%) [2]
  Memory                          in use/allocated         Count
  ------------------------------------------------------------------

  CEF: ipv6 feature error c :       7564/7656       ( 98%) [1]
  CEF: ipv6 feature error s :       7564/7656       ( 98%) [1]
  CEF: ipv6 not cef switche :       1276/1368       ( 93%) [1]
  CEF: ipv6 not cef switche :       1276/1368       ( 93%) [1]
  CEF: loadinf16            :        928/1112       ( 83%) [2]
  CEF: loadinfo2            :        432/616        ( 70%) [2]
  CEF: mpls long path exts  :        488/672        ( 72%) [2]
  CEF: mpls path exts       :        368/552        ( 66%) [2]
  CEF: nh entry context     :        344/528        ( 65%) [2]
  CEF: nh entry params      :        360/544        ( 66%) [2]
  CEF: non_ip entry context :        432/616        ( 70%) [2]
  CEF: pathl                :      12848/13584      ( 94%) [8]
  CEF: pathl ifs            :       2160/2712       ( 79%) [6]
  CEF: pathl its            :        648/832        ( 77%) [2]
  CEF: pathloutputchain     :        792/976        ( 81%) [2]
  CEF: paths                :      13656/14392      ( 94%) [8]
  CEF: plist dq it          :        488/672        ( 72%) [2]
  CEF: prefix query msg chu :       2692/2784       ( 96%) [1]
  CEF: subtree context      :       2232/3336       ( 66%) [12]
  Memory                          in use/allocated         Count
  ------------------------------------------------------------------

  CEF: table                :       1736/2104       ( 82%) [4]
  CEF: table GSB            :       1080/1264       ( 85%) [2]
  CEF: table walks          :        432/616        ( 70%) [2]
  CEF: terminal fibs list   :         76/168        ( 45%) [1]
  CEF: test fib entry sbs   :        472/656        ( 71%) [2]
  CEF: up event c           :        784/968        ( 80%) [2]
  CEF: up event chunk       :        232/416        ( 55%) [2]
  CEF: v6 nd discard thrott :       4100/4192       ( 97%) [1]
  CEF: v6 nd throttle chunk :      19368/19552      ( 99%) [2]
  CEF: vrf                  :       2272/2456       ( 92%) [2]
  COLL: coll rec            :        368/552        ( 66%) [2]
  TAL: MTRIE n08            :      65952/66136      ( 99%) [2]
  TAL: control block        :        520/888        ( 58%) [4]
  TAL: item list elem       :        232/416        ( 55%) [2]
  TAL: mtrie control block  :       3560/3744       ( 95%) [2]
  TAL: rtree aux            :        448/816        ( 54%) [4]
  TAL: rtree control block  :        312/680        ( 45%) [4]
  TAL: rtree node           :       1936/2120       ( 91%) [2]
  TAL: rtree nodes          :        848/1032       ( 82%) [2]
  Memory                          in use/allocated         Count
  ------------------------------------------------------------------

  TAL: tree control         :        448/1000       ( 44%) [6]
  ------------------------------------------------------------------
  Totals                    :    3198196/3232144    ( 98%) [369]

Davis

Hlw Rene,

Its Amazing. I have a questions that All route of RIB table will be install in FIB table??

br//
zaman

Dear Rene,

I have one more questions…

How can I check that my router process & forward packet using CEF table . I have read the reply (May 16, 2016 at 21:04) but cann’t undersatnd on it. Please help me to breakdown it .My Router shows Route Catch is Zero…

Router-1#show interfaces stats 

                   
GigabitEthernet0/0/3
          Switching path    Pkts In   Chars In   Pkts Out  Chars Out
               Processor    2611585  221761348     574206   34967664
             Route cache          0          0          0          0
       Distributed cache 4659753014024 361667274043438 4823679979355 373666593999284
                   Total 4659755625609 361667495804786 4823680553561 373666628966948
GigabitEthernet0/0/4
          Switching path    Pkts In   Chars In   Pkts Out  Chars Out
               Processor      33260   15899224      31536    2407464
             Route cache          0          0          0          0
       Distributed cache 4789487303687 371034834722617 4659408834513 361522748851756
                   Total 4789487336947 371034850621841 4659408866049 361522751259220

br//
zaman

@Davis show cef memory tells us how everything is allocated but it doesn’t really tell us how much memory CEF can use. I compared your two outputs, these are the lines that changed:

Before:

CEF: fib                  :  158091136/158520960  ( 99%) [4672]
CEF: terminal fibs list   :        128/312        ( 41%) [2]
TAL: MTRIE n08            :   46892072/47022896   ( 99%) [1422]

After:

CEF: fib                  :     500048/501888     ( 99%) [20]
CEF: terminal fibs list   :         76/168        ( 45%) [1]
TAL: MTRIE n08            :      65952/66136      ( 99%) [2]

So it tells us how much has been allocated but not much what kind of limits we have. There’s a couple of things you can try. I’m not sure if show sdm prefer works on IOS XE but you can try it:

SW1#show sdm prefer 
 The current template is "desktop default" template.
 The selected template optimizes the resources in
 the switch to support this level of features for
 8 routed interfaces and 1024 VLANs. 

  number of unicast mac addresses:                  6K
  number of IPv4 IGMP groups + multicast routes:    1K
  number of IPv4 unicast routes:                    8K
    number of directly-connected IPv4 hosts:        6K
    number of indirect IPv4 routes:                 2K
  number of IPv4 policy based routing aces:         0
  number of IPv4/MAC qos aces:                      0.5K
  number of IPv4/MAC security aces:                 1K

The other two commands that might tell you something are:

show platform hardware qfp active tcam resource-manager usage
show platform hardware qfp active infra exmem statistics user

I only have a virtual IOS XE router here so I can’t try all of these :slight_smile:

@Zaman by default, all routers from the RIB will be installed in the FIB for fast forwarding. Take a look at this output:

Router-1#show interfaces stats 
                   
GigabitEthernet0/0/3
          Switching path    Pkts In   Chars In   Pkts Out  Chars Out
               Processor    2611585  221761348     574206   34967664
             Route cache          0          0          0          0
       Distributed cache 4659753014024 361667274043438 4823679979355 373666593999284
                   Total 4659755625609 361667495804786 4823680553561 373666628966948

The distributed cache line shows the packets that have been received/forwarded by CEF:

  • 4659753014024 packets have been received by CEF.
  • 4823679979355 packets have been forwarded by CEF.
  • 2611585 packets have been received by the processor. These are probably packets from routing protocols etc.
  • 574206 packets have been forwarded by the processor. This could be any "management" traffic...stuff like OSPF, EIGRP, etc.

Rene

Ok. Thanks Rene.

Davis

Hi Rene,Andrew,Laz,

I have two questions :-
1 - In which memory arp table is saved ( CAM or TCAM ) ?
2 - What are the meaning of epoch & dependencies ?

Thanks,
Hussein Samir

  1. The ARP table is stored in RAM, and not in either CAM or TCAM

  2. Here is the Cisco definition of Epoch and how it is used:

The term "epoch" refers to a period of time. A new epoch for a Cisco Express Forwarding table begins when a table rebuild is initiated. The time after this instant is in an epoch different from the time before, and the different epochs are numbered between 0 and 255. Through the use of epochs, the software can distinguish between old and new forwarding information in the same database structure and can retain the old Cisco Express Forwarding database table while the software builds a new table. This is called epoch tracking and it allows Cisco Express Forwarding forwarding to continue uninterrupted while new Cisco Express Forwarding tables are being constructed, and it makes possible a seamless switchover when the new table becomes active

When you issue a show ip cef <route>, the dependencies output means how many other routes depend (are resolvable through) the <route> you looked up via the CEF command.

1 Like

Hi Rene,
Yet again you take the stress out of cisco technology. I find myself ALWAYS falling back on your site for concise, simple, clear and extremely well explained material. You’ve done it again with CEF. THANK YOU &… KEEP UP THE EXCELLENT WORK

Seamus